You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}:latest
    
    或通过更新环境变量触发:
    aws lambda update-function-configuration --function-name MyLambda_${你的环境名} --environment Variables={stage=${你的环境名},commit_hash=${新的Commit哈希}}
    

补充说明

Lambda无法手动终止单个实例,当有新的部署版本时,新请求会分配到新版本实例,旧实例处理完当前请求后会自动销毁,完成实例循环。确保每次镜像更新都触发Lambda部署,就能避免旧代码残留问题。

内容的提问来源于stack exchange,提问作者Hephaestus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:45:44