如何在未知当前版本时用CodeDeploy部署Lambda函数
解决方案:动态获取Lambda别名当前版本并部署
针对你遇到的CodeDeploy部署Lambda时需要动态指定currentversion的问题,提供两种可行方案:
方案一:通过CodePipeline前置Lambda步骤获取版本并替换appspec.yml
1. 编写获取别名版本的Lambda函数
创建一个Lambda函数,用于查询staging别名当前指向的版本,代码示例(Python):
import boto3 def lambda_handler(event, context): lambda_client = boto3.client('lambda') alias_info = lambda_client.get_alias( FunctionName='myLambdaFunction', Name='staging' ) return {'current_version': alias_info['FunctionVersion']}
给该Lambda函数添加权限,允许执行lambda:GetAlias操作。
2. 在CodePipeline中新增前置阶段
在Build和Deploy阶段之间,添加一个名为Fetch Staging Current Version的阶段:
- 动作类型选择
AWS Lambda -> Invoke - 选择上面创建的Lambda函数
- 设置输出变量:比如命名为
CURRENT_VERSION,取值为$.current_version(用JSON路径提取Lambda返回的版本号)
3. 新增CodeBuild步骤替换appspec.yml占位符
在获取版本的阶段之后,添加一个CodeBuild动作:
- 在Build项目中,将
CURRENT_VERSION作为环境变量传入 - 在Build脚本中执行替换命令,替换appspec.yml里的占位符:
sed -i "s/{{CURRENT_VERSION}}/${CURRENT_VERSION}/" appspec.yml - 将修改后的appspec.yml作为输出产物传递给后续的CodeDeploy阶段
4. 修改appspec.yml模板
构建阶段生成的appspec.yml使用占位符:
version: 0.0 resources: - myLambdaFunction: type: "AWS::Lambda::Function" properties: name: myLambdaFunction alias: staging targetversion: "{{TARGET_VERSION}}" # 构建阶段替换为新版本号 currentversion: "{{CURRENT_VERSION}}"
方案二:改用CloudFormation管理Lambda别名(更简洁)
放弃CodeDeploy的appspec.yml方式,用CloudFormation直接管理Lambda别名,它会自动处理版本切换,无需手动指定currentversion。
1. 编写CloudFormation模板片段
Resources: MyLambdaFunction: Type: AWS::Lambda::Function Properties: # 你的Lambda函数基础配置 StagingLambdaAlias: Type: AWS::Lambda::Alias Properties: FunctionName: !Ref MyLambdaFunction FunctionVersion: !Ref NewLambdaVersion # 传入构建生成的新版本号 Name: staging
2. 在CodePipeline中使用CloudFormation部署动作
将部署阶段替换为CloudFormation的Create/Update Stack动作,把构建阶段生成的Lambda新版本号作为参数传入模板,CloudFormation会自动更新staging别名指向新版本,无需关心旧版本号。
方案对比
- 方案一:保留CodeDeploy的部署策略(如蓝绿部署、流量切换),适合需要复杂发布流程的场景。
- 方案二:配置更简洁,无需处理版本号的动态替换,适合基础的别名更新场景。
内容的提问来源于stack exchange,提问作者Kraigolas
相关产品推荐
相关产品推荐

