Канареечный релиз функции Cloud Functions
Создайте канареечный релиз функции Cloud Functions с помощью API Gateway.
Чтобы создать канареечный релиз:
- Подготовьте облако к работе.
- Создайте сервисный аккаунт.
- Создайте функцию Cloud Functions.
- Добавьте теги.
- Создайте API-шлюз.
- Протестируйте приложение.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость ресурсов поддержки веб-приложения входят:
- Плата за количество запросов к API-шлюзу и исходящий трафик (см. тарифы Yandex API Gateway).
- Плата за количество вызовов функции, вычислительные ресурсы, выделенные для выполнения функции, и исходящий трафик (см. тарифы Yandex Cloud Functions).
Создайте сервисный аккаунт
- В консоли управления
выберите каталог, в котором хотите создать сервисный аккаунт. - В списке сервисов выберите Identity and Access Management.
- Нажмите кнопку Создать сервисный аккаунт.
- Введите имя сервисного аккаунта:
canary-sa
. - Нажмите Добавить роль и выберите роль
editor
. - Нажмите кнопку Создать.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
-
Создайте сервисный аккаунт
canary-sa
:yc iam service-account create --name canary-sa
Результат:
id: nfersamh4sjq******** folder_id: b1gc1t4cb638******** created_at: "2023-09-21T10:36:29.726397755Z" name: canary-sa
Сохраните идентификатор сервисного аккаунта
canary-sa
(id
) и каталога, в котором его создали (folder_id
). -
Назначьте сервисному аккаунту роль
editor
на каталог:yc resource-manager folder add-access-binding <идентификатор_каталога> \ --role editor \ --subject serviceAccount:<идентификатор_сервисного_аккаунта>
Результат:
done (1s)
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
-
Опишите в конфигурационном файле параметры сервисного аккаунта:
resource "yandex_iam_service_account" "canary-sa" { name = "canary-sa" folder_id = "<идентификатор_каталога>" } resource "yandex_resourcemanager_folder_iam_member" "editor" { folder_id = "<идентификатор_каталога>" role = "editor" member = "serviceAccount:${yandex_iam_service_account.canary-sa id}" }
Где:
name
— имя сервисного аккаунта. Обязательный параметр.folder_id
— идентификатор каталога. Необязательный параметр. По умолчанию будет использовано значение, указанное в настройках провайдера.role
— назначаемая роль.
Более подробную информацию о параметрах ресурса
yandex_iam_service_account
в Terraform, см. в документации провайдера . -
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится информация о сервисном аккаунте. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply
-
Подтвердите создание сервисного аккаунта: введите в терминал слово
yes
и нажмите Enter.После этого будет создан сервисный аккаунт. Проверить появление сервисного аккаунта можно в консоли управления
или с помощью команды CLI:yc iam service-account list
-
Чтобы создать сервисный аккаунт, воспользуйтесь методом create для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/Create.
Чтобы назначить сервисному аккаунту роль editor
на каталог, воспользуйтесь методом setAccessBindings для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/SetAccessBindings.
Создайте функцию Cloud Functions
- версию для текущего релиза;
- версию для канареечного релиза, которая будет тестироваться на некоторой доле запросов.
Вы можете использовать собственную функцию или создать любую функцию из списка.
Добавьте теги
Первой версии функции добавьте тег stable
, второй — canary
.
Чтобы добавить тег версии, выполните команду:
yc serverless function version set-tag --id <идентификатор_версии> --tag <тег>
Результат:
id: b09ch6pmpohf********
function_id: b097d9ous3ge********
created_at: "2023-08-22T09:12:38.464Z"
runtime: python311
entrypoint: test.handler
resources:
memory: "134217728"
execution_timeout: 5s
image_size: "4096"
status: ACTIVE
tags:
- $latest
- stable
Чтобы добавить тег версии:
-
В конфигурационном файле добавьте блок
tags
для ресурсаyandex_function
и укажите список тегов форматеtags = ["<имя_тега>"]
.Пример описания функции в конфигурации Terraform:
resource "yandex_function" "test-function" { name = "canary-function" user_hash = "canary-function" runtime = "python311" entrypoint = "main" memory = "128" execution_timeout = "10" service_account_id = "<идентификатор_сервисного_аккаунта>" tags = ["my_tag"] content { zip_filename = "<путь_к_ZIP-архиву>" } }
Более подробную информацию о параметрах ресурса
yandex_function
см. в документации провайдера . -
Проверьте конфигурацию командой:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминал слово
yes
и нажмите Enter.
Проверить, что теги появились, можно в консоли управления
yc serverless function version list --function-name <имя_функции>
Чтобы добавить тег версии функции, воспользуйтесь методом REST API setTag для ресурса Function или вызовом gRPC API FunctionService/SetTag.
Создайте API-шлюз
-
В консоли управления
выберите каталог, в котором хотите создать API-шлюз. -
В списке сервисов выберите API Gateway.
-
Нажмите кнопку Создать API-шлюз.
-
В поле Имя введите
canary
. -
В блок Спецификация добавьте спецификацию:
openapi: 3.0.0 info: title: Sample API version: 1.0.0 x-yc-apigateway: variables: function.tag: default: "stable" enum: - "stable" - "canary" paths: /: get: x-yc-apigateway-integration: type: cloud_functions function_id: <идентификатор_функции> tag: "${var.function.tag}" service_account_id: <идентификатор_сервисного_аккаунта>
-
В разделе Управление переменными активируйте переключатель Канареечный релиз.
-
В поле Доля запросов в канареечном релизе укажите
50
. -
В поле Переменные для канареечного релиза укажите
function.tag
=canary
. -
Нажмите кнопку Создать.
-
Сохраните следующую спецификацию в файл
spec.yaml
:openapi: 3.0.0 info: title: Sample API version: 1.0.0 x-yc-apigateway: variables: function.tag: default: "stable" enum: - "stable" - "canary" paths: /: get: x-yc-apigateway-integration: type: cloud_functions function_id: <идентификатор_функции> tag: "${var.function.tag}" service_account_id: <идентификатор_сервисного_аккаунта>
-
Выполните команду:
yc serverless api-gateway create --name canary --spec=spec.yaml --canary-weight=50 --canary-variables function.tag=canary
Где:
--name
— имя API-шлюза.--spec
— файл со спецификацией.--canary-weight
— доля запросов в канареечном релизе.--canary-variables
— переменные для канареечного релиза.
Результат:
done (5s) id: d5d1ud9bli1e******** folder_id: b1gc1t4cb638******** created_at: "2023-09-25T16:01:48.926Z" name: canary status: ACTIVE domain: d5dm1lba80md********.i9******.apigw.yandexcloud.net log_group_id: ckgefpleo5eg******** connectivity: {} log_options: folder_id: b1gc1t4cb638******** canary: weight: "50" variables: function.tag: string_value: canary
Чтобы создать API-шлюз:
-
Опишите в конфигурационном файле параметры ресурса
yandex_api_gateway
:resource "yandex_api_gateway" "canary-api-gateway" { name = "canary" canary { weight = 50 variables = { function.tag = "canary" } } spec = <<-EOT openapi: 3.0.0 info: title: Sample API version: 1.0.0 x-yc-apigateway: variables: function.tag: default: "stable" enum: - "stable" - "canary" paths: /: get: x-yc-apigateway-integration: type: cloud_functions function_id: <идентификатор_функции> tag: "${var.function.tag}" service_account_id: <идентификатор_сервисного_аккаунта> EOT }
Где:
-
name
— имя API-шлюза. Формат имени:- длина — от 3 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
-
canary.0.weight
— доля запросов в канареечном релизе. -
canary.0.variables
— переменные для канареечного релиза. -
spec
— спецификация API-шлюза.
Более подробную информацию о параметрах ресурсов в Terraform см. в документации провайдера
. -
-
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply
-
Подтвердите создание ресурсов: введите в терминал слово
yes
и нажмите Enter.После этого в указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
или с помощью команд CLI:yc serverless api-gateway get <имя_API-шлюза>
-
Чтобы создать API-шлюз, воспользуйтесь методом REST API create для ресурса ApiGateway или вызовом gRPC API ApiGatewayService/Create.
Проверьте работу приложения
Сделайте несколько запросов к созданному API-шлюзу. Около половины запросов должны быть обработаны версией функции с тегом canary
.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы: