You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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`

故障根因

  1. 默认开启的git-credential-helper: yes配置会自动绑定开发账号(CodeBuild运行角色所属账号)的Git凭证,后续即使导出了共享账号的临时访问凭证,Git HTTPS协议仍优先读取本地缓存的开发账号凭证,请求实际发到了开发账号的CodeCommit服务,自然找不到属于共享账号的目标仓库。
  2. 克隆开发账号仓库后重复执行git init,会破坏原有仓库的Git元数据,将克隆下来的完整仓库重置为全新空仓库,导致提交、分支逻辑异常。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 18:15:58