我正在使用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属性。单独更新源代码并不是事实 更新功能。
是否有额外的触发事件,我需要创建以更新代码?
答案 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进行此操作。