GitLab CI/CD推送Docker镜像至AWS ECR遇403 Forbidden错误求助
GitLab CI/CD推送Docker镜像到AWS ECR时403 Forbidden错误排查方案
问题描述
执行GitLab CI/CD流水线推送Docker镜像到AWS ECR时,出现以下错误:
unexpected status from HEAD request to https://xxxxxxxxxxx.dkr.ecr.af-south-1.amazonaws.com/v2/repo/manifests/6cf99375: 403 Forbidden
已验证关联IAM用户权限无问题,且GitLab Runner版本从17.3.1升级至17.5.2。
原始CI配置代码
.deploy-ecs: needs: [build] allow_failure: false script: - export AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} - export AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} - export AWS_DEFAULT_REGION=${REGION} - $(aws ecr get-login --no-include-email --region "${REGION}") - docker pull ${DOCKER_IMAGE_TAGGED} - echo "${ECR_REGISTRY}/${ECR_REM_REPO}" - docker tag ${DOCKER_IMAGE_TAGGED} "${ECR_REGISTRY}/${ECR_REM_REPO}:${CI_COMMIT_SHORT_SHA}" - docker push "${ECR_REGISTRY}/${ECR_REM_REPO}:${CI_COMMIT_SHORT_SHA}" - docker tag "${ECR_REGISTRY}/${ECR_REM_REPO}:${CI_COMMIT_SHORT_SHA}" "${ECR_REGISTRY}/${ECR_REM_REPO}" - docker push "${ECR_REGISTRY}/${ECR_REM_REPO}:latest" - aws ecs update-service --cluster "${ECS_CLUSTER}" --service "${ECS_SERVICE}" --force-new-deployment --region "${REGION}" - aws ecs update-service --cluster "${ECS_CLUSTER}" --service "${ECS_SERVICE_SCHEDULED}" --force-new-deployment --region "${REGION}"
排查及解决步骤
1. 替换ECR登录命令(优先尝试)
aws ecr get-login属于旧版命令,在新版AWS CLI和GitLab Runner环境中可能存在兼容性问题,建议替换为官方推荐的登录方式:
将原有登录行:
- $(aws ecr get-login --no-include-email --region "${REGION}")
替换为:
- aws ecr get-login-password --region "${REGION}" | docker login --username AWS --password-stdin "${ECR_REGISTRY}"
2. 验证IAM权限与ECR资源策略的匹配
- 确认IAM用户已附加包含以下权限的策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability", "ecr:PutImage", "ecr:InitiateLayerUpload", "ecr:UploadLayerPart", "ecr:CompleteLayerUpload" ], "Resource": "arn:aws:ecr:af-south-1:xxxxxxxxxxx:repository/repo" } ] } - 检查ECR仓库的资源策略,确保没有限制该IAM用户的操作,也没有添加IP白名单导致Runner所在IP无法访问
3. 检查Runner环境的Docker兼容性
- 确认GitLab Runner执行环境中的Docker客户端版本是否为最新,避免因API版本不匹配导致的权限验证失败
- 在Runner节点手动执行流水线中的Docker命令,排查是否是流水线环境变量注入或权限上下文的问题
4. 确认镜像及仓库信息正确性
- 验证
${ECR_REGISTRY}、${ECR_REM_REPO}、${CI_COMMIT_SHORT_SHA}等变量的值是否正确,确保仓库名称存在、标签格式合法 - 检查
docker pull ${DOCKER_IMAGE_TAGGED}步骤是否成功拉取镜像,避免因本地镜像缺失导致后续推送失败
内容的提问来源于stack exchange,提问作者K Ashish
相关产品推荐
相关产品推荐

