gpt4 book ai didi

java - S3 跨账户访问 : Reading an object in own bucket, 由另一个账户写入

转载 作者:行者123 更新时间:2023-12-01 01:03:26 24 4
gpt4 key购买 nike

背景:

我有两个账号 AB .帐号 A拥有一个桶 my-bucket .我给了账号B访问此存储桶 -- 帐户 B可以从该存储桶读取对象和向该存储桶写入对象。这按预期工作。

但是,帐号A只能读取 my-bucket 中的那些对象它自己写的。尽管它甚至可以列出帐户 B 的那些对象。已经写了,它不能读那些。

以下是我尝试从 my-bucket 下载所有对象时看到的内容将 AWS CLI 与 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 编写的)。

到目前为止我尝试过的:

我研究了以下两个问题:
  • Amazon S3 file 'Access Denied' exception in Cross-Account :其中一条评论要求用 acl 做一个 putObject ,但没有说明是什么 acl .
  • S3: User cannot access object in his own s3 bucket if created by another user :这谈到阻止帐户 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-
    control
    相同?
  • 最佳答案

    这篇文章有很多观点,但没有一个答案!

    为了帮助其他人,我发布了一些我从目前的研究中发现的解决方法。在这些变通方法之后,帐户 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是帐户的规范 ID A .请注意,我们知道的不是 AWS 账户 ID,我不知道比以下更好的方法来找出这一点
    aws s3api get-object-acl --bucket my-bucket --key PN1491264000000.csv --output text --profile accountA

    在我看来,这仍然不是一个优雅的解决方案,我相信存在更好的解决方案。一旦我找到更好的东西,我会编辑这个答案。

    编辑:

    可以更优雅地找到bucket owner的Canonical ID如下:
    String s3BucketOwnerId = s3Client.getBucketAcl(S3_BUCKET).getOwner().getId();

    关于java - S3 跨账户访问 : Reading an object in own bucket, 由另一个账户写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45805514/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com