以ECR镜像为源的AWS Lambda CodeDeploy部署问题咨询
可行实现方案
你需要在ECR源阶段和CodeDeploy部署阶段之间新增一个CodeBuild阶段,完成镜像上传Lambda、动态生成AppSpec文件的逻辑,具体步骤如下:
步骤1:配置ECR源阶段输出
ECR作为CodePipeline源时,AWS会自动输出名为imageDetail.json的构件文件,里面包含你新推送镜像的完整URI、标签等元信息,将该阶段的输出构件命名为ecr-source-artifact即可。
步骤2:新增中间CodeBuild构建阶段
该阶段的核心作用是拉取ECR镜像部署为Lambda新版本、动态生成符合要求的AppSpec文件:
- 输入构件选择上一步输出的
ecr-source-artifact - 为CodeBuild服务角色添加以下权限:
lambda:UpdateFunctionCodelambda:PublishVersionlambda:GetAlias- ECR镜像拉取相关权限
- 构建环境选择标准Amazon Linux 2公共镜像即可,内置awscli和jq工具
- 配置buildspec.yml内容如下:
version: 0.2 phases: install: runtime-versions: python: 3.9 pre_build: commands: # 从ECR源输出构件中提取镜像URI - IMAGE_URI=$(cat ecr-source-artifact/imageDetail.json | jq -r '.ImageURI') # 替换为你的实际Lambda函数名 - LAMBDA_FUNC_NAME="awscodestar-gateway-api-lambda-HelloWorld" # 上传镜像到Lambda并发布新版本,获取新版本号 - NEW_LAMBDA_VERSION=$(aws lambda update-function-code --function-name $LAMBDA_FUNC_NAME --image-uri $IMAGE_URI --publish | jq -r '.Version') # 获取当前蓝绿部署别名对应的旧版本号 - CURRENT_LAMBDA_VERSION=$(aws lambda get-alias --function-name $LAMBDA_FUNC_NAME --name live | jq -r '.FunctionVersion') build: commands: # 动态生成AppSpec文件 - | cat > appspec.json << EOF { "version": "0.0", "Resources": [ { "$LAMBDA_FUNC_NAME": { "Type": "AWS::Lambda::Function", "Properties": { "Name": "$LAMBDA_FUNC_NAME", "Alias": "live", "CurrentVersion": "$CURRENT_LAMBDA_VERSION", "TargetVersion": "$NEW_LAMBDA_VERSION" } } } ] } EOF artifacts: files: - appspec.json name: code-deploy-artifact
步骤3:配置CodeDeploy部署阶段
- 输入构件选择CodeBuild阶段输出的
code-deploy-artifact,CodeDeploy会自动读取构件内的appspec.json执行部署逻辑 - 提前为CodeDeploy服务角色配置Lambda别名更新、版本查询相关权限即可正常运行蓝绿部署流程
注意事项
- Lambda函数本身的执行角色需要配置ECR镜像拉取权限,否则镜像部署后Lambda会启动失败
- 若你需要多个Lambda函数的部署逻辑,可调整buildspec逻辑遍历生成多组Resources配置即可
- 该方案完全兼容CodeDeploy的蓝绿部署、流量灰度、版本回滚所有原生特性
内容的提问来源于stack exchange,提问作者Abhishek
相关产品推荐
相关产品推荐

