能否在AWS CodeBuild的buildspec.yml中配置手动审批阶段?
问题:能否在AWS CodeBuild的buildspec.yml中实现手动审批逻辑?
已知AWS CodePipeline可以添加手动审批阶段(用于发送通知到SNS主题、获取人工审批),请问能不能单独在buildspec.yml里实现这个配置?
当前我的buildspec.yml内容如下:
version: 0.2 phases: install: runtime-versions: nodejs: 16 commands: - ASSUME_ROLE_ARN="arn:aws:iam::accountnum:role/ServerlessAssumeRole" - TEMP_ROLE=$(aws sts assume-role --role-arn $ASSUME_ROLE_ARN --role-session-name codebuild) - export TEMP_ROLE - export AWS_ACCESS_KEY_ID=$(echo "${TEMP_ROLE}" | jq -r '.Credentials.AccessKeyId') - export AWS_SECRET_ACCESS_KEY=$(echo "${TEMP_ROLE}" | jq -r '.Credentials.SecretAccessKey') - export AWS_SESSION_TOKEN=$(echo "${TEMP_ROLE}" | jq -r '.Credentials.SessionToken') - npm install -g serverless - npm install - npx tsc build: commands: - sls deploy --stage dev --region eu-west-2 --verbose post_build: commands: - echo build complete
能不能在pre-build阶段添加步骤,让构建暂停、创建手动审批阶段并发送通知到SNS后再继续执行构建?
回答
不能直接在buildspec.yml里实现原生的手动审批逻辑,核心原因如下:
- CodeBuild的构建任务是一次性、无状态的,启动后会按阶段顺序执行,没有内置的「暂停等待审批」机制。buildspec.yml只能定义构建过程中的命令和阶段,无法让构建任务进入挂起状态等待外部输入。
- 手动审批是CodePipeline的专属核心功能,专门用于在流水线的不同阶段之间插入人工确认环节。CodeBuild只是Pipeline中的一个执行单元,本身不具备审批调度能力。
不过可以通过自定义逻辑模拟类似效果,具体思路如下:
- 在pre_build阶段发送SNS通知,告知审批人需要确认继续构建
- 编写循环查询脚本,定期检查外部存储(比如DynamoDB、S3对象)中的审批状态
- 只有检测到审批通过的标记后,才继续执行后续build阶段的命令
示例修改后的buildspec.yml片段(新增pre_build阶段):
version: 0.2 phases: install: # 原install阶段内容保持不变 runtime-versions: nodejs: 16 commands: - ASSUME_ROLE_ARN="arn:aws:iam::accountnum:role/ServerlessAssumeRole" - TEMP_ROLE=$(aws sts assume-role --role-arn $ASSUME_ROLE_ARN --role-session-name codebuild) - export TEMP_ROLE - export AWS_ACCESS_KEY_ID=$(echo "${TEMP_ROLE}" | jq -r '.Credentials.AccessKeyId') - export AWS_SECRET_ACCESS_KEY=$(echo "${TEMP_ROLE}" | jq -r '.Credentials.SecretAccessKey') - export AWS_SESSION_TOKEN=$(echo "${TEMP_ROLE}" | jq -r '.Credentials.SessionToken') - npm install -g serverless - npm install - npx tsc pre_build: commands: # 1. 发送SNS审批通知 - aws sns publish --topic-arn "arn:aws:sns:eu-west-2:accountnum:your-approval-topic" --message "请审批构建任务:$(echo $CODEBUILD_BUILD_ID)" # 2. 循环等待审批状态 - | APPROVED=false while [ "$APPROVED" != "true" ]; do # 从DynamoDB查询审批状态,假设表名为BuildApprovals,主键为BUILD_ID APPROVAL_STATUS=$(aws dynamodb get-item --table-name BuildApprovals --key '{"BUILD_ID": {"S": "'$CODEBUILD_BUILD_ID'"}}' --query 'Item.STATUS.S' --output text) if [ "$APPROVAL_STATUS" = "APPROVED" ]; then APPROVED=true elif [ "$APPROVAL_STATUS" = "REJECTED" ]; then echo "构建被拒绝,终止任务" exit 1 fi # 每30秒查询一次 sleep 30 done build: commands: - sls deploy --stage dev --region eu-west-2 --verbose post_build: commands: - echo build complete
注意事项
- 需要给CodeBuild的执行角色添加SNS发布、DynamoDB查询的权限
- 审批人需要有修改DynamoDB状态的权限,也可以通过Lambda+API Gateway搭建简单审批页面来更新状态
- 这种模拟方式会持续占用CodeBuild资源直到审批完成,可能产生额外费用
内容的提问来源于stack exchange,提问作者mkalich
相关产品推荐
相关产品推荐

