背景
我有两个帐户A
和B
。帐户A
拥有广告资源my-bucket
。我已对帐户B
提供帐户访问权限 - 帐户B
可以读取对象并将对象写入此存储桶。这是按预期工作的。
但是,帐户A
只能读取my-bucket
中自己编写的对象。虽然它甚至可以列出帐户B
已写入的对象,但它无法读取这些对象。
以下是我尝试使用AWS CLI通过帐户my-bucket
的AWS配置从A
下载所有对象时的内容。
download: s3://my-bucket/PN1492646400000.csv to tp/PN1492646400000.csv
download: s3://my-bucket/PN1491264000000.csv to tp/PN1491264000000.csv
download: s3://my-bucket/PN1493942400000.csv to tp/PN1493942400000.csv
download failed: s3://my-bucket/PN1503346865232.csv to tp/PN1503346865232.csv An error occurred (AccessDenied) when calling the GetObject operation: Access Denied
download: s3://my-bucket/PN1495389670000.csv to tp/PN1495389670000.csv
download: s3://my-bucket/PN1496685403000.csv to tp/PN1496685403000.csv
download: s3://my-bucket/PN1497945130000.csv to tp/PN1497945130000.csv
download: s3://my-bucket/PN1500508800000.csv to tp/PN1500508800000.csv
正如我所看到的,我可以下载所有文件,但PN1503346865232.csv
(这是由帐户B
使用java方法putObject
编写的)。
到目前为止我尝试了什么:
我调查了以下两个问题:
acl
执行putObject,但未指定acl
。my-bucket
而不授予所有权权限。 只是放置此约束可以帮助我获得完全访问权限吗? 这是我在将对象放入java代码时尝试放置ACL的方法。
AccessControlList acl = new AccessControlList();
acl.grantPermission(new CanonicalGrantee(S3_BUCKET_OWNER_ID), Permission.FullControl);
PutObjectRequest putObjectRequest = new PutObjectRequest(S3_BUCKET, remoteCleanedPrismFilename, fileStream, null)
.withAccessControlList(acl);
s3Client.putObject(putObjectRequest);
抛出异常说法:com.amazonaws.services.s3.model.AmazonS3Exception: Invalid id
问题:
bucket-owner-full-
control
相同? 答案 0 :(得分:1)
这篇文章得到了很多观点,但没有一个答案!
为了帮助其他人,我发布了一些我迄今为止从研究中发现的解决方法。完成这些变通办法后,帐户A
就可以访问帐户B
创建的对象。
在帐户java
中运行的B
代码中,我明确地在要创建的对象上设置ACL。
AccessControlList acl = new AccessControlList();
acl.grantPermission(new CanonicalGrantee(S3_BUCKET_OWNER_ID), Permission.FullControl);
PutObjectRequest putObjectRequest = new PutObjectRequest(S3_BUCKET, remoteCleanedPrismFilename, fileStream, null)
.withAccessControlList(acl);
s3Client.putObject(putObjectRequest);
此处S3_BUCKET_OWNER_ID
是帐户A
的规范ID。请注意,它不是我们所知道的AWS账户ID,我不知道更好的方法,找到这个,而不是以下
aws s3api get-object-acl --bucket my-bucket --key PN1491264000000.csv --output text --profile accountA
根据我的说法,这仍然不是一个优雅的解决方案,我相信更好的存在。一旦找到更好的东西,我会编辑这个答案。
修改强>
可以更优雅地找到铲斗拥有者的规范ID,如下所示:
String s3BucketOwnerId = s3Client.getBucketAcl(S3_BUCKET).getOwner().getId();