Рубрики
Без рубрики

Запустите функцию шага AWS с помощью API REST API Gateway REST с использованием CDK

Обращение для связывания API API API API API API с шагом с использованием CDK Amazon. Tagged с помощью AWS, InfrastructuReAscode, CDK, Python.

Документация AWS может быть грубой. Вы когда -нибудь искали пример того, что вы пытаетесь настроить, но найти только кусочки того, что вам нужно на нескольких разных сайтах? Это был мой опыт недавно, когда я пытался настроить API REST с API -шлюзом, который запустил бы функцию шага.

Есть несколько хороших учебных пособий и примеров для этого, только в консоли AWS. А как насчет инфраструктуры как код гиков? Там не так много. Итак, этот учебник. В нем вы узнаете, как использовать CDK, чтобы настроить следующее:

  • API REST API Gateway REST, который принимает один параметр
  • Роль IAM, которая позволяет API подключаться к вашей функции шага
  • Интеграция API Gateway для подключения вашего API к функции шага, передавая параметр

Этот урок предназначен для текущих пользователей CDK, которые ищут примеры подключения сервисов AWS, таких как функции Step к API, установленным в CDK. В то время как он использует Python CDK, перевод в TypeScript или другие языки должно быть тривиальным.

🚨 Предупреждение: 🚨 Развертывание в AWS может нести обвинения. Чтобы этого не произошло, разрушили любые развернутые ресурсы с CDK уничтожить .

Определите функцию шага

Определите функцию шага, как обычно. Для этой статьи давайте предположим, что вы создали шаг -функцию под названием item_step_function Анкет

Создайте API

Используйте aws_cdk.aws_apigateway S Restapi Конструктор для создания базового объекта API. Вы будете использовать это для всей дальнейшей настройки API:

from aws_cdk import (
    core,
    aws_apigateway as apigateway,
    aws_iam as iam,
    aws_stepfunctions as sfn,
)
import json

item_step_function = sfn.StateMachine([...])
item_api = apigateway.RestApi(self, "item-api")

🚨 Предупреждение 🚨 Этот пример кода не выполняет никакой дополнительной авторизации, помимо того, что делается AWS по умолчанию. Вы можете добавить дополнительные меры безопасности для производственной нагрузки.

Настройка роли

Чем раньше вы установили разрешения IAM, тем лучше. Правильные разрешения IAM позволят вашему API запустить функцию вашего шага. Вы будете использовать Роль конструкция в aws_iam пакет для этого.

Во -первых, вы создадите создание Роль, Дайте ему имя и выберите услугу, которая его предполагает. Поскольку вы хотите, чтобы API Gateway имел доступ к функциям шага, вы будете использовать "apigateway.amazonaws.com" :

item_api_role = iam.Role(
    self,
    f"item-api-role",
    role_name=f"item-api-role",
    assumed_by=iam.ServicePrincipal("apigateway.amazonaws.com"),
)

После того, как это будет настроено, вам нужно будет добавить политику в роль, которая определяет разрешения, которые роль предоставляет услуге, которая его предполагает. AWS IAM предоставляет несколько управляемых политик, которые охватывают большинство вариантов использования, поэтому вряд ли вам нужно будет создавать свои собственные. Для этого руководства вы будете использовать управляемую политику AWSStepfunctionsfullaccess, но в большинстве случаев вы захотите использовать более ограничительную управляемую или построенную политику.

item_api_role.add_managed_policy(
    iam.ManagedPolicy.from_aws_managed_policy_name("AWSStepFunctionsFullAccess")
)

С этими двумя вызовами вы создали роль с политикой, которая позволит вашему API взаимодействовать с вашей функцией шага. Вам все равно нужно будет связаться с этой ролью с самим API, но это произойдет позже.

Установите ресурсы

Ресурсы-это любые пути на основе пути вашего запроса URI. Пока вы можете гнездовать ресурсы, используя .add_resource () Метод, вы добавите один уровень ресурса для этого урока. Чтобы использовать ресурс в качестве параметра, окружите имя вашего параметра вьющимися скобками. Обратите внимание, что вы должны добавить его в корень объекта API:

step_function_trigger_resource = item_api.root.add_resource("{item_id}")

Ваш запрос URI будет выглядеть примерно [https://aws-generated-tld.com/1337ø(https://aws-generated-tld.com/1337) где 1337 это item_id Анкет

🚨 Примечание 🚨 Вы также можете настроить параметр строки запроса, если хотите. Для этого урока мы будем придерживаться параметров, основанных на пути.

Подключите свой API к функции шага

CDK предоставляет Awsintegration Конструкция, которая должна облегчить интеграцию с другими службами AWS. Это не. По крайней мере, не сам по себе.

Awsintegration Construct трудно использовать, потому что реализации для разных служб недокументированы. Вы можете даже не знать внутреннее имя службы для функций шага или любую другую службу, которую вы хотите интегрировать, и испытывать трудности с его поиском. (Если вы это сделаете, AWS CLI здесь, чтобы помочь: AWS-списки-сервисы ).

Запрос шаблонов

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

Шаблон является словарем и должен иметь единый ключ из "Приложение/json" Анкет Его ценность – JONOFIED Dictionary с ARN и Вход , который является частью Шаг функция StartExecution Синтаксис запроса . Вы будете использовать некоторые методы, встроенные в запрос от Amazon, в частности $ input.params () , что Позволяет получить некоторые или все параметры вашего запроса .

Я настоятельно рекомендую вам избежать любого JavaScript, завернув ваш $ input.params () звоните с $ util.escapejavascript () : "$ util.escapejavascript ($ input.params ('item_id')) " .

Ваш шаблон должен выглядеть так:

request_template = {
    "application/json": json.dumps(
        {
            "stateMachineArn": item_state_machine.state_machine_arn,
            "input": "{\"item_id\": \"$util.escapeJavaScript($input.params('item_id'))\"}",
        }
    )
}

Интеграция функции шага

Далее вы определите саму интеграцию. Интеграция требует, чтобы вы установили несколько параметров, но из документов CDK не всегда ясно. Эта двусмысленность благодаря тому, насколько общим Awsintegration Construct есть: он позволяет использовать любую услугу, но вы должны знать, какие параметры необходимы их запросам.

Для всех интеграций вам необходимо предоставить имя услуги. Для пошаговых функций это "Государства" Анкет Тогда вам нужно предложить действие, которое вы хотите сделать. Чтобы запустить выполнение функции шага, вы будете использовать "StartExecution" Анкет Это снова определяется API службы, и вы можете прочитать больше о "StartExecution" В документации функции AWS шаг Анкет

Затем вы предоставите варианты. В CDK это IntegrationOptions . Здесь вы можете определить много вариантов, но для этого урока важные:

  • Credentials_Role : Это займет item_api_role Вы настроили ранее, прикрепляя роль (и ее прикрепленную политику) к самому API через интеграцию.
  • Integration_Responses : Это список возможных ответов на запросы API. По крайней мере, вы захотите вернуть IntegrationResponse Объект с кодом статуса 200, но вы можете определить все виды ситуаций, которые будут вызывать различные коды статуса.
  • request_templates : Здесь вы прикрепите шаблон запроса, который вы сделали в предварительном

Изучите эти варианты и определите, какие варианты подходят для вашего варианта использования. Чтобы все было просто, этот пример будет передавать учетные данные через интеграцию в интегрированную службу и вернет только 200 ответа:

item_sfn_integration = apigateway.AwsIntegration(
    service="states",
    action="StartExecution",
    options=apigateway.IntegrationOptions(
        credentials_role=item_api_role,
        integration_responses=[
            apigateway.IntegrationResponse(status_code="200")
        ],
        request_templates=request_template,
    ),
)

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

Подключить интеграцию к глаголам отдыха

Вы помните ресурс Вы настроили ранее, определяя item_id параметр для API? Этот объект поставляется с add_method () функция, которую вы можете использовать для подключения глагола покоя (например, get , Пост , Положить , и т.д.) к вашей интеграции. Это позволит запрос с использованием правильного глагола для достижения вашей интеграции.

Поскольку вы отправляете данные через API, вы используете СООБЩЕНИЕ и подключить его к item_sfn_integration вот так:

step_function_trigger_resource.add_method(
    "POST",
    item_sfn_integration,
    method_responses=[apigateway.MethodResponse(status_code="200")],
)

Здесь вы подключили свою интеграцию к своему Step_function_trigger_resource через Пост глагол, и вы установите его, чтобы ответить 200 статус ответа. Как и интеграция, вы можете установить несколько статусов ответа метода.

Тестирование и завершение

Чтобы проверить это, развернуть с CDK Deploy <местоположение> , Откройте API Gateway Console и перейдите к вашему API и остальным глаголу, который вы настроили. Просто нажмите Тест Добавьте свой параметр и проверьте выход. Вы также можете перейти к консоли функций шага и проверить свое выполнение.

Что дальше?

Теперь, когда вы научились подключить API в соответствии с шагом функции, вы можете сделать несколько вещей, чтобы погрузиться глубже. Вот несколько предложений:

  • Измените параметр своего пути на строку запроса. Как это меняет то, как вы настраиваете API и интеграцию службы?
  • Сделайте более сложный API. Многочисленные ресурсы и многочисленные уровни ресурсов. Можете ли вы имитировать структуру публичного API, как Reddit’s ?

Полный пример

from aws_cdk import (
    core,
    aws_apigateway as apigateway,
    aws_iam as iam,
    aws_stepfunctions as sfn,
)
import json

item_step_function = sfn.StateMachine([...])

# Initialize the API
item_api = apigateway.RestApi(self, "item-api")

# Set up IAM role and policy
item_api_role = iam.Role(
    self,
    f"item-api-role",
    role_name=f"item-api-role",
    assumed_by=iam.ServicePrincipal("apigateway.amazonaws.com"),
)
item_api_role.add_managed_policy(
    iam.ManagedPolicy.from_aws_managed_policy_name("AWSStepFunctionsFullAccess")
)

# Set up API resources
step_function_trigger_resource = item_api.root.add_resource("{item_id}")

# Set up request template and integration
request_template = {
    "application/json": json.dumps(
        {
            "stateMachineArn": item_state_machine.state_machine_arn,
            "input": "{\"item_id\": \"$util.escapeJavaScript($input.params('item_id'))\"}",
        }
    )
}
item_sfn_integration = apigateway.AwsIntegration(
    service="states",
    action="StartExecution",
    options=apigateway.IntegrationOptions(
        credentials_role=item_api_role,
        integration_responses=[
            apigateway.IntegrationResponse(status_code="200")
        ],
        request_templates=request_template,
    ),
)

# Connect integrations to REST verbs
step_function_trigger_resource.add_method(
    "POST",
    item_sfn_integration,
    method_responses=[apigateway.MethodResponse(status_code="200")],
)

Оригинал: “https://dev.to/kyle_stratis/trigger-an-aws-step-function-with-an-api-gateway-rest-api-using-cdk-1nb3”