AWS API Gateway:如何实现持续交付?

时间:2017-06-14 08:33:07

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

我正在使用AWS API Gateway和AWS Lambda构建API。我想为此API实现持续交付。我选择的方法是通过AWS CodePipeline使用CloudFormation。我已经设法使用Lambdas(没有API网关)进行另一个项目,它运行良好,使用起来非常愉快。

我在部署时面临的问题是Lambda已正确更新,但未正确更新。据我所知,AWS :: ApiGateway :: Deployment是不可变资源,这意味着对于API的每个部署,我需要创建一个新的AWS :: ApiGateway :: Deployment资源。这根本不实用,因为对于每个AWS :: ApiGateway :: Deployment,我都有一个新的Invoke URL。这是不可接受的,因为我必须将我的DNS记录更改为新部署的API调用URL,或要求我们的API用户更改其应用程序中的URL。

我想要的是能够更改API定义和Lambdas实现,而我的API用户不必更改其应用程序中的任何内容。

我该如何实现这种行为?

我创建了一个教程来突出我的问题。您可以在https://github.com/JonathanGailliez/aws-api-gateway-lambda-example

找到它

4 个答案:

答案 0 :(得分:2)

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

joey-aws说:

  

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

我会在推出后更新这个答案和示例回购。

答案 1 :(得分:0)

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

  1. AWS SAM
  2. Serverless
  3. Claudia

答案 2 :(得分:0)

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

另一个选项是将您的API置于自定义域名后面,然后您可以继续部署新的API或阶段,并在准备好时切换自定义域映射。用户不会认识到任何变化。

答案 3 :(得分:0)

我能够使用Python中的对流层和boto3 api生成的CloudFormation模板来实现此目标,如下所示:

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

第3、4、5步是使用CloudFormation boto3 api进行阻止的,直到完成。

最重要的是,在完成所有步骤之后,ApiKey值和阶段Invoke URL 保持不变,并运行经更新的Lambda代码,并进行了curl测试。

注意:完成CloudFormation更新后,API可能需要30到60秒的时间才能完全发挥作用。