AWS API Gateway: как добиться непрерывной доставки?

Я создаю API, используя AWS API Gateway и AWS Lambda. Я хотел бы добиться непрерывной доставки для этого API. Путь, который я выбрал, это использовать CloudFormation через AWS CodePipeline. Мне удалось сделать это для другого проекта, использующего Lambdas (без API Gateway), он отлично работает и им действительно приятно пользоваться.

Проблема, с которой я сталкиваюсь при развертывании, заключается в том, что Lambdas корректно обновляются, но не в определении API. Из того, что я понимаю, AWS::ApiGateway::Deployment являются неизменными ресурсами, что означает, что для каждого развертывания API мне нужно создать новый ресурс AWS::ApiGateway::Deployment. Это вообще не практично, потому что для каждого из этих AWS::ApiGateway::Deployment у меня есть новый URL-адрес Invoke. Это неприемлемо, поскольку мне придется либо изменить свою DNS-запись на вновь развернутый URL-адрес для вызова API, либо попросить наших пользователей API изменить URL-адрес в своих приложениях.

Я хотел бы иметь возможность изменять определение API и реализации Lambdas без необходимости что-либо менять в своих приложениях моим пользователям API.

Как я могу добиться этого поведения?

Я создал учебник, чтобы осветить мою проблему. Вы можете найти его по адресу: https://github.com/JonathanGailliez/aws-api-gateway-lambda-example

3 ответа

Решение

Согласно: https://forums.aws.amazon.com/thread.jspa?messageID=789869&;

Джои-Авс говорит:

В настоящее время мы находимся в процессе развертывания решения, которое решает именно эту проблему. Между тем, обычным обходным решением будет обновить что-то маленькое, например поле "описание", которое затем можно будет использовать для "запуска" развертывания шлюза API при обновлении стека CloudFormation.

Я обновлю этот ответ и пример репо, как только он будет выпущен.

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

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

Одним из способов достижения этого является использование существующих структур, таких как

  1. AWS SAM
  2. Serverless
  3. Клаудиа

Я смог добиться этого, используя шаблон CloudFormation, созданный тропосферой и boto3 api в Python следующим образом:

  1. Разделите шаблон на две части
    • Определение API, метод (ы), роли IAM, ApiKey и Lambda (a)
    • Развертывание, UsagePlan и UsagePlanKey (b)
  2. После изменения Lambda-код архивируется и загружается в S3 с помощью boto3 api
  3. Стек (b) удален
  4. Стек (a) обновляется новым идентификатором ресурса для метода GET, подключенного к лямбда
  5. Стек (b) создается заново

Шаги 3, 4, 5 выполняются с использованием CloudFormation boto3 api с блокировкой до завершения.

Самое главное, что после того, как все шаги выполнены, значение ApiKey и URL-адрес вызова этапа остаются неизменными, выполняется обновленный код Lambda, проверенный с помощью curl.

Примечание. После завершения обновления CloudFormation, чтобы API стал полностью работоспособным, может потребоваться еще 30–60 секунд.