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

时间:2019-09-17 13:13:35

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

我有两个帐户,a1a2

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

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

因此,我进入该实例并为了测试我运行的访问权限

aws ecr describe-repositories --region <my-region> --registry-id <id of a2>

但是我得到了错误

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/*

但是,确实将此权限授予角色a1.r。我可以通过访问a1中的ECR来验证这一点。

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

    {
      "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": "*"
    }

我看过https://serverfault.com/questions/897392/ecr-cross-account-pull-permissions,解决方案似乎是创建跨帐户角色。尽管我可以创建这样的角色a2.cross-acc-r,但是我无法弄清楚如何为aws ecr cli命令承担该角色。我不希望EC2实例担任该角色,因为它驻留在另一个帐户中(甚至不确定是否完全可以这样做)。

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

3 个答案:

答案 0 :(得分:1)

您需要在帐户a1a2之间建立信任关系。

从您的a2控制台转到IAM服务,创建一个新角色:

1)受信任的实体:另一个AWS账户(输入账户a1的ID)

2)策略:AmazonEC2ContainerRegistryPowerUser(或满足您要求的其他用户)

a2控制台转到ECR服务,您需要编辑权限:

{
      "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 a2>:role/a2.r"
      },
      "Action": "*"
    }
}

答案 1 :(得分:0)

  

我看过https://serverfault.com/questions/897392/ecr-cross-account-pull-permissions,解决方案似乎是创建跨帐户角色。尽管我可以创建这样的角色a2.cross-acc-r,但是我无法弄清楚如何为aws ecr CLI命令扮演这个角色。我不希望EC2实例担任该角色,因为它驻留在另一个帐户中(甚至不确定是否完全可以这样做)。

您可以按照以下步骤进行操作:

  1. 帐户A 中,我创建了一个角色(例如RoleForB)来信任帐户B ,并附加到为角色创建了 IAM策略,以使其能够在帐户A 中执行某些读取操作。 e.g ReadOnlyAccess
  2. 帐户B 中,我创建了一个角色(例如AssumeRoleInA),并附加了一个策略以使其能够承担在帐户A 中创建的角色。
  3. 帐户B 中,将您的EC2实例ec2-profile与步骤2中创建的IAM角色(AssumeRoleInA)相关联。
  4. 帐户B 中,使用命令aws sts assume-role --role-arn "arn:aws:iam::Account_A_ID:role/RoleForB" --role-session-name "EC2FromB"登录此EC2实例,以承担帐户A 中的角色
  5. li>
  6. 帐户B EC2终端中,当命令完成第4步。时,您可以看到访问密钥ID,秘密访问密钥和会话令牌< / strong>,无论您是手动路由还是使用脚本,都可以将其路由到任何地方(在我们的情况下为stdout)。然后,您可以将这些值分配给环境变量(AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN

所以让我们逐步检查上面提到的配置,但要详细了解一些模式:

  1. 如之前在帐户A 中所述,它通过创建名为RoleForB的角色并将ReadOnlyAccess权限附加到帐户B 它。
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Principal": {"AWS": "arn:aws:iam::Account_B_ID:root"},
        "Action": "sts:AssumeRole"
    }
}
  1. 帐户B 中,创建一个名为AssumeRoleInA角色,然后附加相应的policy以使其担任名为{{1 }}中的帐户A
RoleForB
  1. 帐户B 中,创建一个新的 EC2实例(如果尚不存在),并将其 ec2-profile IAM角色名为{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": [ "arn:aws:iam::Account_A_ID:role/RoleForB" ] } ] }
AssumeRoleInA
  1. 帐户B 中,使用以下命令登录此EC2实例,以承担帐户A 中的角色
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Principal": {"Service": "ec2.amazonaws.com"},
        "Action": "sts:AssumeRole"
    }
}

答案 2 :(得分:0)

如果要将图像从一个帐户的EC2实例中拉入并推送到另一个帐户的ECR中,并且不需要完整的aws ecr CLI功能,则可以通过docker进行操作。 例如,如果您希望Jenkins根据驻留在不同AWS账户中的目标环境(生产,登台)将构建的映像推送到ECR中。

https://aws.amazon.com/premiumsupport/knowledge-center/secondary-account-access-ecr/上记录了通过docker进行的操作

简单地,在ECR存储库中,您授予其他帐户所需的权限。

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

$(aws ecr get-login --registry-ids <account ID> --region <your region> --no-include-email)

此后,您可以使用docker pulldocker push进行访问。