Перейти к основному содержимому

Hello, World!

Это пример простой функции на TypeScript, которая принимает параметр name и возвращает строку Hello, name!.

import {Http} from '@yandex-cloud/function-types/dist/src/http';

// The handler function is an asynchronous function that handles HTTP events.
// It takes a Http.Event object as a parameter and returns a Promise that resolves to a Http.Result object.
export async function handler(event: Http.Event): Promise<Http.Result> {

// Return a Http.Result object with a status code of 200, custom headers, and a body.
return {
statusCode: 200,
headers: {
'X-Custom-Header': 'Test',
},
body: `Hello, ${event.queryStringParameters.name}!`
};

}

Развертывание

Для развертывания этой функции в Yandex Cloud вы можете воспользоваться Terraform описанным в примере.

Сперва нам нужно скомпилировать функцию в JavaScript. Для этого мы можем использлвать null_resource и local-exec провиженер.

resource "null_resource" "build_typescript" {
provisioner "local-exec" {
command = "cd ../function && npm run build"
}
triggers = {
always_run = timestamp()
}
}

Чтобы компиляция выполнялась каждый раз заново задан триггер allways_run и в значение ему передается время. В принципе можно передавать хеш от файлов исходного кода, тогда триггер будет срабатывать только при изменении исходного кода.

Для этого мы сначала определяем ресурс archive_file для создания zip-архива с функцией.

data "archive_file" "function_files" {
output_path = "./function.zip"
source_dir = "../dist"
type = "zip"
depends_on = [
null_resource.build_typescript
]
}

А затем ресурс yandex_function для создания функции в Yandex Cloud, куда передаем zip-архив с функцией.

resource "yandex_function" "hello_function" {
name = "hello-world"
user_hash = data.archive_file.function_files.output_sha256
runtime = "nodejs18"
entrypoint = "main.handler"
memory = "128"
execution_timeout = "10"
content {
zip_filename = data.archive_file.function_files.output_path
}
}

И в конце, если мы хотим сделать функцию доступной из интернета, мы можем создать ресурс yandex_function_iam_binding что бы разрешить доступ к функции всем пользователям, тем самым сделав ее публичной.

resource "yandex_function_iam_binding" "test_function_binding" {
function_id = yandex_function.hello_function.id
role = "functions.functionInvoker"
members = ["system:allUsers"]
}

Запуск

Теперь, когда функция развернута, мы можем вызвать ее с помощью curl:

FUNCTION_ID=$(terraform output -raw function_id)
curl "https://functions.yandexcloud.net/$FUNCTION_ID?name=test" \
-H "Content-Type: application/json"

В ответ мы получим строку Hello, test!