S3 Bucket中的AWS Lambda代码未更新

时间:2017-11-22 03:18:23

标签: aws-lambda amazon-cloudformation

我正在使用cloudformation来创建我的lambda函数,其中包含启用版本控制的S3Bucket中的代码。

"MYLAMBDA": {
      "Type": "AWS::Lambda::Function",
      "Properties": {
        "FunctionName": {
          "Fn::Sub": "My-Lambda-${StageName}"
        },
        "Code": {
          "S3Bucket": {
            "Fn::Sub": "${S3BucketName}"
          },
          "S3Key": {
            "Fn::Sub": "${artifact}.zip"
          },
          "S3ObjectVersion": "1e8Oasedk6sDZu6y01tioj8X._tAl3N"
        },
        "Handler": "streams.lambda_handler",
        "Runtime": "python3.6",
        "Timeout": "300",
        "MemorySize": "512",
        "Role": {
          "Fn::GetAtt": [
            "LambdaExecutionRole",
            "Arn"
          ]
        }
      }
    }

成功创建lambda函数。当我将新的工件zip文件复制到s3bucket时,将使用新版本" S3ObjectVersion"创建新版本的文件。串。但是lambda函数代码仍在使用旧版本。

aws cloudformation的文档清楚地说明了以下内容

  

更新源代码位于Amazon S3中的Lambda函数   你必须通过更新S3Bucket,S3Key或者来触发更新   S3ObjectVersion属性。单独更新源代码并不是事实   更新功能。

是否有额外的触发事件,我需要创建以更新代码?

3 个答案:

答案 0 :(得分:1)

我也遇到了同样的问题,我的代码在S3存储桶中的Archive.zip中,当我上传新的Archive.zip时,lambda没有根据新代码进行响应。

解决方案是再次将Archive.zip的S3位置的链接粘贴到lambda的功能代码部分中,然后再次保存。

我如何确定lambda没有采用新代码?

转到lambda函数->操作->导出函数->下载Deployment Package,然后检查代码是否实际上是您最近上传到S3的代码。

答案 1 :(得分:0)

万一有人遇到类似问题,我想出了一种解决方法。我使用Terraform + Jenkins通过s3存储桶创建我的lambda函数。一开始,我可以创建函数,但是一旦创建就不会更新。我验证了s3中的zip文件已更新。我花了一些时间弄清楚我需要执行以下两个更改之一。

解决方案1:在加载新的zip文件时提供新的对象密钥。在我的terraform中,我将git commit id作为s3键的一部分添加。

resource "aws_s3_bucket_object" "lambda-abc-package" {
  bucket = "${aws_s3_bucket.abc-bucket.id}"
  key    = "${var.lambda_ecs_task_runner_bucket_key}_${var.git_commit_id}.zip"
  source = "../${var.lambda_ecs_task_runner_bucket_key}.zip"
}

解决方案2:在lambda部分中添加source_code_hash。

resource "aws_lambda_function" "abc-ecs-task-runner" {
  s3_bucket         = "${var.bucket_name}"
  s3_key            = "${aws_s3_bucket_object.lambda-ecstaskrunner-package.key}"
  function_name     = "abc-ecs-task-runner"
  role              = "${aws_iam_role.AbcEcsTaskRunnerRole.arn}"
  handler           = "index.handler"
  memory_size       = "128"
  runtime           = "nodejs6.10"
  timeout           = "300"
  source_code_hash  = "${base64sha256(file("../${var.lambda_ecs_task_runner_bucket_key}.zip"))}"

任何一个都应该起作用。同样,在检查lambda代码时,无法从浏览器刷新URL。需要返回功能并再次打开该功能。

希望这会有所帮助。

答案 2 :(得分:0)

您必须在CloudFormation模板本身中将S3ObjectVersion值更新为新的版本ID。

然后,您必须使用新模板更新Cloudformation堆栈。

您可以在Cloudformation控制台上或通过AWS CLI进行此操作。