使用aws-vault推送Docker镜像到ECR遇权限及MFA验证失败问题
核心问题根因
- 首次触发
AccessDeniedException是因为你直接用identity对应的IAM用户身份调用ECR接口,ECR权限实际绑定在你需要Assume的角色上,IAM用户本身没有直接的ECR操作权限,所以触发显式拒绝。 - 后续MFA验证失败+配置报错是因为配置文件存在拼写错误、使用了废弃参数,同时缺少必要的MFA配置,或时间同步问题导致TOTP码失效。
解决步骤
1. 修正.aws/config配置
你之前的配置存在拼写错误、参数废弃、缺少必要配置项的问题,替换为如下配置:
[profile identity] # 替换为你IAM用户绑定的MFA设备序列号,和报错里返回的MFA ARN保持一致即可 mfa_serial = arn:aws:iam::xxxxxxxxxxxx:mfa/xxxxxx.xxxx@xxxxxx.com region = us-west-2 [profile xx-xxxx-services-monitoring] role_arn = arn:aws:iam::xxxxxxxxxxxx:role/XXMonitoring source_profile = identity # 替换已废弃的parent_profile参数 include_profile = identity # 你调用的xx-xxxx-main-admin profile需要补充配置,替换为对应角色ARN [profile xx-xxxx-main-admin] role_arn = arn:aws:iam::[对应账号ID]:role/[对应admin角色名] source_profile = identity include_profile = identity
2. 解决MFA验证失败问题
按优先级排查:
- 同步设备时间:MFA TOTP码是时间敏感的,Mac系统时间和标准时间差超过30秒就会验证失败,打开「系统设置→通用→日期与时间」,开启「自动设置日期与时间」,确保时间准确。
- 确认MFA条目有效性:如果你之前重新绑定过MFA,要确保Authenticator里当前使用的条目是最新绑定的,旧条目生成的码会永久失效。
- 避开码切换窗口:输入验证码时,尽量选择刚刷新的新码,避免刚好碰到30秒切换的时间窗口,输入时不要带空格、多余字符。
- 清除旧缓存:修改配置后先执行
aws-vault clear清除本地缓存的无效会话,避免旧凭证干扰。
3. 执行正确的ECR登录命令
你之前的命令存在两处错误:没有用有权限的角色profile、登录地址多了仓库后缀,使用以下命令即可:
# 用有权限的角色profile获取登录密码,需要用什么角色就替换对应的profile名 ENCRYPTED_PASSWORD=$(aws-vault exec xx-xxxx-main-admin -- aws ecr get-login-password --region us-west-2) # 执行docker登录,注意ECR地址不要加/my-ecr等仓库后缀,登录是针对整个Registry的 echo $ENCRYPTED_PASSWORD | docker login -u AWS --password-stdin xxxxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com
也可以使用一步登录的简化命令:
aws-vault exec xx-xxxx-main-admin -- aws ecr get-login-password --region us-west-2 | docker login -u AWS --password-stdin xxxxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com
4. 推送镜像
登录成功后正常打标签推送即可:
# 给本地镜像打ECR标签,替换对应的镜像名、版本、仓库名 docker tag [本地镜像名:版本] xxxxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/[仓库名]:[版本] # 推送镜像 docker push xxxxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/[仓库名]:[版本]
内容的提问来源于stack exchange,提问作者netthing
相关产品推荐
相关产品推荐

