Terraform部署AWS Lambda镜像未更新:如何强制刷新内存实例?
如何强制AWS Lambda实例循环加载新的Docker镜像?
问题场景
用Terraform推送新Docker镜像到AWS Lambda后,控制台确认镜像URL已更新,但测试时Lambda仍运行旧代码——这是因为Lambda的预热实例仍在缓存旧镜像,没有自动加载新版本。
核心原因
你的Terraform配置中使用了:latest镜像标签,Lambda只会识别镜像的唯一SHA摘要,而非标签本身。即使ECR里的latest指向新镜像,Terraform和Lambda都不会自动检测到这个变化,因此不会触发新的部署,旧实例也就不会被替换。
解决方案
1. 修正Terraform配置(彻底解决)
通过获取ECR镜像的实际SHA摘要来更新Lambda的image_uri,这样每次镜像更新时,Terraform会自动触发Lambda函数部署,强制循环实例。
修改后的代码:
# 获取最新镜像的SHA摘要 data "aws_ecr_image" "my_latest_image" { repository_name = data.aws_ecr_repository.my_image.name image_tag = "latest" } resource "aws_lambda_function" "my_lambda" { function_name = "MyLambda_${var.environment}" role = data.aws_iam_role.iam_for_lambda.arn # 使用镜像SHA而非latest标签,确保镜像更新时触发Lambda部署 image_uri = "${data.aws_ecr_repository.my_image.repository_url}@${data.aws_ecr_image.my_latest_image.image_digest}" memory_size = 512 timeout = 300 architectures = ["x86_64"] package_type = "Image" environment {variables = {stage = var.environment, commit_hash=var.commit_hash}} }
2. 临时应急方法(手动触发部署)
如果需要立即循环实例,可通过以下方式强制触发Lambda部署:
- 控制台操作:
- 进入Lambda函数页面,点击右上角「部署」>「部署代码」,即使配置无变化,该操作也会创建新的部署版本,逐步替换旧实例。
- 或在「配置」>「常规配置」中修改任意参数(比如临时把内存改成513,保存后改回512),触发函数更新。
- AWS CLI命令:
强制更新函数代码触发部署:
或通过更新环境变量触发:aws lambda update-function-code --function-name MyLambda_${你的环境名} --image-uri ${你的ECR仓库URL}:latestaws lambda update-function-configuration --function-name MyLambda_${你的环境名} --environment Variables={stage=${你的环境名},commit_hash=${新的Commit哈希}}
补充说明
Lambda无法手动终止单个实例,当有新的部署版本时,新请求会分配到新版本实例,旧实例处理完当前请求后会自动销毁,完成实例循环。确保每次镜像更新都触发Lambda部署,就能避免旧代码残留问题。
内容的提问来源于stack exchange,提问作者Hephaestus
相关产品推荐
相关产品推荐

