S3 存储桶中的 AWS Lambda 代码未更新

Kat*_*hir 13 aws-cloudformation aws-lambda

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

"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"
          ]
        }
      }
    }
Run Code Online (Sandbox Code Playgroud)

lambda 函数创建成功。当我将新的工件 zip 文件复制到 s3bucket 时,会使用新版本的“S3ObjectVersion”字符串创建该文件的新版本。但是 lambda 函数代码仍然使用旧版本。

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

要更新源代码位于 Amazon S3 存储桶中的 Lambda 函数,您必须通过更新 S3Bucket、S3Key 或 S3ObjectVersion 属性来触发更新。单独更新源代码不会更新函数。

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

L.T*_*.T. 12

万一有人遇到这个类似的问题,我已经想出了一个办法。我使用 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"
}
Run Code Online (Sandbox Code Playgroud)

解决方案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"))}"
Run Code Online (Sandbox Code Playgroud)

所以做任何一个都应该工作。此外,在检查 lambda 代码时,从浏览器刷新 URL 将不起作用。需要返回函数并再次打开该函数。

希望这可以帮助。


cha*_*ny1 3

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

解决方案是再次将 Archive.zip 的 S3 位置的链接粘贴到 lambda 的函数代码部分并再次保存。

我如何发现 lambda 没有采用新代码?

转到您的 lambda 函数 --> Actions --> Export Function --> Download Deployment Package 并检查代码是否实际上是您最近上传到 S3 的代码。