Начало работы с API Gateway
В этой инструкции вы создадите и протестируете работу разных типов расширений: сначала вы сконфигурируете API-шлюз для получения статического ответа, а затем добавите интеграцию для вызова функции. Для обращения к API-шлюзу потребуется curl
Перед началом работы
Чтобы начать работать в Yandex Cloud:
- Войдите в консоль управления
. Если вы еще не зарегистрированы, перейдите в консоль управления и следуйте инструкциям. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVEилиTRIAL_ACTIVE. Если платежного аккаунта нет, создайте его. - Если у вас еще нет каталога, создайте его.
Создайте API-шлюз
-
В консоли управления
выберите каталог, в котором необходимо создать API-шлюз. -
Перейдите в сервис API Gateway.
-
Нажмите кнопку Создать API-шлюз.
-
В поле Имя введите
numbers. -
(Опционально) В поле Описание введите описание.
-
В поле Таймаут обработки запроса задайте таймаут обработки запроса. Значение не должно превышать установленный лимит.
-
В блок Спецификация добавьте спецификацию:
openapi: "3.0.0" info: version: 1.0.0 title: Test API paths: /hello: get: summary: Say hello operationId: hello parameters: - name: user in: query description: User name to appear in greetings required: false schema: type: string default: 'world' responses: '200': description: Greeting content: 'text/plain': schema: type: "string" x-yc-apigateway-integration: type: dummy http_code: 200 http_headers: 'Content-Type': "text/plain" content: 'text/plain': "Hello, {user}!\n" -
Нажмите кнопку Создать.
Terraform
Terraform распространяется под лицензией Business Source License
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
Чтобы создать API-шлюз:
-
Опишите в конфигурационном файле параметры ресурса
yandex_api_gateway:-
name— имя API-шлюза. Формат имени:- длина — от 2 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
-
description— описание API-шлюза. -
labels— метки для API-шлюза. Укажите пару ключ-значение. -
execution_timeout— таймаут обработки запроса. Значение задается в секундах и не должно превышать установленный лимит. Необязательный параметр. Значение по умолчанию –300сек. -
spec— спецификация API-шлюза.
Пример структуры конфигурационного файла:
resource "yandex_api_gateway" "test-api-gateway" { name = "<имя_API-шлюза>" description = "<описание_API-шлюза>" labels = { label = "label" empty-label = "" } execution_timeout = "<таймаут_обработки_запроса>" spec = <<-EOT openapi: "3.0.0" info: version: 1.0.0 title: Test API paths: /hello: get: summary: Say hello operationId: hello parameters: - name: user in: query description: User name to appear in greetings required: false schema: type: string default: 'world' responses: '200': description: Greeting content: 'text/plain': schema: type: "string" x-yc-apigateway-integration: type: dummy http_code: 200 http_headers: 'Content-Type': "text/plain" content: 'text/plain': "Hello, {user}!\n" EOT }Более подробную информацию о параметрах ресурсов в Terraform см. в документации провайдера.
-
-
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply -
Подтвердите создание ресурсов: введите в терминал слово
yesи нажмите Enter.После этого в указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
или с помощью команд CLI:yc serverless api-gateway get <имя_API-шлюза>
-
Обратитесь к API-шлюзу
-
В консоли управления
выберите каталог, в котором находится API-шлюз. -
Перейдите в сервис API Gateway и нажмите на созданный API-шлюз.
-
Сохраните значение поля Служебный домен.
-
Установите утилиту curl
. -
Обратитесь к API-шлюзу с помощью curl, используя одну из команд:
-
curl <служебный_домен>/hello?user=API -
curl <служебный_домен>/hello
Где
<служебный_домен>— значение поля Служебный домен, сохраненное ранее.Например:
curl https://d5dm1lba80md********.i9******.apigw.yandexcloud.net/hello?user=APIРезультат:
-
Hello, API! -
Hello, world!
-
Добавьте интеграцию с функцией
Создайте функцию
Создайте функцию для получения списка чисел. Подробнее о функциях читайте в документации Yandex Cloud Functions.
Чтобы создать функцию:
- Создайте функцию:
- В консоли управления
выберите каталог, в котором будет создана функция. - Нажмите кнопку Создать ресурс.
- Выберите Функция.
- В поле Имя введите
list. - Нажмите кнопку Создать.
- В консоли управления
- Создайте версию функции:
-
Выберите среду выполнения
nodejs18. -
Выключите опцию Добавить файлы с примерами кода.
-
Нажмите кнопку Продолжить.
-
В поле Способ выберите
Редактор кода. -
Ниже в редакторе нажмите кнопку Создать файл.
- В открывшемся окне введите имя файла
index.js. - Нажмите кнопку Создать.
- В открывшемся окне введите имя файла
-
Вставьте следующий код в файл
index.js:module.exports.handler = async (event) => { return { "statusCode": 200, "headers": {"content-type": "application/json"}, "body": "[0, 1, 2]" }; }; -
В поле Точка входа введите
index.handler. -
Нажмите кнопку Сохранить изменения.
-
- Сделайте функцию публичной.
Чтобы создать функцию:
-
Подготовьте ZIP-архив с кодом функции:
-
Сохраните следующий код в файл с названием index.js:
module.exports.handler = async (event) => { return { "statusCode": 200, "headers": {"content-type": "application/json"}, "body": "[0, 1, 2]" }; }; -
Добавьте файл
index.jsв ZIP-архивhello-js.zip.
-
-
Опишите в конфигурационном файле параметры ресурса
yandex_function:resource "yandex_function" "test-function" { name = "test-function" description = "Test function" user_hash = "first-function" runtime = "nodejs18" entrypoint = "index.handler" memory = "128" execution_timeout = "10" service_account_id = "<идентификатор_сервисного_аккаунта>" tags = ["my_tag"] content { zip_filename = "<путь_к_ZIP-архиву>" } }Где:
name— имя функции.description— текстовое описание функции.user_hash— произвольная строка, определяющая версию функции. При изменениях функции необходимо менять и эту строку. Функция обновится при изменении этой строки.runtime— среда выполнения функции.entrypoint— имя функции в исходном коде, которая будет служить точкой входа в приложения.memory— объем памяти в мегабайтах, отведенный для выполнения функции.execution_timeout— таймаут выполнения функции.service_account_id— идентификатор сервисного аккаунта, от имени которого будет запускаться функция.tags— теги функции.content— исходный код функции.content.0.zip_filename— путь к ZIP-архиву, содержащему исходный код функции.
Более подробную информацию о параметрах ресурса
yandex_functionсм. в документации провайдера. -
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply -
Подтвердите создание ресурсов: введите в терминал слово
yesи нажмите Enter.После этого в указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
или с помощью команд CLI:yc serverless function list
-
Расширьте спецификацию API-шлюза
Добавьте в спецификацию API-шлюза информацию о функции.
Чтобы обновить спецификацию API-шлюза:
-
В консоли управления
выберите каталог, в котором необходимо обновить API-шлюз. -
В открывшемся окне выберите API-шлюз и нажмите кнопку
. -
В открывшемся меню нажмите кнопку Редактировать.
-
В блок Спецификация добавьте расширенную версию спецификации.
Добавлен метод
/numbers, который с помощью расширенияx-yc-apigateway-integrationтипаcloud_functionsвызывает функцию по идентификатору.Чтобы API-шлюз корректно отработал, в параметре
function_idукажите идентификатор функции, которую хотите вызывать. Чтобы API-шлюз смог обратиться к приватной функции, в параметреservice_account_idукажите сервисный аккаунт с правами на вызов функции.openapi: "3.0.0" info: version: 1.0.0 title: Test API paths: /hello: get: summary: Say hello operationId: hello parameters: - name: user in: query description: User name to appear in greetings required: false schema: type: string default: 'world' responses: '200': description: Greeting content: 'text/plain': schema: type: "string" x-yc-apigateway-integration: type: dummy http_code: 200 http_headers: 'Content-Type': "text/plain" content: 'text/plain': "Hello, {user}!\n" /numbers: get: summary: List some numbers operationId: listNumbers responses: '200': description: Another example content: 'application/json': schema: type: "array" items: type: "integer" x-yc-apigateway-integration: type: cloud_functions function_id: <идентификатор_функции> service_account_id: <идентификатор_сервисного_аккаунта>
Чтобы добавить в спецификацию API-шлюза информацию о функции:
-
Откройте файл конфигурации Terraform и добавьте метод
/numbers, который с помощью расширенияx-yc-apigateway-integrationтипаcloud_functionsвызывает функцию по идентификатору. В блокеspecизмените спецификацию api-шлюза, указав следующие параметры:function_id— идентификатор функции.service_account_id— идентификатор сервисного аккаунта с правами на вызов функции.
Расширенная спецификация API-шлюза:
... spec = <<-EOT openapi: "3.0.0" info: version: 1.0.0 title: Test API paths: /hello: get: summary: Say hello operationId: hello parameters: - name: user in: query description: User name to appear in greetings. required: false schema: type: string default: 'world' responses: '200': description: Greeting content: 'text/plain': schema: type: "string" x-yc-apigateway-integration: type: dummy http_code: 200 http_headers: 'Content-Type': "text/plain" content: 'text/plain': "Hello again, {user}!\n" /numbers: get: summary: List some numbers operationId: listNumbers responses: '200': description: Another example. content: 'application/json': schema: type: "array" items: type: "integer" x-yc-apigateway-integration: type: cloud_functions function_id: <идентификатор_функции> service_account_id: <идентификатор_сервисного_аккаунта> EOT }Более подробную информацию о параметрах ресурсов в Terraform см. в документации провайдера.
-
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply -
Подтвердите создание ресурсов: введите в терминал слово
yesи нажмите Enter.После этого в указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
или с помощью команд CLI:yc serverless api-gateway get <имя_API-шлюза>
-
Обратитесь к функции через API-шлюз
Примечание
Чтобы API-шлюз смог обратиться к функции, сделайте ее публичной или укажите в спецификации сервисный аккаунт, у которого есть права на вызов функции.
Обратитесь к API-шлюзу:
curl <служебный_домен>/numbers
Где <служебный_домен> — значение поля Служебный домен, сохраненное ранее.
Например:
curl https://d5dm1lba80md********.i9******.apigw.yandexcloud.net/numbers
Результат:
[0, 1, 2]