【问题标题】:Can I update AWS Lambda function using CloudFormation template?我可以使用 CloudFormation 模板更新 AWS Lambda 函数吗?
【发布时间】:2021-12-31 06:43:37
【问题描述】:

我想使用 CloudFormation 堆栈部署和更新 Lambda 函数。

我的堆栈创建工作流程是:

  1. 将我的 Lambda 函数代码(zip 文件)上传到 S3
  2. 使用 s3 存储桶(存储 lambda 函数代码的位置)和 LambdaFileName(zip 文件名)作为 CloudFormation 参数,通过部署 CloudFormation 模板来创建 CloudFormation 堆栈

但是,我不知道如何使用模板更新 Lambda 函数。 我已尝试将新功能代码上传到 S3 并另存为新文件名。并使用新文件作为参数来更新堆栈。但由于文件是 zip 文件,CloudFormation 无法检测到任何更改。

我的问题:

  1. 如何使用 CloudFormation 模板更新 Lambda 函数
  2. 我应该使用AWS::Lambda::Function 还是AWS::Serverless::Function 资源?我希望支持版本控制。

谢谢。

我的 CloudFormation 模板如下。

AWSTemplateFormatVersion: "2010-09-09"
Metadata: ""
Description: ""
Parameters:

  LambdaS3:
    Description: Api Gateway Authorizer Lambda S3Bucket Name
    Type: String

  Lambdafilename:
    Description: Api Gateway Authorizer Lambda file Name (Latest)
    Type: String

Transform: AWS::Serverless-2016-10-31

Resources:
#  LambdaFunction:
#    DeletionPolicy: "Delete"
#    Type: "AWS::Lambda::Function"
#    Properties:
#      Description: ""
#      FunctionName: "LambdaFunction"
#      Handler: "lambda_function.lambda_handler"
#      Code:
#        S3Bucket: !Ref LambdaS3
#        S3Key: !Sub '${Lambdafilename}.zip'
#      MemorySize: 512
#      Role: !GetAtt IAMRole2.Arn
#      Runtime: "python3.8"
#      Timeout: 20
#      TracingConfig:
#        Mode: "PassThrough"

  LambdaFunction:
    DeletionPolicy: "Delete"
    Type: "AWS::Serverless::Function"
    Properties:
      Description: ""
      FunctionName: "LambdaFunction"
      Handler: "lambda_function.lambda_handler"
      CodeUri:
        Bucket: !Ref LambdaS3
        Key: !Sub '${Lambdafilename}.zip'
      MemorySize: 512
      Role: !GetAtt IAMRole2.Arn
      Runtime: "python3.8"
      Timeout: 20
      Tracing: "PassThrough"
      AutoPublishAlias: live
      DeploymentPreference:
        Type: Linear10PercentEvery10Minutes

【问题讨论】:

  • 进展如何?仍然不清楚你能做什么?
  • “如果您的存储桶是版本”是什么意思? 1.添加Version作为新参数 2.将Version属性添加到CodeUri属性 3.使Version属性引用新的参数值 4.输入S3存储桶名称作为Version值 上述步骤对吗?
  • Backet 可以是versioned,并且您在模板中提供版本号。
  • 我更新了 lambda 函数代码,添加了一行 print msg,然后部署到同一个 S3 存储桶并使用相同的 zip 文件名。然后我通过输入新的 zip 文件版本作为 Version 参数的新值来更新堆栈。但是,我得到的只是“提交的信息不包含更改。提交不同的信息以创建更改集。”
  • 您的版本一定有问题。我建议提出新问题,提供确切的详细信息、分步说明以及更新前后在模板中使用的值的示例。

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


【解决方案1】:

CodeUri 接受Version。因此,如果您的存储桶是版本,则对其对象的任何更改,即使名称相同,也会导致不同的版本。因此,一旦您将新版本指定为参数,您的函数就会得到更新。

【讨论】:

  • “如果您的存储桶是版本”是什么意思? 1.将Version添加为新参数 2.将Version属性添加到CodeUri属性 3.使Version属性引用新的参数值 4.输入S3存储桶名称为Version值 是否如上步骤对吗?
【解决方案2】:

堆栈更新期间不会自动检测到对 Amazon S3 中的部署包的更改。要更新函数代码,请更改模板中的对象键或版本。

很遗憾,除非您在每次更新时更改“AWS::Lambda::Function”资源上的“S3Key”,否则 CloudFormation 不会将其视为更改

Source

当您应用 CloudFormation 堆栈更新时,它将检查任何已部署资源的属性中是否有更新。当 Lambda 资源属性(如内存、超时、环境变量等)发生更新时,没有问题,因为 CloudFormation 会选择这些更改并相应地更新。

当更新 Lambda 函数代码或其任何依赖项时,就会出现问题。由于这些不是资源属性更新,因此 CloudFormation 无法知道是否有更改并更新受影响的组件。

当更新 Lambda 函数代码或其任何依赖项时,就会出现问题。由于这些不是资源属性更新,因此 CloudFormation 无法知道是否有更改并更新受影响的组件。

请关注blog post

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-02
    • 2023-03-28
    • 2021-01-14
    • 2021-03-27
    • 2020-08-17
    • 1970-01-01
    • 2019-06-29
    • 2014-06-07
    相关资源
    最近更新 更多