我有两个帐户,a1
和a2
。
我在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工作原理的基本知识?
答案 0 :(得分:1)
您需要在帐户a1
和a2
之间建立信任关系。
从您的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实例担任该角色,因为它驻留在另一个帐户中(甚至不确定是否完全可以这样做)。
您可以按照以下步骤进行操作:
RoleForB
)来信任帐户B ,并附加到为角色创建了 IAM策略,以使其能够在帐户A 中执行某些读取操作。 e.g ReadOnlyAccess
AssumeRoleInA
),并附加了一个策略以使其能够承担在帐户A 中创建的角色。ec2-profile
与步骤2中创建的IAM角色(AssumeRoleInA
)相关联。aws sts assume-role --role-arn "arn:aws:iam::Account_A_ID:role/RoleForB" --role-session-name "EC2FromB"
登录此EC2实例,以承担帐户A 中的角色。stdout
)。然后,您可以将这些值分配给环境变量(AWS_ACCESS_KEY_ID
,AWS_SECRET_ACCESS_KEY
,AWS_SESSION_TOKEN
)所以让我们逐步检查上面提到的配置,但要详细了解一些模式:
RoleForB
的角色并将ReadOnlyAccess
权限附加到帐户B 它。{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::Account_B_ID:root"},
"Action": "sts:AssumeRole"
}
}
AssumeRoleInA
的角色,然后附加相应的policy
以使其担任名为{{1 }}中的帐户A 。RoleForB
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": [
"arn:aws:iam::Account_A_ID:role/RoleForB"
]
}
]
}
。AssumeRoleInA
{
"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 pull
和docker push
进行访问。