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

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

我的流程是:

  1. 将提交推送到 github,这会触发代码管道
  2. Codebuild 将 lambda 函数上传(压缩)到 S3 存储桶
  3. 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 如果您找到解决方案,请考虑分享:-)
  • 当然。我会分享..

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


【解决方案1】:

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

  1. 您必须配置 CodePipeline 或 CodeBuild 以根据(例如)部署时间为工件生成不同的名称,而不是使用相同的名称保存工件;
  2. 在您的 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
      

      【讨论】:

        猜你喜欢
        • 2021-07-29
        • 2020-01-26
        • 1970-01-01
        • 2018-05-05
        • 2017-09-21
        • 2020-03-14
        • 1970-01-01
        • 1970-01-01
        • 2017-10-15
        相关资源
        最近更新 更多