如何通过CodeBuild buildspec.yml实现AWS跨账号CodeCommit git推送
跨AWS账号CodeCommit代码推送配置方案
场景说明
- 持有2个AWS账号:共享服务账号、开发账号
- 开发账号侧已完成CodeCommit仓库配置,可通过CodePipeline/CodeBuild正常部署Glue作业
- 需求:无共享服务账号直接访问权限的前提下,通过CodePipeline/CodeBuild将开发账号CodeCommit仓库的代码推送到共享服务账号的CodeCommit仓库
- 当前故障:执行git push操作时返回错误
fatal: repository 'https://git-codecommit.us-east-1.amazonaws.com/v1/repos/crsaccnt_codepush_test/' not found - 已验证正常步骤:开发账号侧代码克隆命令
git clone codecommit::us-east-1://dev_ca_codepush_test可正常执行,克隆文件可通过ls -lrt正常查看 - 当前使用的buildspec.yml配置如下:
version: 0.2 env: git-credential-helper: yes phases: install: commands: - pip install git-remote-codecommit build: commands: - env - git clone codecommit::us-east-1://dev_ca_codepush_test - dt=$(date '+%d-%m-%Y-%H:%M:%S'); - echo "$dt" - ASSUME_ROLE_ARN="arn:aws:iam::123456789:role/cross-acc-access" - TEMP_ROLE=$(aws sts assume-role --role-arn $ASSUME_ROLE_ARN --role-session-name development) - 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') - echo "$AWS_ACCESS_KEY_ID" - echo "$AWS_SESSION_TOKEN" - ls -lrt - git init --initial-branch=master - git config --global init.defaultBranch master - git config --global user.email "abc@test.com" - git config --global user.name "myname" - git remote add target https://git-codecommit.us-east-1.amazonaws.com/v1/repos/crsaccnt_codepush_test - git status - git add . - git commit -m "Cross account gitpush" - git push target master post_build: commands: - echo git push completed successfully on `date`
故障根因
- 默认开启的
git-credential-helper: yes配置会自动绑定开发账号(CodeBuild运行角色所属账号)的Git凭证,后续即使导出了共享账号的临时访问凭证,Git HTTPS协议仍优先读取本地缓存的开发账号凭证,请求实际发到了开发账号的CodeCommit服务,自然找不到属于共享账号的目标仓库。 - 克隆开发账号仓库后重复执行
git init,会破坏原有仓库的Git元数据,将克隆下来的完整仓库重置为全新空仓库,导致提交、分支逻辑异常。 - CodeCommit对无访问权限的仓库统一返回
not found错误(而非权限不足错误,避免泄露仓库存在性),如果跨账号角色信任策略、权限配置错误,也会触发该报错。
前置IAM配置(必须完成,否则代码调整后仍无法运行)
- 共享服务账号侧跨账号角色
cross-acc-access配置:- 信任策略主体需配置为开发账号中运行该构建任务的CodeBuild服务角色ARN,允许该角色代入当前跨账号角色
- 角色需附加目标CodeCommit仓库的读写权限,至少包含
codecommit:GitPush、codecommit:GitPull、codecommit:GetRepository操作,资源范围指定为共享账号下crsaccnt_codepush_test仓库的ARN
- 开发账号侧CodeBuild服务角色配置:
- 需附加
sts:AssumeRole权限,资源范围指定为共享账号侧跨账号角色cross-acc-access的ARN
- 需附加
修正后的buildspec.yml配置
version: 0.2 # 关闭默认Git凭证助手,避免开发账号本地凭证干扰跨账号鉴权 env: git-credential-helper: no phases: install: commands: # 安装依赖,确保jq、git-remote-codecommit为最新版本 - pip install --upgrade pip git-remote-codecommit jq build: commands: # 克隆开发账号源仓库到独立src目录,避免与构建根目录文件混淆 - git clone codecommit::us-east-1://dev_ca_codepush_test ./src - cd ./src # 获取共享账号跨账号角色的临时访问凭证 - ASSUME_ROLE_ARN="arn:aws:iam::123456789:role/cross-acc-access" - TEMP_ROLE=$(aws sts assume-role --role-arn $ASSUME_ROLE_ARN --role-session-name cross-account-code-push --duration-seconds 3600) - 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') # 配置Git提交身份信息 - git config user.email "abc@test.com" - git config user.name "myname" # 添加共享账号目标仓库为远程源,使用git-remote-codecommit协议自动读取当前环境的临时凭证鉴权 - git remote add target codecommit::us-east-1://crsaccnt_codepush_test # 直接推送本地master分支到目标仓库,无需重复初始化仓库、提交文件 - git push target master:master post_build: commands: - echo "Cross account CodeCommit push completed at $(date)"
排错指引
- 如果调整配置后仍报仓库不存在,可在build阶段临时添加命令
aws codecommit get-repository --repository-name crsaccnt_codepush_test --region us-east-1,如果该命令执行失败,说明跨账号角色的信任策略、权限配置有误,优先修复IAM配置后再调试Git操作 - 确认共享账号目标仓库
crsaccnt_codepush_test所属区域为us-east-1,区域配置错误也会触发仓库不存在报错 - 禁止在克隆得到的仓库目录内重复执行
git init操作,会破坏原有仓库元数据,导致提交历史丢失、分支识别异常 - 如果共享账号目标仓库为非空仓库,首次推送前需先拉取目标仓库代码合并,解决分支冲突后再执行推送
内容的提问来源于stack exchange,提问作者Yuva
相关产品推荐
相关产品推荐

