如何让 Cloud Formation 创建变更集来更新我的 Lambda 函数?

How do I get Cloud Formation to create a changeset to update my Lambda functions?

我有一个 Lambda 函数,我已经验证它可以正常工作。我可以使用 "update-function-code" 在命令行上手动更新函数,但我一直在尝试让它与 Code Pipeline 和 Cloud Formation 一起工作。 以下是我目前的步骤:

  1. 来源 - 从 github 获取代码。这工作正常。
  2. 构建 - 在 Solano(第 3 方 CI)中测试代码。这也有效,在最后阶段它压缩了 repo 并将其上传到我的 S3 存储桶。
  3. 部署 - 这是具有操作模式 "create or replace a change set" 的 "deploy" 操作类别。如果 Lambda 函数已经存在,这将不起作用。
  4. Beta - 执行变更集。如果更改集生成正确,这将起作用。

我的 samTemplate.yml 看起来像这样:

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: My Lambda function Resources: LambdaFunction: Type: AWS::Serverless::Function Properties: FunctionName: MyLambdaExecute Description: My Lambda function Handler: myhandler.handler Runtime: nodejs6.10 CodeUri: s3://mybucket/mydirectory/mylambdacode.zip AutoPublishAlias: Staging Timeout: 30 DeploymentPreference: Type: AllAtOnce

如果名称为 "MyLambdaExecute" 的 lambda 函数不存在并且我将代码推送到 github,它会完美运行。但是,如果我修改一些代码并再次推送,它会运行前两个步骤,但随后会生成一个状态为:

的空更改集

FAILED - No updates are to be performed.

我不确定我需要做什么才能让它发布新版本。我如何让它意识到它需要创建一个新的变更集?

我相信您收到了 "No updates" 消息,因为从技术上讲,您的 CloudFormation 模板没有发生任何变化。尝试构建变更集时,不会检查 S3 文件的内容。它只是看到 none 的 CloudFormation 资源属性自上次部署以来发生了变化。

相反,您可以为 CodeUri 使用本地相对路径,并且 aws cloudformation package 可以将文件上传到您的唯一 S3 路径。这确保模板每次都更改,新的 Lambda 代码为 recognized/deployed。例如:

aws cloudformation package --template-file samTemplate.yml --output-template-file sam-output-dev.yml --s3-bucket "$CodePipelineS3Bucket" --s3-prefix "$CloudFormationPackageS3Prefix"

此命令可以在 create/execute 变更集步骤之前放入构建步骤。

要在实践中查看整个流程的演示,您可以查看 this repository,但我会警告它有点过时,这要归功于 2017 年底发布的新功能。(例如,我通过额外的步骤手动发布了 Lambda 别名,因为它是在 AutoPublishAlias 之前编写的。)