AWS Lambda无法自动获取ECR最新镜像?求自动更新方案
解决AWS Lambda自动使用ECR最新容器镜像的问题
为什么之前的方案无效
Lambda会缓存已配置的容器镜像,只有当函数的镜像URI配置被修改(哪怕是相同值重新设置),或者函数被重新部署时,才会从ECR拉取最新镜像。仅保持标签不变或用latest标签,不会触发Lambda主动检查ECR的镜像更新。
可行的自动更新方案
1. 利用ECR事件触发Lambda自动更新
在ECR仓库配置事件通知,当新镜像推送完成后,触发一个专门的"更新Lambda"函数,通过AWS SDK强制更新目标Lambda的镜像配置:
- 步骤:
- 打开ECR仓库的「事件通知」页面,创建新规则
- 事件类型选择
IMAGE_PUSH_COMPLETE,指定要监听的标签(比如latest或你的固定标签) - 目标选择「Lambda函数」,指定你提前创建的更新函数
- 更新函数示例(Python + boto3):
import boto3 import json lambda_client = boto3.client('lambda') TARGET_FUNCTION_NAME = "你的目标Lambda函数名" def lambda_handler(event, context): # 从ECR事件中提取最新镜像URI image_details = event['detail']['image'] repository_name = event['detail']['repository-name'] region = context.invoked_function_arn.split(':')[3] account_id = context.invoked_function_arn.split(':')[4] image_uri = f"{account_id}.dkr.ecr.{region}.amazonaws.com/{repository_name}:{image_details['tags'][0]}" # 更新目标Lambda的镜像配置 response = lambda_client.update_function_code( FunctionName=TARGET_FUNCTION_NAME, ImageUri=image_uri ) return { 'statusCode': 200, 'body': json.dumps(f"Lambda函数已更新至镜像: {image_uri}") }
- 权限配置:给这个更新函数添加
lambda:UpdateFunctionCode权限,确保能修改目标Lambda的配置。
2. 在Bitbucket CI/CD Pipeline中添加Lambda更新步骤
在Bitbucket的bitbucket-pipelines.yml里,推送镜像到ECR之后,直接调用AWS CLI命令强制更新Lambda:
- 示例Pipeline片段:
script: # 登录ECR并推送镜像的步骤 - aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $ECR_REPO_URI - docker build -t $ECR_REPO_URI:$IMAGE_TAG . - docker push $ECR_REPO_URI:$IMAGE_TAG # 新增:更新Lambda函数 - aws lambda update-function-code --function-name $TARGET_LAMBDA_NAME --image-uri $ECR_REPO_URI:$IMAGE_TAG
- 前提:Bitbucket Runner需要配置AWS访问密钥(具备
lambda:UpdateFunctionCode权限),并设置好环境变量(AWS_REGION、ECR_REPO_URI等)。
3. 使用AWS CodePipeline构建自动化部署流水线
搭建CodePipeline实现从Bitbucket代码提交到Lambda更新的全流程自动化:
- 阶段配置:
- 源阶段:选择Bitbucket作为源,监听代码分支的提交
- 构建阶段:配置镜像构建并推送到ECR(如果Bitbucket未做构建)
- 部署阶段:选择「Lambda部署」动作,配置目标Lambda函数,指定从ECR获取最新镜像URI
- 优势:有完整的部署历史、状态监控,适合多环境部署的复杂场景。
内容的提问来源于stack exchange,提问作者m00s3
相关产品推荐
相关产品推荐

