AWS Cloudformation |将Lambda配置为在S3存储桶中使用最新版本的代码

时间:2018-08-16 10:40:28

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

我在AWS上使用代码管道,代码构建和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将导致错误。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

如果您的CF堆栈中有很多lambda,那么一种快速的hack效果很好,因此您希望手动选择要从源代码更新的lambda,并拥有可以在多个运行时同样有效的lambda代码。只需更改堆栈中的运行时版本(例如从“运行时:nodejs8.10”更改为“运行时:nodejs10.x”即可。CodePipeline/ CloudFormation只会更新该函数。