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 или этапа и переключить настраиваемое сопоставление доменов, когда вы будете готовы. Пользователи не узнают никаких изменений.
Одним из способов достижения этого является использование существующих структур, таких как
Я смог добиться этого, используя шаблон CloudFormation, созданный тропосферой и boto3 api в Python следующим образом:
- Разделите шаблон на две части
- Определение API, метод (ы), роли IAM, ApiKey и Lambda (a)
- Развертывание, UsagePlan и UsagePlanKey (b)
- После изменения Lambda-код архивируется и загружается в S3 с помощью boto3 api
- Стек (b) удален
- Стек (a) обновляется новым идентификатором ресурса для метода GET, подключенного к лямбда
- Стек (b) создается заново
Шаги 3, 4, 5 выполняются с использованием CloudFormation boto3 api с блокировкой до завершения.
Самое главное, что после того, как все шаги выполнены, значение ApiKey и URL-адрес вызова этапа остаются неизменными, выполняется обновленный код Lambda, проверенный с помощью curl.
Примечание. После завершения обновления CloudFormation, чтобы API стал полностью работоспособным, может потребоваться еще 30–60 секунд.