【发布时间】:2021-07-21 05:48:37
【问题描述】:
我正在跨不同帐户复制 S3 对象。
虽然我可以使用S3Object s3object = sourceClient.getObject(bucket, key) 获取对象
如何上传相同的对象?
putobject 只接受文件或输入流。
既然我只需要复制,有什么办法可以直接复制吗?
【问题讨论】:
标签: java amazon-web-services amazon-s3
我正在跨不同帐户复制 S3 对象。
虽然我可以使用S3Object s3object = sourceClient.getObject(bucket, key) 获取对象
如何上传相同的对象?
putobject 只接受文件或输入流。
既然我只需要复制,有什么办法可以直接复制吗?
【问题讨论】:
标签: java amazon-web-services amazon-s3
你可以提取底层的S3ObjectInputStream,它继承自InputStream:
S3ObjectInputStream inputStream = s3object.getObjectContent()
【讨论】:
在 S3 中复制对象时,请使用 copyObject()。它可以复制而无需下载和上传文件。它也适用于同一存储桶或不同存储桶,以及区域之间和 AWS 账户之间。
在 AWS 账户之间复制时,您需要使用一组 AWS 凭证,该凭证有权从源存储桶读取和写入目标存储桶。这可以通过两种方式完成:
选项 1:从目标帐户中提取
{
"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:从源帐户推送
{
"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/*"
}
]
}
ACL='bucket-owner-full-control'。这将使目标帐户成为对象的“所有者”。如果您不这样做,则目标帐户将无法管理/删除该对象。仅在将对象“推送”到其他帐户时才需要。【讨论】:
这里的用例是什么?您使用的是哪个 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--) 获取并将其用作源。
【讨论】: