AWS 云形成 |配置 Lambda 以使用 S3 存储桶中的最新版本代码

Posted

技术标签:

【中文标题】AWS 云形成 |配置 Lambda 以使用 S3 存储桶中的最新版本代码【英文标题】:AWS Cloudformation | Configure Lambda to Use Latest Version of Code in S3 Bucket 【发布时间】:2019-01-23 07:08:51 【问题描述】:

我在 AWS 上使用 codepipeline、codebuild 和 cloudformation。

我的流程是:

    将提交推送到 github,这会触发代码管道 Codebuild 将 lambda 函数上传(压缩)到 S3 存储桶 Cloudformation 配置 lambda 函数

Cloudformation(简化版):

CreateDoctorLambda:
    Type: AWS::Lambda::Function
    Properties:
      Runtime: python3.6
      Handler: lambda_function.lambda_handler
      Role:
        Fn::GetAtt:
          - LambdaExecutionRole
          - Arn
      Code:
          S3Bucket: !Ref LambdaFunctionS3Bucket
          S3Key: CreateDoctor.zip
          S3ObjectVersion: Latest <-- This value is invalid

问题:当我更新 lambda 函数的代码时(此新代码在代码构建期间被压缩并上传到 S3 存储桶),更改不会部署到现有的 lambda 函数。

据AWS documentation:

更新源代码位于 Amazon S3 中的 Lambda 函数 存储桶,您必须通过更新 S3Bucket、S3Key 或 S3ObjectVersion 属性。单独更新源代码不会 更新函数。

问题:有没有办法告诉 Cloudformation 使用存储在 S3 中的最新版本的代码?使用S3ObjectVersion: Latest 将导致错误。

【问题讨论】:

嗨,我也对同一个用例感到震惊。您是否能够找出 S3ObjectVersion 的值以便 lambda 获得最新的 s3 zip 文件? @Private 不幸的是没有。 好的,感谢您的回复。我也在aws论坛上问过同样的问题,希望我能得到任何积极的回应。 @Private 如果您找到解决方案,请考虑分享:-) 当然。我会分享.. 【参考方案1】:

它只是一种替代工作流程,但也许它会解决您的问题:

    您必须配置 CodePipeline 或 CodeBuild 以根据(例如)部署时间为工件生成不同的名称,而不是使用相同的名称保存工件; 在您的 CloudFormation 操作中,您将工件名称作为模板 (https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/continuous-delivery-codepipeline-parameter-override-functions.html) 的参数传递,它将根据新代码重新部署函数。

【讨论】:

【参考方案2】:

如果您的 CF 堆栈中有大量 lambda,因此您想手动选择要从源中更新的 lambda,并让 lambda 代码在多个运行时下同样有效,那么这种快速破解非常有效。只需更改堆栈中的运行时版本(例如从“运行时:nodejs8.10”更改为“运行时:nodejs10.x”。CodePipeline/CloudFormation 将只更新该函数。

【讨论】:

【参考方案3】:

S3ObjectVersion 可以提取到Parameters 部分,最新版本可以动态传递给它。

下面是org-babel版本,但是可以转成shell脚本代替。

#+name: latest-lambda-version
#+BEGIN_SRC sh :results output :var bucket=artifact-bucket-name
aws s3api list-object-versions --bucket $bucket --prefix lambda-function.zip --query 'Versions[?IsLatest].[VersionId]' --output text
#+END_SRC


#+BEGIN_SRC sh :results verbatim silent :var version=latest-lambda-version
aws cloudformation deploy --template-file stack.yml \
                          --stack-name FooStack \
                          --capabilities CAPABILITY_IAM \
                          --parameter-overrides LambdaVersion="$version" \
                          --no-execute-changeset
#+END_SRC

【讨论】:

以上是关于AWS 云形成 |配置 Lambda 以使用 S3 存储桶中的最新版本代码的主要内容,如果未能解决你的问题,请参考以下文章

如何从 S3 加载泡菜文件以在 AWS Lambda 中使用?

AWS CloudFormation 更新 Lambda 代码以在 S3 存储桶中使用最新版本

使用 VPC 配置添加 AWS Lambda 会导致访问 S3 时超时

AWS - Serverless 和 lambda

如何从 AWS lambda 发布到 Node.js 中的云观察指标

AWS Lambda 中的 Amazon S3 waitFor()