为什么Lambda仍在S3存储桶中使用旧版本的zip文件?

问题描述 投票:0回答:1

我正在使用Terraform创建一个lambda和一个S3存储桶,该lambda使用的二进制文件存储在此存储桶中,在我更改了二进制文件的内容之后,似乎lambda仍在使用旧版本文件(我覆盖存储桶中的文件),如何告诉lambda使用存储桶中文件的最新版本?

amazon-web-services amazon-s3 aws-lambda terraform versioning
1个回答
0
投票

Lambda函数将不会更新,仅因为S3存储桶中的文件已更改。

类似于AWS::Lambda::Function Code中的CloudFormation想法>

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

据我所知,如果Lambda函数自动接收S3存储桶中的更改,我们将不知道正在执行什么lambda代码。作为适当的发布管理,我们应该能够显式发布新的lambda部署(最好避免使用$ LATEST而是发布)。

需要触发lambda函数更新。

一种方法是使用aws_lambda_function Terraform资源的source_code_hash属性,但是该文件必须是本地文件,而不是S3中的文件,并且需要在运行terraform应用之前进行更改。

或更改S3存储桶对象位置,并将新路径设置为aws_lambda_function的s3_key属性。例如,对于每个新发行版,创建一个新的S3文件夹“ v1”,“ v2”,“ v3”,...,并使用新文件夹(最好更新别名)。

resource "aws_lambda_function" "authorizer" {
  function_name    = "${var.lambda_authorizer_name}"
  source_code_hash = "${data.archive_file.lambda_authorizer.output_sha}" # <---
  s3_bucket        = "${aws_s3_bucket.package.bucket}"   
  s3_key           = "${aws_s3_bucket_object.lambda_authorizer_package.id}"   # <---

或启用S3存储桶版本控制,或使用aws_s3_bucket_object中的version_id,或在S3中更改文件并检查版本ID后,更改aws_lambda_function的s3_object_version属性。

其中之一将像UpdateFunctionCode中那样触发调用resource_aws_lambda_function.go API的更新。

func needsFunctionCodeUpdate(d resourceDiffer) bool {
    return d.HasChange("filename") || 
           d.HasChange("source_code_hash") || 
           d.HasChange("s3_bucket") || 
           d.HasChange("s3_key") || 
           d.HasChange("s3_object_version")
}

// UpdateFunctionCode in the API / SDK
func resourceAwsLambdaFunctionUpdate(d *schema.ResourceData, meta interface{}) error {
    conn := meta.(*AWSClient).lambdaconn

    ...
    codeUpdate := needsFunctionCodeUpdate(d)
    if codeUpdate {
        ...
        log.Printf("[DEBUG] Send Update Lambda Function Code request: %#v", codeReq)

        _, err := conn.UpdateFunctionCode(codeReq)
        if err != nil {
            return fmt.Errorf("Error modifying Lambda Function Code %s: %s", d.Id(), err)
        }
        ...
    }

或者,调用AWS CLI update-function-code,基本上是terraform aws_lambda_function代码正在执行。

© www.soinside.com 2019 - 2024. All rights reserved.