如何将aws s3中的对象从私有桶复制到公共桶而不下载?

时间:2017-12-20 13:25:45

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

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在目标中上传桶。那是太多的网络 - 所以想知道什么是更好的选择呢?

1 个答案:

答案 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存储桶上应用此政策。