Начало работы с API Gateway
В этой инструкции вы создадите и протестируете работу разных типов расширений: сначала вы сконфигурируете API-шлюз для получения статического ответа, а затем добавите интеграцию для вызова функции. Для обращения к API-шлюзу потребуется curl
Перед началом работы
Чтобы начать работать в Yandex Cloud:
- Войдите в консоль управления
. Если вы еще не зарегистрированы, перейдите в консоль управления и следуйте инструкциям. - На странице Биллинг
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе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-шлюза. Формат имени:- длина — от 3 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
-
description
— описание API-шлюза. -
labels
— метки для API-шлюза. Укажите пару ключ-значение. -
spec
— спецификация API-шлюза.
Пример структуры конфигурационного файла:
resource "yandex_api_gateway" "test-api-gateway" { name = "<имя_API-шлюза>" description = "<описание_API-шлюза>" labels = { label = "label" empty-label = "" } 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********.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********.apigw.yandexcloud.net/numbers
Результат:
[0, 1, 2]