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
拥有一个bucket
my bucket
。我已授予account
B
访问此bucket的权限--account
B
可以从该bucket读取对象并将对象写入该bucket。这是预期的工作

但是,帐户
A
只能读取它自己编写的
my bucket
中的对象。尽管它甚至可以列出account
B
编写的对象,但它无法读取这些对象

下面是我尝试使用AWS CLI和AWS account
A
配置从
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
    的内容
  • :这是关于停止帐户B将对象放入
    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

    问题:

  • 我想知道我应该如何获得此ID。它不是aws帐户ID,即10-12位数字的号码吗
  • 即使我找到了这个ID,给这个ACL和
    bucket owner full一样吗-
    控件

  • 这篇文章有这么多的观点,但没有一个答案

    为了帮助其他人,我发布了一些我从目前的研究中发现的解决方法。在这些解决方法之后,account
    A
    能够访问account
    B
    创建的对象

    在account
    B
    中运行的
    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();