it-swarm.com.de

AWS S3 kopiert Dateien und Ordner zwischen zwei Buckets

Ich habe nach einem Werkzeug gesucht, das mir hilft, den Inhalt eines S3-Buckets in einen zweiten Bucket zu kopieren, ohne den Inhalt zuerst auf ein lokales System herunterzuladen.

Ich habe die AWS S3-Konsolenkopieroption ausprobiert, was jedoch dazu führte, dass einige verschachtelte Dateien fehlten.

Ich habe versucht, die Transmit-App (Panic) zu verwenden, aber der Befehl "Duplizieren" kopiert Dateien zuerst auf das lokale System und dann zurück in den zweiten Bucket

102
cnicolaou

Zwischen S3-Buckets kopieren

AWS hat kürzlich eine Befehlszeilenschnittstelle für das Kopieren zwischen Buckets veröffentlicht.

http://aws.Amazon.com/cli/

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

Dieses kopiert von einem Ziel-Bucket in einen anderen Bucket. 

Sehen Sie sich die Dokumentation hier an: S3 CLI-Dokumentation

156
Layke

Ein vereinfachtes Beispiel mit dem aws-sdk-Gem:

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 durchfü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')
40
Trevor Rowe

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

36
KDEx

Es ist mit dem letzten aws-sdk gem 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: So kopieren Sie eine Datei mit aws-s3 gem über mehrere Buckets

7
Anatoly

Ich habe ein ausführbares Docker of s3s3mirror tool erstellt. .__ Ein Dienstprogramm zum Kopieren und Spiegeln von einem AWS S3-Bucket in einen anderen.

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

Verwendungszweck:

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

Für eine vollständige Liste der Optionen versuchen Sie Folgendes:

docker run pmoust/s3s3mirror 

Kopieren Sie zwischen Buckets 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). Sie können den Codenamen für die Region Ihres Buckets mit diesem Befehl erhalten:

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

Übrigens ist die Verwendung von Kopieren und Einfügen in der S3-Web-Konsole einfach, aber es scheint, als würde es vom Quell-Bucket in den Browser heruntergeladen und dann in den Ziel-Bucket hochgeladen. Die Verwendung von "aws s3" war für mich viel schneller.

6
Adam Gawne-Cain

Überprüfen Sie die Dokumentation unten. Ich denke, das ist was Sie suchen . http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectCOPY.html

Das S3Interface von RightAws gem verfügt über eine Kopierfunktion, die die oben genannten Funktionen erfüllt.

http://rubydoc.info/gems/right_aws/3.0.0/RightAws/S3Interface#copy-instance_method

5
Josnidhin

Ich könnte mir vorstellen, dass Sie wahrscheinlich bereits eine gute Lösung gefunden haben, aber für andere, die dieses Problem haben (wie vor kurzem), habe ich ein einfaches Dienstprogramm entwickelt, um einen S3-Bucket in einen anderen zu spiegeln eine äußerst gleichzeitige und dennoch CPU- und speichereffiziente 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, ist es vielleicht einen Versuch wert.

Wenn Sie sich entscheiden, es auszuprobieren, lassen Sie es mich wissen, wenn Sie Feedback haben.

5
cobbzilla

Wenn Sie sich in der Shell befinden und mehrere Dateien aber nicht alle Dateien kopieren möchten: S3cmd cp --recursive s3: // BUCKET 1/OBJECT1 s3: // BUCKET 2 [/ OBJECT2]

4
user1978008

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  __=='__main__':main()

Ich verwende dies in einer Rake-Aufgabe (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
3
Rose Perrone

Ich höre, dass es ein Knotenmodul dafür 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"
1
hurrymaplelad

Ich wurde informiert, dass Sie dies auch mit s3distcp in einem EMR-Cluster durchführen können. Bei Daten, die große Dateien enthalten, soll es schneller sein. Es funktioniert gut genug für kleine Datensätze - aber ich hätte eine andere Lösung vorgezogen angesichts der Lernkurve, die für die Einrichtung so geringer Daten erforderlich war (ich habe vorher noch nie mit EMR gearbeitet).

Hier 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 das AWS-Cli. Viel einfacher zu installieren.

1
curious_george

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

hdfs dfs -cp -f "s3://AccessKey:[email protected]/SourceFoldername/*.*" "s3://AccessKey:[email protected]/TargetFoldername"

Dadurch werden alle Dateien aus dem Ordner SourceFoldername des Quell-Buckets in den Ordner TargetFoldername des Ziel-Buckets kopiert. Ersetzen Sie im obigen Code AccessKey, SecurityKey und ExternalBucket durch Ihre entsprechenden Werte.

0
Sarath Avanavu

Der beste Weg, S3-Bucket zu kopieren, ist die Verwendung von AWS CLI

Es beinhaltet 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 eine korrekte Richtlinie zuordnen.

  2. Danach verwenden Sie diesen Befehl, um von einem Bucket in einen anderen zu kopieren.

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

Die Details zu step 2 und step 3 finden Sie in diesem Link: 

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

0

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

aws s3 ls - Hier 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 Regionenübergreifenden Replikations-Buckets. Durch das Ausführen der obigen Schritte werden alle Ihre 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 Versionsverwaltung für die Buckets aktiviert ist.

0
vredrav

Wie wäre es mit aws s3 sync cli command . Aws s3 sync s3: // bucket1/s3: // bucket2 /

0
user8049838

Wie Neel Bhaat in diesem blog erklärt hat, gibt es viele verschiedene Werkzeuge, die zu diesem 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 das Geheimnis im Tool selbst speichern. Seien Sie bei der Verwendung von Tools von Drittanbietern sehr vorsichtig, da die von Ihnen gesicherten Anmeldeinformationen Ihren gesamten Wert und den Tod kosten können.

Daher empfehle ich immer die Verwendung der AWS CLI . Sie können dies einfach von diesem Link installieren. Führen Sie anschließend 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 zu AWS S3

aws s3 sync <LocalPath> <S3Uri>

3) Vom AWS S3-Bucket zu einem anderen Bucket

aws s3 sync <S3Uri> <S3Uri> 
0