我有两个帐户,帐户ACCOUNTSAAA和ACCOUNTBBB。帐户ACCOUNTAAAAA中存在一个bucket(BUCKETAAAA(,并且在ACCOUNTBBB中具有角色(ROLEBBBB(的实例需要能够从中读取。
我已经向bucket添加了以下权限:
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::ACCOUNTBBBB:role/ROLEBBBB"
},
"Action": [
"s3:*"
],
"Resource": "arn:aws:s3:::BUCKETAAAA/*"
}
我对ACOUNTBBBB
:中的角色具有以下权限
"Sid": "",
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::BUCKETAAAA/",
"arn:aws:s3:::BUCKETAAAA/*"
]
}
我的假设是,我应该能够在附加了IAM角色的EC2实例上运行aws s3 ls s3://BUCKETAAAA
,并查看BUCKETAAAA的内容。当我尝试这个时,我得到了An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied
。
我在这里错过了什么?
为了重现您的情况,我做了以下操作:
- 在Account-B中创建Role-B,EC2作为受信任实体("允许EC2实例代表您调用AWS服务"(和授予访问Bucket-a的策略
- 在Account-A中创建Bucket-A
- 向Bucket-a添加Bucket策略,该策略允许访问Role-B
- 已将角色B分配给Amazon EC2实例
Bucket-A上的Bucket策略为:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<account>:role/role-b"
},
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::bucket-a",
"arn:aws:s3:::bucket-a/*"
]
}
]
}
角色B的权限为:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BucketA",
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::bucket-a",
"arn:aws:s3:::bucket-a/*"
]
}
]
}
我能够成功使用aws s3 ls s3://bucket-a
,并能够将文件复制到Bucket-A。
我看到的与您尝试的主要区别是,您的Bucket Policy只授予以下内容的权限:
"Resource": "arn:aws:s3:::BUCKETAAAA/*"
这意味着"Bucket-A中的任何东西",但不包括Bucket-A本身。命令aws s3 ls s3://BUCKETAAAA
对存储桶进行操作,角色对该存储桶没有权限。
因此,您还应该为bucket本身添加权限:
"Resource": [
"arn:aws:s3:::BUCKETAAAA",
"arn:aws:s3:::BUCKETAAAA/*"