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

Aws lambda S3存储桶中的AWS Lambda代码未更新,aws-lambda,amazon-cloudformation,Aws Lambda,Amazon Cloudformation,我正在使用cloudformation创建lambda函数,代码位于启用版本控制的S3Bucket中 "MYLAMBDA": { "Type": "AWS::Lambda::Function", "Properties": { "FunctionName": { "Fn::Sub": "My-Lambda-${StageName}" }, "Code": { "S3Bucket": {

我正在使用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的文档清楚地说明了以下内容

更新源代码位于AmazonS3中的Lambda函数 bucket,则必须通过更新S3Bucket、S3Key或 S3ObjectVersion属性。单靠更新源代码是不行的 更新函数


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

我也面临同样的问题,我的代码在S3 bucket中的Archive.zip中,当我上传一个新的Archive.zip时,lambda没有根据新代码响应

解决方案是在lambda的函数代码部分再次粘贴Archive.zip的S3位置链接,然后再次保存

我是如何发现lambda没有使用新代码的?


转到lambda函数-->操作-->导出函数-->下载部署包,检查代码是否确实是最近上载到S3的代码。

如果有人遇到类似问题,我已经找到了解决方法。我使用Terraform+Jenkins通过s3 bucket创建lambda函数。在开始时,我可以创建函数,但创建后不会更新。我验证了s3中的zip文件是否已更新。我花了一些时间才明白我需要做以下两个改变之一

解决方案1:加载新zip文件时提供一个新的对象键。在我的terraform中,我添加git提交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部分添加源代码散列

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将不起作用。需要返回函数并再次打开该函数


希望这会有所帮助。

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

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


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

我有一个类似的问题,您找到解决方案了吗?这里也一样。Sam local通过上传带有随机名称的工件并相应地修改模板,在打包时解决了这个问题。但是,我不能使用它,因为嵌套模板中还不支持转换,并且我的lambda是嵌套的。我也有同样的问题。你能分享一下解决方案吗?这也是我必须要做的,但我想知道这是否是预期的行为,或者它是否应该每x时间更新一次,或者通过其他触发。你有这样的例子吗?这简直让人目瞪口呆。好吧,让我再试一次。在OP的例子中,他有
“S3ObjectVersion”:“1e8Oasedk6sDZu6y01tioj8X.\u tAl3N”
在他上传了新的zip文件后,假设他得到了新版本
qwertyuiopasdfg2345jjQWERTY
。现在需要将模板行更新为“S3ObjectVersion”:“qwertyuiopasdfg2345jjQWERTY”。假设本地目录中更新的文件名为template.json。AWS不知道这个模板的变化,是吗?因此,再次运行此命令
aws cloudformation deploy--template file/path\u to\u template/template.json
。新的变化现在将被接受OK是有意义的。谢谢事实上,我在CI管道中发现了其他问题,但现在我也明白了这一点。:)@如果可能的话,Askdesigners也会分享您的问题。祝您有个美好的一天!