AWS API Gateway:如何实现持续交付?
Posted
技术标签:
【中文标题】AWS API Gateway:如何实现持续交付?【英文标题】:AWS API Gateway: How to achieve continuous delivery? 【发布时间】:2017-11-16 07:05:19 【问题描述】:我正在使用 AWS API Gateway 和 AWS Lambda 构建 API。我想实现这个 API 的持续交付。我选择这样做的路径是通过 AWS CodePipeline 使用 CloudFormation。我已经设法将它用于另一个使用 Lambdas(没有 API 网关)的项目,它运行良好,使用起来非常愉快。
我在部署时面临的问题是 Lambda 已正确更新,但 API 定义未正确更新。据我了解,AWS::ApiGateway::Deployment 是不可变资源,这意味着对于 API 的每次部署,我都需要创建一个新的 AWS::ApiGateway::Deployment 资源。这根本不切实际,因为对于每个 AWS::ApiGateway::Deployment 我都有一个新的调用 URL。这是不可接受的,因为我必须将我的 DNS 记录更改为新部署的 API 调用 URL,或者要求我们的 API 用户更改其应用程序中的 URL。
我希望能够更改 API 定义和 Lambdas 实现,而无需我的 API 用户更改其应用程序中的任何内容。
我怎样才能实现这种行为?
我创建了一个教程来突出我的问题。您可以在以下位置找到它:https://github.com/JonathanGailliez/aws-api-gateway-lambda-example
【问题讨论】:
【参考方案1】:我可以通过使用 troposphere 和 Python 中的 boto3 api 生成的 CloudFormation 模板来实现这一点,如下所示:
-
将模板分成两部分
API 定义、方法、IAM 角色、ApiKey 和 Lambda (a)
部署、UsagePlan 和 UsagePlanKey (b)
更改后的 Lambda 代码会被压缩并使用 boto3 api 上传到 S3
堆栈 (b) 已删除
堆栈 (a) 已更新为连接到 lambda 的 GET 方法的新资源 ID
重新创建堆栈 (b)
步骤 3、4、5 使用 CloudFormation boto3 api 执行,并阻塞直到完成。
最重要的是,在所有步骤完成后,ApiKey 值和阶段调用 URL保持不变,运行更新的 Lambda 代码,如使用 curl 测试的那样。
注意:在 CloudFormation 更新完成后,API 可能需要额外的 30-60 秒才能完全发挥作用。
【讨论】:
【参考方案2】:根据:https://forums.aws.amazon.com/thread.jspa?messageID=789869󀵭
乔伊-aws 说:
我们目前正在推出一个解决方案 解决了这个确切的问题。与此同时,一个常见的解决方法 将更新一些小的东西,例如“描述”字段 然后可以用来“触发” API Gateway 部署 更新 CloudFormation 堆栈。
一旦推出,我将更新此答案和示例 repo。
【讨论】:
【参考方案3】:您可以从命令行或 AWS 控制台运行 Cloudformation 更新。这将更改 API 定义和任何 lambda 代码,而无需更改唯一 ID 以访问您的网关。
另一种选择是将您的 API 放在自定义域名后面,然后您可以继续部署新的 API 或阶段,并在您准备好后切换自定义域映射。用户不会识别出任何变化。
【讨论】:
嗨,布赖恩,感谢您的建议。 AWS 正在为此特定问题制定解决方案。我会等待他们推出解决方案。【参考方案4】:实现这一目标的一种方法是利用现有框架,例如
-
AWS SAM
Serverless
Claudia
【讨论】:
嗨 Shimon,感谢您的这些建议。我会看看这些如何改进我到目前为止所做的事情。与此同时,AWS 正在努力解决我的问题中强调的问题。以上是关于AWS API Gateway:如何实现持续交付?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Cognito 用户 ID 限制访问 AWS API Gateway 端点
如果在 Terraform 模块中创建了 aws_api_gateway_integration,如何在 aws_api_gateway_deployment 资源上填充depends_on?
如何使用 AWS CloudFormation 在 AWS API Gateway 集成中指定阶段变量?
如何使用 AWS CloudFormation 在 AWS API Gateway 上应用安全策略?