AWS S3 kopiert Dateien und Ordner zwischen zwei Buckets

112

Ich habe nach einem Tool gesucht, mit dem ich den Inhalt eines AWS S3-Buckets in einen zweiten AWS S3-Bucket kopieren kann, ohne den Inhalt zuerst in das lokale Dateisystem herunterzuladen.

Ich habe versucht, die Kopieroption für die AWS S3-Konsole zu verwenden, aber dies führte dazu, dass einige verschachtelte Dateien fehlten.

Ich habe versucht, die Transmit-App (von Panic) zu verwenden. Der Befehl duplicate lädt die Dateien zuerst auf das lokale System herunter und lädt sie dann zurück in den zweiten Bucket, was ziemlich ineffizient ist.

cnicolaou
quelle
Erwägen Sie, dieaws configure set default.s3.max_concurrent_requests 200
Anzahl

Antworten:

175

Zwischen S3-Buckets kopieren

AWS hat (erst kürzlich) eine Befehlszeilenschnittstelle zum Kopieren zwischen Buckets veröffentlicht.

http://aws.amazon.com/cli/

$ aws s3 sync s3://mybucket-src s3://mybucket-target --exclude *.tmp
..

Dadurch wird von einem Ziel-Bucket in einen anderen Bucket kopiert .

Siehe die Dokumentation hier: S3 CLI-Dokumentation

Layke
quelle
Lief es von EC2 und bekam 80MB in ca. 5s kopiert.
Stew-au
1
Genau das, was ich brauchte, da aws-sdk gem keine Funktion zum gleichzeitigen Kopieren oder Synchronisieren eines ganzen Buckets hat. Vielen Dank!
Odigity
Es wirft den folgenden FehlerA client error (PermanentRedirect) occurred when calling the ListObjects operation: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.
Giovanni Bitliner
@GiovanniBitliner Der von Ihnen verwendete Bucket-Name ist falsch. Sie verwenden entweder das falsche Präfix oder die alte Art, auf den Bucket zu verweisen. Überprüfen Sie Ihren Bucket-Namen genau in Ihrer Admin-Konsole.
Layke
8
Beachten Sie, wenn Sie das cli-Tool zum ersten Mal verwenden, müssen Sie 'aws configure' ausführen und Ihre Creds eingeben
S ..
41

Ein vereinfachtes Beispiel mit dem Juwel aws-sdk:

AWS.config(:access_key_id => '...', :secret_access_key => '...')
s3 = AWS::S3.new
s3.buckets['bucket-name'].objects['source-key'].copy_to('target-key')

Wenn Sie die Kopie zwischen verschiedenen Buckets ausführen möchten, geben Sie den Namen des Ziel-Buckets an:

s3.buckets['bucket-name'].objects['source-key'].copy_to('target-key', :bucket_name => 'target-bucket')
Trevor Rowe
quelle
41

Sie können dies jetzt über die S3-Administrationsoberfläche tun. Gehen Sie einfach in einen Eimer und wählen Sie alle Ihre Ordner aus actions->copy. Dann ziehen Sie in Ihren neuen Eimer actions->paste.

KDEx
quelle
4
Genial! Er bezieht sich auf das Webinterface. Im Gegensatz zu den meisten anderen könnte ich dies von einem iPad aus tun.
Jacob Foshee
2
Dadurch werden verschachtelte Objekte in Unterordnern zufällig weggelassen - 3 Jahre später und AWS kann einen solchen grundlegenden Fehler immer noch nicht beheben!
RunLoop
ist es für die gleichen Regionen oder alle?
Hakiko
1
Werden diese Probleme irgendwo von Amazon dokumentiert? @ RunLoop
Davetapley
1
@dukedave Ich weiß es nicht und habe es seit einiger Zeit nicht mehr getestet, da ich auf das Kopieren über die Befehlszeile zurückgegriffen habe, da dies perfekt funktioniert hat.
RunLoop
8

Es ist mit dem neuesten aws-sdk- Juwel möglich, siehe Codebeispiel:

require 'aws-sdk'

AWS.config(
  :access_key_id     => '***',
  :secret_access_key => '***',
  :max_retries       => 10
)

file     = 'test_file.rb'
bucket_0 = {:name => 'bucket_from', :endpoint => 's3-eu-west-1.amazonaws.com'}
bucket_1 = {:name => 'bucket_to',   :endpoint => 's3.amazonaws.com'}

s3_interface_from = AWS::S3.new(:s3_endpoint => bucket_0[:endpoint])
bucket_from       = s3_interface_from.buckets[bucket_0[:name]]
bucket_from.objects[file].write(open(file))

s3_interface_to   = AWS::S3.new(:s3_endpoint => bucket_1[:endpoint])
bucket_to         = s3_interface_to.buckets[bucket_1[:name]]
bucket_to.objects[file].copy_from(file, {:bucket => bucket_from})

Weitere Details: Kopieren von Dateien über Buckets mit aws-s3 gem

Anatoly
quelle
Vielen Dank, dass Sie gezeigt haben, wie Sie zwischen Servern kopieren können. Ich versuche, von uns Server auf Singapur Server zu kopieren.
Arcolye
@Arcolye Wie ist die Latenz in AWS Singapore jetzt? Es war langsam und inkonsistent vor einem Jahr.
Anatoly
7

Kopieren Sie zwischen Eimern in verschiedenen Regionen

$ aws s3 cp s3://src_bucket/file  s3://dst_bucket/file --source-region eu-west-1 --region ap-northeast-1

Der obige Befehl kopiert eine Datei aus einem Eimer in Europa (eu-west-1) nach Japan (ap-nordost-1). Mit dem folgenden Befehl können Sie den Codenamen für die Region Ihres Buckets abrufen:

$ aws s3api get-bucket-location --bucket my_bucket

Die Verwendung von Kopieren und Einfügen in der S3-Webkonsole ist übrigens einfach, scheint jedoch aus dem Quell-Bucket in den Browser herunterzuladen und dann in den Ziel-Bucket hochzuladen. Die Verwendung von "aws s3" war für mich viel schneller.

Adam Gawne-Cain
quelle
6

Ich habe eine ausführbare Docker-Datei von s3s3mirror erstellt Tools . Ein Dienstprogramm zum Kopieren und Spiegeln von einem AWS S3-Bucket in einen anderen.

Es ist ein Thread, der paralleles Kopieren ermöglicht und sehr speichereffizient ist. Es ist dort erfolgreich, wo s3cmd vollständig ausfällt.

Verwendung:

docker run -e AWS_ACCESS_KEY_ID=FOO -e AWS_SECRET_ACCESS_KEY=BAR pmoust/s3s3mirror [OPTIONS] source_bucket[/prefix] dest_bucket[/prefix]

Eine vollständige Liste der Optionen finden Sie unter:

docker run pmoust/s3s3mirror 
Panagiotis Moustafellos
quelle
5

Ich würde mir vorstellen, dass Sie wahrscheinlich schon eine gute Lösung gefunden haben, aber für andere, die auf dieses Problem stoßen (wie ich es kürzlich getan habe), habe ich ein einfaches Dienstprogramm speziell für den Zweck entwickelt, einen S3-Bucket in einen anderen zu spiegeln eine sehr gleichzeitige und dennoch CPU- und speichereffiziente Art und Weise.

Es ist auf Github unter einer Apache-Lizenz hier: https://github.com/cobbzilla/s3s3mirror

Wenn Sie einen sehr großen Eimer haben und nach maximaler Leistung suchen, lohnt es sich möglicherweise, ihn auszuprobieren.

Wenn Sie es versuchen möchten, lassen Sie es mich bitte wissen, wenn Sie Feedback haben.

Cobbzilla
quelle
Ich hatte eine großartige Erfahrung mit s3s3mirror. Ich konnte es auf einem m1.small EC2-Knoten einrichten und 1,5 Millionen Objekte in ungefähr 2 Stunden kopieren. Das Setup war aufgrund meiner Unkenntnis von Maven und Java etwas schwierig, aber es waren nur ein paar apt-get-Befehle unter Ubuntu erforderlich, um alles zu installieren. Ein letzter Hinweis: Wenn Sie (wie ich) Bedenken haben, ein unbekanntes Skript in einem großen, wichtigen s3-Bucket auszuführen, erstellen Sie einen speziellen Benutzer mit schreibgeschütztem Zugriff auf den Copy-from-Bucket und verwenden Sie diese Anmeldeinformationen. Keine Chance auf versehentliches Löschen.
Micah
4

Wenn Sie sich in der Shell befinden und mehrere Dateien, aber nicht alle Dateien kopieren möchten: s3cmd cp --recursive s3: // BUCKET1 / OBJECT1 s3: // BUCKET2 [/ OBJECT2]

user1978008
quelle
3

Ich habe ein Skript geschrieben, das einen S3-Bucket sichert: https://github.com/roseperrone/aws-backup-rake-task

#!/usr/bin/env python
from boto.s3.connection import S3Connection
import re
import datetime
import sys
import time

def main():
    s3_ID = sys.argv[1]
    s3_key = sys.argv[2]
    src_bucket_name = sys.argv[3]
    num_backup_buckets = sys.argv[4]
    connection = S3Connection(s3_ID, s3_key)
    delete_oldest_backup_buckets(connection, num_backup_buckets)
    backup(connection, src_bucket_name)

def delete_oldest_backup_buckets(connection, num_backup_buckets):
    """Deletes the oldest backup buckets such that only the newest NUM_BACKUP_BUCKETS - 1 buckets remain."""
    buckets = connection.get_all_buckets() # returns a list of bucket objects
    num_buckets = len(buckets)

    backup_bucket_names = []
    for bucket in buckets:
        if (re.search('backup-' + r'\d{4}-\d{2}-\d{2}' , bucket.name)):
            backup_bucket_names.append(bucket.name)

    backup_bucket_names.sort(key=lambda x: datetime.datetime.strptime(x[len('backup-'):17], '%Y-%m-%d').date())

    # The buckets are sorted latest to earliest, so we want to keep the last NUM_BACKUP_BUCKETS - 1
    delete = len(backup_bucket_names) - (int(num_backup_buckets) - 1)
    if delete <= 0:
        return

    for i in range(0, delete):
        print 'Deleting the backup bucket, ' + backup_bucket_names[i]
        connection.delete_bucket(backup_bucket_names[i])

def backup(connection, src_bucket_name):
    now = datetime.datetime.now()
    # the month and day must be zero-filled
    new_backup_bucket_name = 'backup-' + str('%02d' % now.year) + '-' + str('%02d' % now.month) + '-' + str(now.day);
    print "Creating new bucket " + new_backup_bucket_name
    new_backup_bucket = connection.create_bucket(new_backup_bucket_name)
    copy_bucket(src_bucket_name, new_backup_bucket_name, connection)


def copy_bucket(src_bucket_name, dst_bucket_name, connection, maximum_keys = 100):
    src_bucket = connection.get_bucket(src_bucket_name);
    dst_bucket = connection.get_bucket(dst_bucket_name);

    result_marker = ''
    while True:
        keys = src_bucket.get_all_keys(max_keys = maximum_keys, marker = result_marker)

        for k in keys:
            print 'Copying ' + k.key + ' from ' + src_bucket_name + ' to ' + dst_bucket_name

            t0 = time.clock()
            dst_bucket.copy_key(k.key, src_bucket_name, k.key)
            print time.clock() - t0, ' seconds'

        if len(keys) < maximum_keys:
            print 'Done backing up.'
            break

        result_marker = keys[maximum_keys - 1].key

if  __name__ =='__main__':main()

Ich benutze dies in einer Rechenaufgabe (für eine Rails-App):

desc "Back up a file onto S3"
task :backup do
     S3ID = "AKIAJM3NRWC7STXWUWVQ"
     S3KEY = "0A5kuzV+E1dkaPjZxHQAezz1GlSddJd0iS5sNpry"
     SRCBUCKET = "primary-mzgd"
     NUM_BACKUP_BUCKETS = 2

     Dir.chdir("#{Rails.root}/lib/tasks")
     system "./do_backup.py #{S3ID} #{S3KEY} #{SRCBUCKET} #{NUM_BACKUP_BUCKETS}"
end
Rose Perrone
quelle
1

Ich habe gehört, dass es dafür ein Knotenmodul gibt, wenn Sie sich für Javascript interessieren: p

Aus den Knox-Copy- Dokumenten:

knoxCopy = require 'knox-copy'

client = knoxCopy.createClient
  key: '<api-key-here>'
  secret: '<secret-here>'
  bucket: 'backups'

client.copyBucket
  fromBucket: 'uploads'
  fromPrefix: '/nom-nom'
  toPrefix: "/upload_backups/#{new Date().toISOString()}"
  (err, count) ->
     console.log "Copied #{count} files"
Hurrymaplelad
quelle
Dies ist kein Javascript, sorry ... (Ja, ich kenne Coffeescript und dass Sie es verwenden können, immer noch kein Javascript)
Victor Schröder
1

Ich wurde informiert, dass Sie dies auch mit s3distcp in einem EMR-Cluster tun können. Bei Daten mit großen Dateien soll es schneller sein. Bei kleinen Datenmengen funktioniert es gut genug - aber angesichts der Lernkurve, die erforderlich war, um so wenig Daten einzurichten, hätte ich eine andere Lösung vorgezogen (ich habe noch nie zuvor mit EMR gearbeitet).

Hier ist ein Link aus der AWS-Dokumentation: http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/UsingEMR_s3distcp.html

Update: Für denselben Datensatz war s3s3mirror viel schneller als s3distcp oder die AWS-CLI. Viel einfacher einzurichten.

neugieriger George
quelle
1

Es ist ziemlich einfach, von einem S3-Bucket in denselben oder einen anderen S3-Bucket zu kopieren, ohne ihn auf den lokalen Download herunterzuladen. Verwenden Sie den folgenden Shell-Befehl.

hdfs dfs -cp -f "s3://AccessKey:SecurityKey@ExternalBucket/SourceFoldername/*.*" "s3://AccessKey:SecurityKey@ExternalBucket/TargetFoldername"

Dadurch werden alle Dateien aus dem SourceFoldernameOrdner des Quell-Buckets in den Ordner des Ziel-Buckets kopiert TargetFoldername. In dem obigen Code, bitte ersetzen AccessKey, SecurityKeyund ExternalBucketmit entsprechenden Werten.

Sarath Avanavu
quelle
Was ist hdfs?
Anthony Kong
1

von AWS cli https://aws.amazon.com/cli/ könnten Sie tun

aws s3 ls - Dadurch werden alle S3-Buckets aufgelistet

aws cp --recursive s3://<source bucket> s3://<destination bucket> - Dadurch werden die Dateien von einem Bucket in einen anderen kopiert

Hinweis * Sehr nützlich beim Erstellen von bereichsübergreifenden Replikations-Buckets. Wenn Sie die oben genannten Schritte ausführen, werden alle Dateien nachverfolgt und eine Aktualisierung der Quellregionsdatei wird an den replizierten Bucket weitergegeben. Alles außer den Dateilöschungen wird synchronisiert.

Stellen Sie für CRR sicher, dass die Versionierung für die Buckets aktiviert ist.

vredrav
quelle
0

Wie wäre es mit aws s3 synccli Befehl. aws s3 sync s3: // Bucket1 / s3: // Bucket2 /


quelle
0

Wie Neel Bhaat in diesem Blog erklärt hat , gibt es viele verschiedene Tools, die für diesen Zweck verwendet werden können. Einige werden von AWS bereitgestellt, wobei die meisten Tools von Drittanbietern sind. Für alle diese Tools müssen Sie Ihren AWS-Kontoschlüssel und Ihr Geheimnis im Tool selbst speichern. Seien Sie sehr vorsichtig, wenn Sie Tools von Drittanbietern verwenden, da die Anmeldeinformationen, die Sie speichern, Sie, Ihren gesamten Wert und Sie umbringen können.

Daher empfehle ich immer, die AWS CLI für diesen Zweck zu verwenden. Sie können dies einfach über diesen Link installieren . Führen Sie als Nächstes den folgenden Befehl aus und speichern Sie Ihre geheimen Schlüsselwerte in AWS CLI.

aws configure

Verwenden Sie den folgenden Befehl, um Ihren AWS S3-Bucket mit Ihrem lokalen Computer zu synchronisieren. (Auf dem lokalen Computer sollte AWS CLI installiert sein.)

aws s3 sync <source> <destination>

Beispiele:

1) Für AWS S3 zum lokalen Speicher

aws s3 sync <S3Uri> <LocalPath>

2) Vom lokalen Speicher zum AWS S3

aws s3 sync <LocalPath> <S3Uri>

3) Vom AWS s3-Bucket zu einem anderen Bucket

aws s3 sync <S3Uri> <S3Uri> 
Keet Sugathadasa
quelle
0

Der beste Weg, um einen S3-Bucket zu kopieren, ist die Verwendung der AWS-CLI .

Es umfasst diese 3 Schritte:

  1. Installieren von AWS CLI auf Ihrem Server.
**https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html**
  1. Wenn Sie Buckets zwischen zwei AWS-Konten kopieren, müssen Sie jedem Bucket die richtige Richtlinie hinzufügen.

  2. Verwenden Sie danach diesen Befehl, um von einem Bucket in einen anderen zu kopieren.

aws s3 sync s3://sourcebucket s3://destinationbucket

Die Details von Schritt 2 und Schritt 3 finden Sie unter diesem Link:

https://aws.amazon.com/premiumsupport/knowledge-center/account-transfer-s3/

Shubham Upadhyay
quelle