AWS Germany – Amazon Web Services in Deutschland

Kopieren von Daten aus einem AWS Account in einen anderen mit Python und Boto

In den letzten Tagen kam mehrmals die Frage hoch, wie man größere Datenmengen in S3 aus einem AWS Account in einen anderen kopiert. Daher habe ich das mal getestet. Bei diesem Vorgang sei vorausgesetzt, dass das Kopieren aus dem Zielkonto erfolgt.

Schritt 1: Account ID ermitteln

Als allererstes braucht man die Account ID des Zielkontos. Die erfährt man am einfachsten aus der AWS Konsole. Man klickt dann oben rechts auf den eigenen Namen->My Account. Dann steht oben rechts die Account-ID, eine 12stellige Zahl (die Bindestriche werden für das Folgende weggelassen)

Schritt 2: Berechtigungen auf Quell-S3-Bucket geben

Jetzt loggt man sich mit dem Quellkonto in der AWS Konsole
ein und setzt eine Bucket Policy auf das Quell-Bucket. Dazu wählt man in der S3 Management Konsole das Quell-Bucket aus (durch Klick auf das Symbol vor dem Bucket-Namen), wählt „Properties“ und dann „Permissions“. Dann Klick auf „Add Bucket Policy“. Die benötigte Policy muss die AWS Account ID des Zielkontos als Principal haben und die Actions „s3:GetObject“ und „s3:ListBucket“. Als Ressourcen werden arn:aws:s3:::bucketname und arn:aws:s3:::bucketname/* angegeben. Eine fertige Policy sieht so aus, wobei AAAABBBBCCCC die 12stellige AWS Account ID des Zielkontos und quellbucket der Name des Quellbuckets (also das gerade geänderte Objekt) ist:


{
    "Version": "2008-10-17",
    "Id": "MyCopyPolicy",
    "Statement": [
      {
        "Sid": "MyCopyPolicy1",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::AAAABBBBCCCC:root"
        },
        "Action": [ "s3:ListBucket", "s3:GetObject" ],
        "Resource": [ "arn:aws:s3:::quellbucket/*", "arn:aws:s3:::quellbucket" ]
    }
  ]
}

Nach dem Anwenden dieser Policy hat das Zielkonto Zugriff auf alle Dateien im Bucket. Jetzt kann man mit ein paar Zeilen Python/Boto den gesamten Quellbucket in ein Zielbucket kopieren. Eine Rekursion ist dabei nicht notwendig, weil die Keys der einzelnen Objekte in S3 immer den gesamten Pfad mit allen Ordnern unterhalb des Buckets enthalten. Aus programmatischer Sicht sieht also der Inhalt eines S3 Buckets aus wie eine flache Liste. Dieser Code setzt voraus, dass entweder die AWS Credentials des Zielkontos in einer .boto-Datei hinterlegt sind oder der Code aus einer EC2-Instanz mit angewandter IAM-Rolle ausgeführt wird (siehe dieses Video ab 0:54).

Hier der Code.

DISCLAIMER: Dieser Code dient nur der Erklärung. Amazon und ich übernehmen keine Haftung für die Korrektheit des Codes oder eventuell entstehende Probleme:


import boto.s3

conn = boto.connect_s3()

destbucketname = 'zielbucket'
sourcebucketname = 'quellbucket'

sourcebucket = conn.get_bucket(sourcebucketname)
destbucket = conn.get_bucket(destbucketname)

rs = sourcebucket.list()

for k in rs:
   print "Copying" + k.key
   destbucket.copy_key(k.key, sourcebucketname, k.key)

   print "Fertig!"

Gruß,
Steffen