2017-12-20 4 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 오류 코드 : AccessDenied, 요청 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) at com.amazonaws.http.AmazonHttpClient $ RequestExecutor.executeWithTimer (AmazonHttpClient.java:716) at com.amazonaws.http.AmazonHttpClient $ RequestExecutor.execute (AmazonHttpClient.java:699) at com.amazonaws.http.AmazonHttpClient $ RequestExecutor.access $ 500 (AmazonHttpClient.java:667)) com.amazonaws.http.AmazonHttpClient $ RequestExecutionBuilderImpl.execute (AmazonHttpClient.java:649)

어떻게 S3 요청을 공공 destinationBucket에 개인 물통에서 복사 할 copyObject 요청에 미리 서명 매개 변수를 제공하기에?

해결 방법은 명백한 해결책은 GeneratePresignedUrlRequest을 사용하고 sourceBucket의 개체에 액세스하기 위해 미리 서명 된 URL을 얻고 임시 파일로 다운로드하고 putObject을 사용하여 대상 버킷에 업로드하는 것입니다. 네트워크가 너무 많아서 더 좋은 대안이 무엇인지 궁금해하고 있었습니까?

답변

3

s3:CopyObject 명령은 서명 된 URL을 사용할 수 없습니다.

s3:CopyObject 명령을 사용하려면 AWS 자격 증명을 사용하기 만하면 소스 버킷에 대한 읽기 액세스와 대상 버킷에 대한 쓰기 액세스가 필요합니다.

두 버킷이 동일한 AWS 계정에 있다면 이는 곧장 앞으로 나아갈 것입니다.

그러나 버킷이 서로 다른 계정에있는 경우 대상 버킷 소유 AWS 계정에 대한 읽기 권한을 부여하는 소스 버킷에 버킷 정책을 적용하고 target-bucket-owning 사본을 수행 할 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 버킷 및 123456789012의 이름으로 BUCKET_NAME를 교체합니다. 수정 후 소스 S3 버킷에이 정책을 적용하십시오.

관련 문제