2012-10-03 4 views
18

Ich mache etwas Arbeit für einen Kunden mit 2 separaten AWS-Konten. Wir müssen alle Dateien in einem Bucket auf einem ihrer S3-Accounts in einen neuen Bucket auf dem zweiten Account verschieben.S3 Verschieben von Dateien zwischen Buckets auf verschiedenen Konten?

Wir dachten, dass s3cmd dies erlauben würde, mit dem Format:

s3cmd cp s3://bucket1 s3://bucket2 --recursive 

dies jedoch erlaubt es mir nur die Schlüssel von einem Konto zu verwenden, und ich kann die Konten des zweiten Kontos nicht angeben.

Gibt es eine Möglichkeit, dies zu tun, ohne die Dateien herunterzuladen und sie erneut auf das 2. Konto hochzuladen?

+0

Ref: Kopieren/Verschieben zwischen zwei verschiedenen Konten: http://stackoverflow.com/questions/5518205/move-files-directly-from-one-s3-account-to-another –

Antwort

33

Sie müssen die Berechtigungen nicht für alle Benutzer öffnen. Verwenden Sie die folgenden Bucket Richtlinien auf Quelle und Ziel für das Kopieren aus einem Eimer in einem Konto zum anderen eine IAM-Benutzer unter Verwendung von

Bucket Kopieren von - SourceBucket

Bucket zu kopieren - DestinationBucket

Quelle AWS-Konto ID - XXXX-XXXX-XXXX

Quelle IAM Benutzer - src-iam-Benutzer

die unten Politik bedeutet - die IAM-Benutzer - XXXX-XXXX-XXXX: src-iam-Benutzer hat s3: ListBucket und s3 : GetObject priv ileges auf SourceBucket/* und s3: ListBucket und s3: PutObject Privilegien auf DestinationBucket/*

Auf der SourceBucket sollte die Politik sein wie:

{ 
"Id": "Policy1357935677554", 
"Statement": [ 
    { 
     "Sid": "Stmt1357935647218", 
     "Action": [ 
      "s3:ListBucket" 
     ], 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3:::SourceBucket", 
     "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"} 
    }, 
    { 
     "Sid": "Stmt1357935676138", 
     "Action": ["s3:GetObject"], 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3::: SourceBucket/*", 
     "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"} 
    } 
] 
} 

Auf der DestinationBucket sollte die Politik sein:

{ 
"Id": "Policy1357935677554", 
"Statement": [ 
    { 
     "Sid": "Stmt1357935647218", 
     "Action": [ 
      "s3:ListBucket" 
     ], 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3::: DestinationBucket", 
     "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"} 
    }, 
    { 
     "Sid": "Stmt1357935676138", 
     "Action": ["s3:PutObject"], 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3::: DestinationBucket/*", 
     "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"} 
    } 
] 
} 

Befehl ausgeführt werden soll s3cmd cp s3://SourceBucket/File1 s3://DestinationBucket/File1

+0

Funktioniert wunderbar. Vielen Dank! – Sergio

+1

Was ist, wenn ich diesen Ordner/Datei auf meinen lokalen Rechner herunterladen möchte? –

+0

Was wäre, wenn diese Buckets in verschiedenen Regionen wären? – David

3

Die Bandbreite in AWS zählt nicht, Sie können also etwas Geld und Zeit sparen, indem Sie alles aus einer Box in AWS heraus tun, solange sich die Buckets in derselben Region befinden.

Um es zu tun, ohne dass die Datei irgendwo auf einem Computer landet - glaube nicht.

Ausgenommen: Da sie Bulk-Uploads von Festplatten, die Sie an sie senden, durchführen, könnten sie dasselbe für Sie tun, wenn Sie einen Bucket-to-Bucket-Transfer durchführen.

+1

Danke Tom. Es scheint so zu sein.Dies aus einer Instanz zu tun, scheint auch ein guter Weg zu sein. Danke für den Tipp. – Geuis

0

Ich würde schlagen cloudberry s3 explorer, als eine einfache Lösung, um Dinge schnell in Bewegung zu bringen. Außerdem können Sie interne aws bandbreitenfreie Übertragungsdienste nutzen.

Sie können auch die Cloudberry SDK Tools verwenden, um sie in Ihre Apps zu integrieren.

Viel Glück Jon

-6

Ok, dachte eine Antwort aus. Es gibt wahrscheinlich andere Möglichkeiten, dies zu tun, aber das ist sehr einfach.

Ich konnte dies mit dem Dienstprogramm s3cmd tun, kann aber wahrscheinlich mit ähnlichen Tools durchgeführt werden.

Wenn Sie s3cmd konfigurieren, konfigurieren Sie es mit Ihre Konto Access Key und Secret Access Key.

Melden Sie sich mit dem Account des Buckets an der S3-Webkonsole an, den Sie auf übertragen.

Besuchen Sie die S3-Webkonsole.

https://console.aws.amazon.com/s3/home 

Klicken Sie auf Ihren Bucket, dann Aktionen, dann Eigenschaften.

Klicken Sie unten auf der Registerkarte "Berechtigungen" auf "Weitere Berechtigungen hinzufügen".

Set "Grantee" to Everyone 

Check "List" and "Upload/Delete" 

Save 

zu übertragen, von Ihrem Terminal laufen

s3cmd cp s3://from_account_bucket s3://to_account_bucket --recursive 

Wenn die Übertragung abgeschlossen ist, sollten Sie sofort Besuch der S3-Konsole wieder und die Berechtigungen entfernen Sie den Eimer gegeben.

Es gibt offensichtlich ein Sicherheitsproblem hier. Der Bucket, in den wir wechseln, steht allen offen. Die Wahrscheinlichkeit, dass jemand Ihren Bucket-Namen findet, ist gering, besteht aber.

Sie können Bucket-Richtlinien als Alternative verwenden, um nur den Zugriff auf bestimmte Konten zu öffnen, aber das war zu schwierig für mich. Ich überlasse das als Übung für diejenigen, die das herausfinden müssen.

Hoffe, das hilft.

+1

Sorry, -1 für das Sicherheitsloch. Definitiv keine gute Übung hier - das ist ein großer Hack. – swrobel

0

Auch wenn Rollen und Richtlinien eine wirklich elegante Art und Weise sind, habe ich eine andere Lösung:

  1. Erhalten Sie Ihre AWS-Anmeldeinformationen für Quelle-Buckets-Konto
  2. Das Gleiche gilt für Destination-Buckets-Konto
  3. auf dem lokalen Computer (Desktop oder einen beliebigen Server außerhalb von AWS) ein neues Profil mit dem erstellen Anmeldeinformationen der Source-Bucket-Accounts.

    aws --profile $ {} YOUR_CUSTOM_PROFILE konfigurieren

  4. fill in aws_access_key_id und aws_secret_access_key (Sie können überspringen Region und Output)

  5. Speichern Sie Ihre Destination-Bucket-Credentials als Environment-Variablen

    Export AWS_ACCESS_KEY_ID = AKI ...

    Export AWS_SECRET_ACCESS_KEY = CN ...

  6. Jetzt 210
  7. tun, um die Synchronisation, sondern fügen Sie die entscheidenden "Profil" -Parameter

    aws --profile $ {} YOUR_CUSTOM_PROFILE s3 sync s3: // $ {} SOURCE_BUCKET_NAME s3: // $ {} DESTINATION_BUCKET_NAME

+1

Kann ich die S3-Synchronisierung trotzdem ausführen, wenn die Credentials für den Quell-Bucket und den Ziel-Bucket unterschiedlich sind? – HariShankar