【问题标题】:AWS ECR GetAuthorizationTokenAWS ECR 获取授权令牌
【发布时间】:2016-11-29 22:49:25
【问题描述】:

我已尝试按照 AWS 说明为我的用户设置 ECR 授权,向我的用户提供 AmazonEC2ContainerRegistryFullAccess 策略。

但是,当我尝试在我的 PC 上运行 aws ecr get-login 时,我收到一个我没有权限的错误。

An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: arn:aws:iam::ACCOUNT_NUMBER:user/MY_USER is not authorized to perform: ecr:GetAuthorizationToken on resource: *

我做错了什么?

【问题讨论】:

  • MFA 也可能导致此问题
  • 您可以使用“aws sts get-caller-identity”。返回有关其凭证用于调用操作的 IAM 用户或角色的详细信息。

标签: amazon-web-services amazon-ec2 aws-cli amazon-ecr


【解决方案1】:

您必须将策略附加到您的 IAM 角色。

我附加了 AmazonEC2ContainerRegistryFullAccess 并且它有效。

【讨论】:

  • 我发现启用 2FA 后,没有选项可以使用 aws ecr get-login,一旦我从帐户中删除了 2FA,我就获得了授权令牌。
  • @Y.Eliash 如何禁用 2FA?我在哪里可以找到那个窗口。 AWS 是巨大的。
  • 对于未来的读者 - 如果您的角色只需要阅读(而不是编写或编辑),那么 AmazonEC2ContainerRegistryReadOnly 就足够了。
  • 是的,这也为我做了。保存了一天兄弟:-D
  • 救了我一天 m8
【解决方案2】:

这是一个完整的答案,在我完成所有步骤之后 - 我能够使用 ECR

错误可能有两种含义:

1) 您未获得授权,因为您没有为您的用户附加 ECR 政策

2) 您未获得授权,因为您使用的是 2FA,并且使用 cli 不安全,除非您设置临时会话令牌

这里是获取访问权限的所有步骤列表(包括处理 2FA)

  1. 首先,您必须创建一个允许您访问 ECR 中的 GetAuthorizationToken 操作的策略。
  2. 将此策略附加到用户或组(组/角色总是恕我直言更好的方法,我对角色的投票,例如 DevOps)
  3. 确保在您的环境中设置了 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY。我建议使用分离凭据和配置文件的 aws 文件夹。

如果您启用了 2FA

  1. 您需要使用此命令生成会话令牌 aws sts get-session-token --serial-number arn-of-the-mfa-device --token-code code-from-tokenarn-of-the-mfa-device 可以在您的个人资料中找到,2FA 部分。 Token,是设备生成的token。
  2. 使用收到的 AccessKeyIdSecretAccessKeySessionToken 更新 aws 凭据。 AWS 建议使用任一 cron 作业来刷新令牌,这意味着如果您这样做是在测试东西,您的 prod 资源很可能没有启用 2FA。您可以通过提供--duration-seconds 来增加会话,但最多只能增加 36 小时。一个很好的解释可以在authenticate-mfa-cli找到

这应该可以完成工作

【讨论】:

    【解决方案3】:

    正如错误描述中显示的那样,我必须在我的策略中允许操作“GetAuthorizationToken”。

        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "ecr:GetAuthorizationToken",
            "Resource": "*"
        }
    

    注意:这不是我的完整政策,而是声明的一个小节。

    【讨论】:

      【解决方案4】:

      我最终使用了 AmazonEC2ContainerRegistryPowerUser,这似乎比完全访问权限更好。以下是我在 2019 年 6 月发现的政策:

      【讨论】:

        【解决方案5】:

        我发现当启用 2FA 时,没有使用 aws ecr get-login 的选项,一旦我从我的帐户中删除了 2FA,我就获得了授权令牌

        【讨论】:

        • aws get-session-token 可以从 MFA 获取令牌 - docs.aws.amazon.com/cli/latest/reference/sts/…
        • 如果您已设置 2FA 并在本地 .aws/credentials 文件中使用了自定义 aws 配置文件,则必须提供要使用的此配置文件的名称。就我而言,我有一个名为“MFA”的配置文件,所以我必须在几乎每个命令中添加一个“--profile mfa”。或者,您可以在当前 shell 中“导出 AWS_PROFILE=mfa”。因此,在我的情况下,使用自定义 aws 配置文件运行此命令:“aws ecr get-login --region eu-central-1 --no-include-email --profile mfa” - 使用您的配置文件名称更改“mfa”
        • 如果启用了 MFA,请设置您的会话令牌 -> aws.amazon.com/premiumsupport/knowledge-center/…
        【解决方案6】:

        当我尝试将容器推送到存储库中时,我遇到了与 ECS 相同的问题。

        为了解决这个问题,我将这个附加到我的 IAM 角色:AmazonECS_FullAccess

        【讨论】:

          【解决方案7】:

          对我来说:

                        - Effect: Allow
                          Sid: VisualEditor2
                          Action:
                            - ecr:GetAuthorizationToken
                            - ecr:BatchGetImage
                            - ecr:GetDownloadUrlForLayer
                          Resource: "*"
          
          

          【讨论】:

            【解决方案8】:

            我有同样的问题,但我之前只将permission boundary 设置为 s3,这会导致问题。

            删除了permission boundary,它就像一个魅力

            【讨论】:

              【解决方案9】:

              这是我的人EC2InstanceProfileForImageBuilderECRContainerBuilds

              【讨论】:

                【解决方案10】:

                用户必须拥有 ECR 上所有资源的 GetAuthorizationToken。为了使策略更严格,您可以仅将所有操作授予所需的注册表,并且仅将 ecr:GetAuthorizationToken 授予所有资源。这是附加到您的用户的示例策略:

                            {
                                "Version": "2012-10-17",
                                "Statement": [
                                    {
                                        "Action": [
                                            "ecr:BatchCheckLayerAvailability",
                                            "ecr:BatchGetImage",
                                            "ecr:CompleteLayerUpload",
                                            "ecr:GetDownloadUrlForLayer",
                                            "ecr:InitiateLayerUpload",
                                            "ecr:PutImage",
                                            "ecr:UploadLayerPart"
                                        ],
                                        "Effect": "Allow",
                                        "Resource": "<REPOSITORY_ARN_HERE>"
                                    },
                                    {
                                        "Action": [
                                            "ecr:GetAuthorizationToken",
                                        ],
                                        "Effect": "Allow",
                                        "Resource": "*"
                                    }
                
                                ]
                            }
                

                【讨论】:

                  猜你喜欢
                  • 2018-03-25
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-01-01
                  • 2021-08-15
                  • 2016-10-13
                  • 2018-06-13
                  • 2021-07-27
                  • 1970-01-01
                  相关资源
                  最近更新 更多