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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 17:30:54