3

我正在使用 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

4

4 回答 4

2

根据:https ://forums.aws.amazon.com/thread.jspa?messageID=789869൭

乔伊-aws 说:

我们目前正在推出解决这个确切问题的解决方案。同时,一种常见的解决方法是更新一些小的内容,例如“描述”字段,然后在更新 CloudFormation 堆栈时可以使用该字段“触发”API 网关部署。

一旦推出,我将更新此答案和示例回购。

于 2017-06-16T09:15:52.040 回答
1

您可以从命令行或 AWS 控制台运行 Cloudformation 更新。这将更改 API 定义和任何 lambda 代码,而无需更改唯一 id 来访问您的网关。

另一种选择是将您的 API 放在自定义域名后面,然后您可以继续部署新的 API 或阶段,并在准备好后切换自定义域映射。用户不会识别出任何变化。

于 2017-06-14T15:08:42.253 回答
0

我可以通过在 Python 中使用 troposphere 和 boto3 api 生成的 CloudFormation 模板来实现这一点,如下所示:

  1. 将模板分成两部分
    • API 定义、方法、IAM 角色、ApiKey 和 Lambda (a)
    • 部署、UsagePlan 和 UsagePlanKey (b)
  2. 更改后的 Lambda 代码会被压缩并使用 boto3 api 上传到 S3
  3. 堆栈 (b) 被删除
  4. 堆栈 (a) 使用连接到 lambda 的 GET 方法的新资源 ID 进行更新
  5. 堆栈 (b) 被重新创建

步骤 3、4、5 使用 CloudFormation boto3 api 执行,并阻塞直到完成。

最重要的是,在所有步骤完成后,ApiKey 值和阶段调用 URL保持不变,运行更新的 Lambda 代码,如使用 curl 测试。

注意:在 CloudFormation 更新完成后,API 可能需要额外的 30-60 秒才能完全发挥作用。

于 2019-07-18T02:59:45.663 回答
0

实现这一目标的一种方法是利用现有的框架,如

  1. AWS SAM
  2. 无服务器
  3. 克劳迪娅
于 2017-06-14T08:48:47.197 回答