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

AWS ECS容器内用Kaniko推送镜像至ECR遇401未授权错误求助

解决ECS容器内Kaniko推送ECR镜像401未授权问题

核心问题分析

ECS服务可正常操作SQS、S3,说明任务执行角色的基础AWS权限没问题,401错误集中在Kaniko对ECR的推送认证环节,主要原因包括认证token未正确传递、ECR推送权限缺失、Kaniko参数配置错误三类。

解决方案步骤

1. 补全ECR推送所需IAM权限

确保ECS任务执行角色包含以下ECR相关权限(遵循最小权限原则,可限定到具体仓库):

  • ecr:GetAuthorizationToken
  • ecr:BatchCheckLayerAvailability
  • ecr:GetDownloadUrlForLayer
  • ecr:BatchGetImage
  • ecr:InitiateLayerUpload
  • ecr:UploadLayerPart
  • ecr:CompleteLayerUpload
  • ecr:PutImage

2. 修正认证token的赋值逻辑

原脚本中aws ecr get-login-password仅执行但未将结果赋值给${password}变量,这是导致认证失败的关键。需修改为:

password=$(aws ecr get-login-password --region ${region})

3. 清理无效Kaniko参数

移除不必要的不安全参数(ECR为合法HTTPS服务,这些参数会干扰认证流程):

  • --insecure
  • --skip-tls-verify
  • --insecure-pull
  • 无需同时配置--registry-mirror和--registry,保留--registry指向ECR地址即可

4. 验证环境变量正确性

在脚本开头添加调试输出,确认关键变量无空值或错误:

echo "ECR Registry: ${ecr_reg}"
echo "Destination Image: ${repo_tag_name}"
echo "AWS Region: ${region}"

修正后的完整脚本

# 获取ECR认证Token
password=$(aws ecr get-login-password --region ${region})

# 调试输出关键变量
echo "ECR Registry: ${ecr_reg}"
echo "Destination Image: ${repo_tag_name}"

# 执行Kaniko构建推送
/kaniko/executor --dockerfile Dockerfile_UK \
    --destination ${repo_tag_name} \
    --build-arg account_id=${account} \
    --build-arg env=${exec_stage} \
    --build-arg python_version=${python_version} \
    --build-arg model_class=${model_class} \
    --build-arg model_pickle=${model_pickle} \
    --build-arg model_attributes=${model_attributes} \
    --build-arg requirements=${requirements} \
    --build-arg predictor=${predictor} \
    --build-arg http_proxy=${http_proxy} \
    --build-arg https_proxy=${https_proxy} \
    --build-arg region=${region} \
    --cache=true \
    --verbosity=info \
    --snapshotMode=redo \
    --cleanup \
    --use-new-run \
    --tarPath=/kaniko/saved_images \
    --digest-file=/kaniko/digest \
    --oci-layout-path=/kaniko/oci-layout \
    --log-format=text \
    --log-timestamp \
    --skip-unused-stages=true \
    --registry=${ecr_reg} \
    --username=AWS \
    --password=${password}

额外排查点

  • 登录ECS容器手动执行aws ecr get-login-password,确认能返回有效token;用curl -u AWS:$(aws ecr get-login-password --region ${region}) https://${ecr_reg}/v2/测试,返回200则认证正常。
  • 检查ECR仓库的资源策略,确保允许任务执行角色的ARN进行PutImage等推送操作。

内容的提问来源于stack exchange,提问作者creator

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 04:50:16