【问题标题】:AWS API Gateway: How to achieve continuous delivery?AWS API Gateway:如何实现持续交付?
【发布时间】: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

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-api-gateway amazon-cloudformation aws-codepipeline


    【解决方案1】:

    我可以通过使用 troposphere 和 Python 中的 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 秒才能完全发挥作用。

    【讨论】:

      【解决方案2】:

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

      乔伊-aws 说:

      我们目前正在推出一个解决方案 解决了这个确切的问题。与此同时,一个常见的解决方法 将更新一些小的东西,例如“描述”字段 然后可以用来“触发” API Gateway 部署 更新 CloudFormation 堆栈。

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 嗨,布赖恩,感谢您的建议。 AWS 正在为此特定问题制定解决方案。我会等待他们推出解决方案。
        【解决方案4】:

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

        1. AWS SAM
        2. Serverless
        3. Claudia

        【讨论】:

        • 嗨 Shimon,感谢您的这些建议。我会看看这些如何改进我到目前为止所做的事情。与此同时,AWS 正在努力解决我的问题中强调的问题。
        猜你喜欢
        • 1970-01-01
        • 2016-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-05
        • 2016-05-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多