Hello, World!
Это пример простой функции на Go, которая принимает параметр name и возвращает строку Hello, <name>!.
package main
import (
"context"
"fmt"
"io"
"log/slog"
"net/http"
"os"
)
func Handler(rw http.ResponseWriter, req *http.Request) {
logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
AddSource: true,
Level: slog.LevelDebug,
}))
// Simple usage
logger.Info("hello", "count", 3)
logger.Warn("warn message")
logger.Error("error message", "key", "value")
// With context
ctx := context.WithValue(req.Context(), "requestID", "12345")
logger.DebugContext(ctx, "debug message")
rw.Header().Set("X-Custom-Header", "Test")
rw.WriteHeader(200)
name := req.URL.Query().Get("name")
_, _ = io.WriteString(rw, fmt.Sprintf("Hello, %s!", name))
}
Развертывание
Для развертывания этой функции в Yandex Cloud вы можете воспользоваться Terraform описанным в примере.
Для этого мы сначала определяем ресурс archive_file для создания zip-архива с функцией.
resource "archive_file" "function_files" {
output_path = "./function.zip"
source_dir = "../function"
type = "zip"
}
А затем ресурс yandex_function для создания функции в Yandex Cloud, куда передаем zip-архив с функцией.
resource "yandex_function" "hello_function" {
name = "hello-world"
user_hash = archive_file.function_files.output_sha256
runtime = "golang123"
entrypoint = "index.Handler"
memory = "128"
execution_timeout = "10"
content {
zip_filename = 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:
curl "https://functions.yandexcloud.net/$FUNCTION_ID?name=test" \
-H "Content-Type: application/json"
В ответ мы получим строку Hello, test!