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:<> ; 在com.amazonaws.http.AmazonHttpClient $ RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1579) 在com.amazonaws.http.AmazonHttpClient $ RequestExecutor.executeOneRequest(AmazonHttpClient.java:1249) 在com.amazonaws.http.AmazonHttpClient $ RequestExecutor.executeHelper(AmazonHttpClient.java:1030) 在com.amazonaws.http.AmazonHttpClient $ RequestExecutor.doExecute(AmazonHttpClient.java:742) 在com.amazonaws.http.AmazonHttpClient $ RequestExecutor.executeWithTimer(AmazonHttpClient.java:716) 在com.amazonaws.http.AmazonHttpClient $ RequestExecutor.execute(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
在目标中上传桶。那是太多的网络 - 所以想知道什么是更好的选择呢?
答案 0 :(得分:3)
s3:CopyObject
命令无法使用预先签名的网址。
为了使用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存储桶上应用此政策。