如何从另一个账户的EC2实例访问AWS ECR?

Ric*_*fer 3 amazon-ec2 amazon-web-services amazon-ecr

我有两个帐户,a1并且a2.

我在 a1, 中有一个 EC2 实例a1.ec2。它在该帐户中承担某些角色a1.r。此角色具有对所有 ECR 操作的完全访问权限。

现在,我有一个图像注册表 (ECR),a2并且希望能够从a1.ec2.

因此,我通过 ssh 进入该实例,并为了测试我运行的访问

aws ecr describe-repositories --region <my-region> --registry-id <id of a2>
Run Code Online (Sandbox Code Playgroud)

但我得到了错误

An error occurred (AccessDeniedException) when calling the DescribeRepositories operation: User: arn:aws:sts::<id of a1>:assumed-role/a1.r/i-075fad654b998275c is not authorized to perform: ecr:DescribeRepositories on resource: arn:aws:ecr:*:*:repository/*
Run Code Online (Sandbox Code Playgroud)

然而,这个权限确实是授予了该角色的a1.r。我通过能够a1很好地访问 ECR 来验证这一点。

另外,我喜欢访问的 ECR 具有以下权限策略,因此我确保问题不是由以下 ECR 引起的a2

    {
      "Sid": "new statement",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<id of a1>:root"
      },
      "Action": "*"
    },
    {
      "Sid": "new statement",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<id of a1>:role/a1.r"
      },
      "Action": "*"
    }
Run Code Online (Sandbox Code Playgroud)

我查看了https://serverfault.com/questions/897392/ecr-cross-account-pull-permissions,其中解决方案似乎是创建跨帐户角色。尽管我可以创建这样的角色a2.cross-acc-r,但我不知道如何为aws ecrcli 命令承担该角色。我不希望 EC2 实例承担该角色,因为它驻留在不同的帐户中(甚至不确定这是否可能)。

我是否缺乏有关 AWS IAM 工作原理的一些基本知识?

Ric*_*fer 6

如果您想要将镜像从一个账户的 EC2 实例拉取和推送到另一个账户的 ECR,并且不需要完整的aws ecrCLI 功能,您可以通过 docker 来完成此操作。例如,如果您希望 Jenkins 根据不同 AWS 账户中的目标环境(生产、暂存)将构建的映像推送到 ECR 中。

通过 docker 执行此操作的记录位于https://aws.amazon.com/premiumsupport/knowledge-center/ secondary-account-access-ecr/

简而言之,在 ECR 存储库中,您向其他帐户授予所需的权限。

然后,您将获得一个临时身份验证令牌,通过以下方式向 docker 授权 ECR:

$(aws ecr get-login --registry-ids <account ID> --region <your region> --no-include-email)
Run Code Online (Sandbox Code Playgroud)

之后,您可以使用docker pulldocker push来访问它。