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

Mik*_*ike 4 amazon-web-services aws-cloudformation aws-lambda aws-codepipeline

我有一个经过验证可以正常工作的 Lambda 函数。我可以使用“update-function-code”在命令行上手动更新函数,但我一直试图让它与代码管道和云形成一起工作。以下是我到目前为止的步骤:

  1. Source - 从 github 获取代码。这工作正常。
  2. 构建 - 在 Solano(第 3 方 CI)中测试代码。这也有效,在最后阶段它会压缩存储库并将其上传到我的 S3 存储桶。
  3. 部署 - 这是“部署”操作类别,操作模式为“创建或替换更改集”。如果 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,则它可以完美运行。但是,如果我修改一些代码并再次推送,它会运行前两个步骤,然后生成一个带有状态的空更改集:

失败 - 不执行更新。

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

Joe*_*sca 5

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

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

aws cloudformation package --template-file samTemplate.yml --output-template-file sam-output-dev.yml --s3-bucket "$CodePipelineS3Bucket" --s3-prefix "$CloudFormationPackageS3Prefix"
Run Code Online (Sandbox Code Playgroud)

此命令可以在创建/执行变更集步骤之前放入构建步骤。

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

  • 谢谢。这是有道理的。我希望它会查看 s3 存储桶中 zip 文件的时间戳,但我想不会。我很困惑,因为名为“使用 AWS 无服务器应用程序模型 (AWS SAM)”的 Lambda 部署文档显示 CodeUri 设置为:“CodeUri: s3://bucketName/codepackage.zip” 在我的示例中,我需要什么将 CodeUri 更改为?只是“mylambdacode.zip”?然后打包命令的 s3-bucket 可能是“mybucket”? (2认同)
  • 再次感谢。我终于让它工作了。我的最后一个错误是忘记将代码管道部署步骤中的模板文件更改为“sam-output-dev.yml” (2认同)