2017-12-20 2 views
0

Kopieren Objekt über Eimer in s3 in der Region ist einfacher, mit this Anfrag:Wie kopiert man das Objekt in aws s3 vom privaten Bucket in den öffentlichen Bucket ohne Download?

AmazonS3 pS3client = new AmazonS3Client(new BasicAWSCredentials(/*supressed*/)); 
String key = "key"; 
pS3client.copyObject("sourceBucket", key, "destinationBucket", key); 

Aber wenn sourceBucket sind privater Zugang Eimer und muss vorab unterzeichnet Urls die Objekte in dem Eimer die oben Anforderung fehlschlägt zuzugreifen.

Zugriff aufgrund privaten Zugriffs für die Datei verweigert.

com.amazonaws.services.s3.model.AmazonS3Exception: Zugriff verweigert (Service: Amazon S3; Statuscode: 403; Fehlercode: AccessDenied; anfordern ID: <>), S3 Erweiterte Anforderungs-ID: <> bei com.amazonaws.http.AmazonHttpClient $ RequestExecutor.handleErrorResponse (AmazonHttpClient.java:1579) bei com.amazonaws.http.AmazonHttpClient $ RequestExecutor.executeOneRequest (AmazonHttpClient.java:1249) bei com.amazonaws.http.AmazonHttpClient $ RequestExecutor.executeHelper (AmazonHttpClient.java:1030) bei com.amazonaws.http.AmazonHttpClient $ RequestExecutor.doExecute (AmazonHttpClient.java:742) bei com.amazonaws.http.AmazonHttpClient $ RequestExecutor.executeWithTimer (AmazonHttpClient.java:716) bei com.amazonaws.http.AmazonHttpClient $ RequestExecutor.execute (AmazonHttpClient.java:699) bei com.amazonaws.http.AmazonHttpClient $ RequestExecutor.access 500 $ (AmazonHttpClient.java:667) bei com.amazonaws.http.AmazonHttpClient $ RequestExecutionBuilderImpl.execute (AmazonHttpClient.java:649)

Wie s3 Anfrage oder geben vor signierten Parameter in der Anfrage Kopierenobjekt kopieren von privaten Eimer zu öffentlichen destinationBucket machen?

Für Abhilfe offensichtliche Lösung wäre GeneratePresignedUrlRequest zu verwenden und die Pre-signierte URL erhalten zu dem Objekt sourceBucket zugreifen, herunterladen in temporärer Datei und die Verwendung putObject im Ziel Eimer hochladen. Das ist zu viel Netzwerk - also fragte mich, was ist die bessere Alternative wenn überhaupt?

Antwort

3

Der Befehl s3:CopyObject kann keine vorzeichenbehafteten URLs verwenden.

Um den Befehl s3:CopyObject zu verwenden, benötigen die verwendeten AWS-Anmeldeinformationen lediglich Lesezugriff auf den Quell-Bucket und Schreibzugriff auf den Ziel-Bucket.

Wenn sich die beiden Buckets im selben AWS-Konto befinden, sollte dies problemlos möglich sein.

Wenn sich die Buckets jedoch in unterschiedlichen Konten befinden, müssen Sie eine Bucket-Richtlinie auf den Quell-Bucket anwenden, der Lesezugriff auf das AWS-Konto mit dem Ziel-Bucket gewährt und das Ziel-Bucket-Owning verwendet AWS-Konto, um die Kopie auszuführen.

{ 
    "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/*" 
      ] 
     } 
    ] 
} 

ersetzen BUCKET_NAME mit dem Namen Ihrer Quelle S3 Eimer und 123456789012 mit der AWS-Konto-ID des Ziel AWS-Kontos. Wenden Sie nach der Bearbeitung diese Richtlinie auf Ihre Quelle S3-Bucket an.