Java S3跨帐户访问:读取自己bucket中的对象,由另一个帐户写入
背景: 我有两个帐户Java S3跨帐户访问:读取自己bucket中的对象,由另一个帐户写入,java,amazon-web-services,amazon-s3,Java,Amazon Web Services,Amazon S3,背景: 我有两个帐户A和B。账户A拥有一个bucketmy bucket。我已授予accountB访问此bucket的权限--accountB可以从该bucket读取对象并将对象写入该bucket。这是预期的工作 但是,帐户A只能读取它自己编写的my bucket中的对象。尽管它甚至可以列出accountB编写的对象,但它无法读取这些对象 下面是我尝试使用AWS CLI和AWS accountA配置从my bucket下载所有对象时看到的内容 download: s3://my-bucket/P
A
和B
。账户A
拥有一个bucketmy bucket
。我已授予accountB
访问此bucket的权限--accountB
可以从该bucket读取对象并将对象写入该bucket。这是预期的工作
但是,帐户A
只能读取它自己编写的my bucket
中的对象。尽管它甚至可以列出accountB
编写的对象,但它无法读取这些对象
下面是我尝试使用AWS CLI和AWS accountA
配置从my bucket
下载所有对象时看到的内容
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
而不授予所有权访问权。仅仅设置此约束是否有助于我获得完全访问权限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一样吗-
控件
这篇文章有这么多的观点,但没有一个答案 为了帮助其他人,我发布了一些我从目前的研究中发现的解决方法。在这些解决方法之后,account
A
能够访问accountB
创建的对象
在accountB
中运行的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);
这里的S3\u BUCKET\u OWNER\u ID
是账户A
的规范ID。请注意,我们知道的不是AWS帐户ID,我也不知道比下面更好的方法
aws s3api get-object-acl --bucket my-bucket --key PN1491264000000.csv --output text --profile accountA
在我看来,这仍然不是一个优雅的解决方案,我相信存在更好的解决方案。我会编辑这个答案,一旦我找到更好的
编辑:
bucket所有者的规范ID可以更优雅地找到,如下所示:
String s3BucketOwnerId = s3Client.getBucketAcl(S3_BUCKET).getOwner().getId();