【问题标题】:PutObject with S3ObjectPutObject 与 S3Object
【发布时间】:2021-07-21 05:48:37
【问题描述】:

我正在跨不同帐户复制 S3 对象。 虽然我可以使用S3Object s3object = sourceClient.getObject(bucket, key) 获取对象 如何上传相同的对象? putobject 只接受文件或输入流。 既然我只需要复制,有什么办法可以直接复制吗?

【问题讨论】:

    标签: java amazon-web-services amazon-s3


    【解决方案1】:

    你可以提取底层的S3ObjectInputStream,它继承自InputStream:

    S3ObjectInputStream inputStream = s3object.getObjectContent()
    

    【讨论】:

      【解决方案2】:

      在 S3 中复制对象时,请使用 copyObject()。它可以复制而无需下载和上传文件。它也适用于同一存储桶或不同存储桶,以及区域之间和 AWS 账户之间。

      在 AWS 账户之间复制时,您需要使用一组 AWS 凭证,该凭证有权从源存储桶读取写入目标存储桶。这可以通过两种方式完成:

      选项 1:从目标帐户中提取

      • 使用来自目标帐户的凭据
      • 确保这些凭据有权写入目标存储桶(在同一帐户中)
      • Bucket Policy 添加到 Source 存储桶,授予对正在使用的凭证(例如 IAM 用户)的 s3:GetObject 权限,例如:
      {
        "Version":"2012-10-17",
        "Statement":[
          {
            "Effect":"Allow",
            "Action": "s3:GetObject",
            "Principal": "arn:aws:iam::TARGET-ACCOUNT-ID:user/USERNAME",
            "Resource": "arn:aws:s3:::BUCKET-NAME/*"
          }
        ]
      }
      

      这告诉源存储桶允许目标账户中的 IAM 用户访问存储桶中的GetObject

      选项 2:从源帐户推送

      • 使用源帐户中的凭据
      • 确保这些凭据有权从源存储桶中读取(在同一帐户中)
      • 向目标存储桶添加一个存储桶策略,授予对正在使用的凭证(例如 IAM 用户)的 s3:PutObject 权限,例如:
      {
        "Version":"2012-10-17",
        "Statement":[
          {
            "Effect":"Allow",
            "Action": "s3:PutObject",
            "Principal": "arn:aws:iam::SOURCE-ACCOUNT-ID:user/USERNAME",
            "Resource": "arn:aws:s3:::BUCKET-NAME/*"
          }
        ]
      }
      
      • 重要提示:使用选项 2 复制对象时,请务必指定 ACL='bucket-owner-full-control'。这将使目标帐户成为对象的“所有者”。如果您这样做,则目标帐户将无法管理/删除该对象。仅在将对象“推送”到其他帐户时才需要。

      【讨论】:

      【解决方案3】:

      这里的用例是什么?您使用的是哪个 SDK?

      可能有可用的“复制到”方法,例如 https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/examples-s3-objects.html#copy-an-object,前提是您已正确设置跨账户访问权限。

      否则应该可以将对象内容作为流 (https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/model/S3Object.html#getObjectContent--) 获取并将其用作源。

      【讨论】:

      • 如何设置权限?我从 API Gateway 获取源角色 ARN 和 S3 URI 到我的 lambda。
      • 文档here 几乎涵盖了所有场景..
      猜你喜欢
      • 2016-12-29
      • 2018-10-02
      • 2012-01-11
      • 2018-09-18
      • 1970-01-01
      • 2023-01-06
      • 2015-09-26
      • 2018-08-04
      • 1970-01-01
      相关资源
      最近更新 更多