【问题标题】:How do I get Cloud Formation to create a changeset to update my Lambda functions?如何让 Cloud Formation 创建变更集以更新我的 Lambda 函数?
【发布时间】:2018-08-25 02:01:38
【问题描述】:

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

  1. 来源 - 从 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,则它可以完美运行。但是,如果我修改一些代码并再次推送,它会运行前两个步骤,但随后会生成一个空的更改集,其状态为:

FAILED - 不执行更新。

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

【问题讨论】:

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


    【解决方案1】:

    我相信您会收到“无更新”消息,因为从技术上讲,您的 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"
    

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

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

    【讨论】:

    • 谢谢。这是有道理的。我希望它会查看 s3 存储桶中 zip 文件的时间戳,但我想不会。我很困惑,因为名为“使用 AWS 无服务器应用程序模型 (AWS SAM)”的 Lambda 部署文档显示 CodeUri 设置为:“CodeUri: s3://bucketName/codepackage.zip” 在我的示例中,我需要什么将 CodeUri 更改为?只是“mylambdacode.zip”?然后 package 命令的 s3-bucket 可能是“mybucket”?
    • 将其设置为从 SAM 模板文件到压缩的 Lambda 包的相对路径。如果 zip 与 SAM 模板位于同一目录中,您的“mylambdacode.zip”应该可以正常工作。存储桶必须是您具有写入权限的存储桶。
    • 再次感谢。我终于让它工作了。我遇到的最后一个错误是忘记将代码管道部署步骤中的模板文件更改为“sam-output-dev.yml”
    猜你喜欢
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 2020-10-19
    相关资源
    最近更新 更多