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

问题描述 投票:0回答:1

使用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在目标存储桶中上载。这是太多的网络 - 所以想知道什么是更好的选择,如果有的话?

java amazon-web-services amazon-s3
1个回答
3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.