73

我已尝试按照 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: *

我做错了什么?

4

10 回答 10

87

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

我附加了 AmazonEC2ContainerRegistryFullAccess 并且它有效。

于 2016-09-25T08:03:11.313 回答
19

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

该错误可能有 2 个含义:

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. AccessKeyId使用接收的SecretAccessKey、 和SessionToken更新aws credendtails AWS 建议使用任一 cron 作业来刷新令牌,这意味着如果您这样做是在测试东西,那么您的 prod 资源很可能没有启用 2FA。您可以通过提供--duration-seconds但最多 36 小时来增加会话。在authenticate-mfa-cli可以找到一个很好的解释

这应该做的工作

于 2019-06-03T12:57:53.223 回答
13

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

于 2019-06-28T12:38:24.167 回答
12

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

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

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

于 2018-08-27T17:04:27.540 回答
10

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

于 2017-03-12T16:54:49.980 回答
2

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

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

于 2019-02-21T11:31:30.893 回答
1

为了我:

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

于 2021-05-03T12:26:12.177 回答
0

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

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

于 2019-07-01T11:04:55.250 回答
0

用户必须拥有 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": "*"
                    }

                ]
            }
于 2021-11-05T16:43:48.970 回答
0

这是我的家伙EC2InstanceProfileForImageBuilderECRContainerBuilds

于 2021-01-26T19:53:06.017 回答