使用this请求在同一区域中的s3中的存储桶中复制对象更容易:
AmazonS3 pS3client = new AmazonS3Client(new BasicAWSCredentials(/*supressed*/));
String key = "key";
pS3client.copyObject("sourceBucket", key, "destinationBucket", key);
但是当sourceBucket
是私有访问存储桶并且需要预先签名的URL来访问存储桶中的对象时,上述请求将失败。
由于私有访问,文件的访问被拒绝。
com.amazonaws.services.s3.model.AmazonS3Exception:拒绝访问(服务:Amazon S3;状态代码:403;错误代码:AccessDenied;请求ID:<>),S3扩展请求ID:<> at com.amazonaws.http .AmazonHttpClient $ RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1579)at com.amazonaws.http.AmazonHttpClient $ RequestExecutor.executeOneRequest(AmazonHttpClient.java:1249)at com.amazonaws.http.AmazonHttpClient $ RequestExecutor.executeHelper(AmazonHttpClient.java:1030 )com.amazonaws.http.AmazonHttpClient $ RequestExecutor.doExecute(AmazonHttpClient.java:742)at com.amazonaws.http.AmazonHttpClient $ RequestExecutor.executeWithTimer(AmazonHttpClient.java:716)at com.amazonaws.http.AmazonHttpClient $ RequestExecutor。执行(AmazonHttpClient.java:699)com.amazonaws.http.AmazonHttpClient $ RequestExecutor.access $ 500(AmazonHttpClient.java:667)com.amazonaws.http.AmazonHttpClient $ RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649)
如何在copyObject请求中发出s3请求或提供预先签名的参数,以便从私有桶复制到公共destinationBucket
?
对于解决方法,显而易见的解决方案是使用GeneratePresignedUrlRequest
并获取预先签名的URL以访问sourceBucket的对象,在临时文件中下载并使用putObject
在目标存储桶中上载。这是太多的网络 - 所以想知道什么是更好的选择,如果有的话?
s3:CopyObject
命令无法使用预先签名的URL。
要使用s3:CopyObject
命令,正在使用的AWS凭证只需要对源存储桶具有读访问权限,并且对目标存储桶具有写访问权限。
如果两个存储桶位于同一个AWS账户中,那么这应该是直截了当的。
但是,如果存储桶位于不同的帐户中,则您需要在源存储桶上应用存储桶策略,该存储桶策略授予对拥有目标存储桶的AWS账户的读取权限,并使用拥有目标存储桶的AWS账户执行副本。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DelegateS3Access",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::BUCKET_NAME",
"arn:aws:s3:::BUCKET_NAME/*"
]
}
]
}
将BUCKET_NAME
替换为源S3存储桶的名称,将123456789012
替换为目标AWS账户的AWS账户ID。编辑完成后,在源S3存储桶上应用此策略。