2017-12-20 11 views
0

コピーオブジェクトがthisリクエストと簡単です:aws s3のオブジェクトをプライベートバケットからパブリックバケットにコピーせずにダウンロードするにはどうすればいいですか?同じ地域の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:アクセスが拒否されました(サービス:アマゾンS3;ステータスコード:403;エラーコード:アクセス拒否。要求ID:<>)、S3に拡張されたリクエストID:<> com.amazonaws.http.AmazonHttpClient $でcom.amazonaws.http.AmazonHttpClient $ RequestExecutor.executeOneRequest(AmazonHttpClient.java:1249) でcom.amazonaws.http.AmazonHttpClient $ RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1579) で RequestExecutor.executeHelper(AmazonHttpClient.java:1030) com.amazonaws.http.AmazonHttpClient $ RequestExecutor.doExecute(AmazonHttpClient.java:742) com.amazonaws.http.AmazonHttpClient $ com.amazonaws.http.AmazonHttpClient $ RequestExecutor.accessでcom.amazonaws.http.AmazonHttpClient $ RequestExecutor.execute(AmazonHttpClient.java:699) $ 500からRequestExecutor.executeWithTimer(AmazonHttpClient.java:716) (AmazonHttpClient.java:667 com.amazonaws.http.AmazonHttpClient $ RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649)S3要求をするか、または公衆destinationBucketにプライベートバケットからコピーするCopyObjectはリクエストに事前に署名したパラメータを与える方法

で) ?

回避策としては、GeneratePresignedUrlRequestを使用し、ソースバケットのオブジェクトにアクセスするための事前署名されたURLを取得し、一時ファイルをダウンロードしてputObjectを使用してアップロード先バケットにアップロードします。それはあまりにも多くのネットワークです - もしあれば、もっと良い方法は何でしょうか?

答えて

3

s3:CopyObjectコマンドでは、署名済みのURLは使用できません。

s3:CopyObjectコマンドを使用するには、使用されているAWS資格情報にソースバケットへの読み取りアクセスとターゲットバケットへの書き込みアクセスが必要です。

2つのバケットが同じ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/*" 
      ] 
     } 
    ] 
} 

ターゲット AWSアカウントのAWSアカウントIDを使用してソース S3バケットの名前、および123456789012BUCKET_NAMEを交換してください。編集後、ソース S3バケットにこのポリシーを適用してください。

関連する問題