Najlepszy sposób na przenoszenie plików między zasobnikami S3?

90

Chciałbym codziennie kopiować niektóre pliki z zasobnika produkcyjnego do zasobnika programistycznego.

Na przykład: Skopiuj zasobnik produkcyjny / kanał / nazwa kanału / data do zasobnika rozwoju / kanału / nazwy kanału / daty

Ponieważ pliki, które chcę, są tak głęboko w strukturze folderów, przechodzenie do każdego folderu i kopiowanie / wklejanie jest zbyt czasochłonne.

Bawiłem się montowaniem dysków do każdego zasobnika i pisaniem skryptu wsadowego systemu Windows, ale jest to bardzo powolne i niepotrzebnie pobiera wszystkie pliki / foldery na lokalny serwer i ponownie tworzy kopię zapasową.

Matt Dell
źródło

Odpowiedzi:

110

Aktualizacja

Jak wskazał alberge (+1), obecnie doskonały interfejs wiersza poleceń AWS zapewnia najbardziej wszechstronne podejście do interakcji z (prawie) wszystkimi funkcjami AWS - w międzyczasie obejmuje większość interfejsów API usług, a także udostępnia polecenia S3 wyższego poziomu do obsługi konkretnie przypadek użycia, zobacz dokumentację AWS CLI dla S3 :

  • sync - Synchronizuje katalogi i prefiksy S3. Twój przypadek użycia jest omówiony w przykładzie 2 ( dostępne jest również bardziej szczegółowe użycie --exclude, --includeobsługa prefiksów itp.):

    Następujące polecenie synchronizacji synchronizuje obiekty o określonym prefiksie i zasobniku z obiektami o innym określonym prefiksie i zasobniku, kopiując obiekty s3. […]

    aws s3 sync s3://from_my_bucket s3://to_my_other_bucket
    

Dla kompletności wspomnę, że polecenia S3 niższego poziomu są nadal dostępne za pośrednictwem polecenia sub s3api , co pozwoliłoby bezpośrednio przetłumaczyć dowolne rozwiązanie oparte na SDK na interfejs wiersza poleceń AWS przed ostatecznym przyjęciem jego funkcjonalności wyższego poziomu.


Pierwsza odpowiedź

Przenoszenie plików między zasobnikami S3 można osiągnąć za pomocą PUT Object - Copy API (po którym następuje DELETE Object ):

Ta implementacja operacji PUT tworzy kopię obiektu, który jest już przechowywany w Amazon S3. Operacja kopiowania PUT jest taka sama, jak wykonanie operacji GET, a następnie PUT. Dodanie nagłówka żądania, x-amz-copy-source, powoduje, że operacja PUT kopiuje obiekt źródłowy do zasobnika docelowego. Źródło

Dostępne są odpowiednie przykłady dla wszystkich istniejących zestawów SDK AWS, patrz Kopiowanie obiektów w pojedynczej operacji . Oczywiście rozwiązanie oparte na skryptach byłoby tutaj oczywistym pierwszym wyborem, więc skopiuj obiekt przy użyciu AWS SDK dla Rubiego może być dobrym punktem wyjścia; jeśli wolisz zamiast tego Pythona, to samo można osiągnąć również za pomocą boto, oczywiście, zobacz metodę copy_key()w dokumentacji API S3 boto .

PUT Objectkopiuje tylko pliki, więc DELETE Objectpo udanej operacji kopiowania będziesz musiał jawnie usunąć plik przez nadal, ale będzie to tylko kilka wierszy po utworzeniu całego skryptu obsługującego nazwy zasobnika i plików (są też odpowiednie przykłady patrz np. usuwanie jednego obiektu na żądanie ).

Steffen Opel
źródło
Skończyło się na skryptowaniu operacji z AWS SDK w .NET
Matt Dell,
1
@MattDell Czy możesz dodać odpowiedź .NET na to pytanie?
balexandre
1
Słabe w tym jest to, że Amazon nie jest bardzo jasny, czy polecenie kopiowania powiodło się, czy nie, więc usunięcie po operacji wydaje się niebezpieczne.
James McMahon,
Żeby było jasne, odnosiłem się konkretnie do API Java. Otworzyłem osobne pytanie stackoverflow.com/questions/17581582
James McMahon,
Nadal potrzebujemy prostego sposobu na stworzenie pojedynczego identyfikatora i klucza umożliwiającego odczytywanie z jednego zasobnika i zapisywanie w drugim. Zwłaszcza jeśli segmenty są podzielone na konta.
CMCDragonkai
66

Nowy oficjalny interfejs CLI interfejsu AWS natywnie obsługuje większość funkcji s3cmd. Wcześniej używałem s3cmdlub Ruby AWS SDK do robienia takich rzeczy, ale oficjalny CLI działa świetnie do tego.

http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html

aws s3 sync s3://oldbucket s3://newbucket
AB
źródło
4
To powinno być głosowane na górę listy. To właściwy sposób synchronizowania zasobników i najbardziej aktualnych we wszystkich tych odpowiedziach.
dft
Jeśli masz problemy z błędami odmowy dostępu 403, zobacz ten post na blogu. Pomogło. alfielapeter.com/posts/ ...
crlane
3
kopia między regionamiaws s3 sync s3://my-bucket-in-eu-west1 s3://my-bucket-in-eu-central1 --source-region=eu-west-1 --region=eu-central-1
odpowiednik8
jeśli chcesz uruchomić tę noc na serwerze, użyj nohup aws s3 sync s3://my-bucket-in-eu-west1 s3://my-bucket-in-eu-central1 --source-region=eu-west-1 --region=eu-central-1 & thegeekstuff.com/2010/12/5-ways-to-execute-linux-command
odpowiednik8
@alberge Czy istnieje sposób na podanie klucza dostępu i hasła za pomocą argumentu wiersza poleceń?
EmptyData,
29

Spędziłem dni na pisaniu własnego, niestandardowego narzędzia do zrównoleglania kopii wymaganych do tego, ale potem natknąłem się na dokumentację, w jaki sposób uzyskać polecenie synchronizacji interfejsu wiersza polecenia AWS S3, aby zsynchronizować zasobniki z ogromną równoległością . Następujące polecenia powiedzą interfejsowi wiersza poleceń AWS, aby używał 1000 wątków do wykonywania zadań (każdy mały plik lub jedna część kopii wieloczęściowej) i przewidywał 100 000 zadań:

aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000

Po ich uruchomieniu możesz użyć prostego polecenia synchronizacji w następujący sposób:

aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path

Na maszynie m4.xlarge (w AWS - 4 rdzenie, 16GB RAM), dla mojego przypadku (pliki 3-50GB) prędkość synchronizacji / kopiowania wzrosła z około 9,5MiB / s do 700 + MiB / s, wzrost prędkości o 70x w stosunku do domyślnej konfiguracji.

Aktualizacja: pamiętaj, że S3CMD był aktualizowany przez lata i te zmiany są teraz skuteczne tylko podczas pracy z wieloma małymi plikami. Należy również zauważyć, że S3CMD w systemie Windows (tylko w systemie Windows) ma poważnie ograniczoną ogólną przepustowość i może osiągnąć tylko około 3 Gb / s na proces, bez względu na rozmiar wystąpienia lub używane ustawienia. Inne systemy, takie jak S5CMD, mają ten sam problem. Rozmawiałem o tym z zespołem S3 i oni się tym zajmują.

James
źródło
Dzięki, udało ci się uzyskać ponad 900 + MiB / s z twoją konfiguracją, ogromne przyspieszenie ponad domyślne.
kozyr
@James: Czy API ogranicza nas w osiąganiu tak szybkich transferów? Używam interfejsu API transfermanager dostarczanego przez AWS Java SDK vs CLI z maszyny T2 EC2 do przesyłania pliku 2 GB. Różnica w czasie wynosi ~ 5,5 razy (CLI - 14 sekund) vs (SDK - 80 sekund). Ponadto nie widzę żadnej opcji dla s3.max_queue_size w SDK. Jakieś uwagi?
Dwarrior
@Dwarrior, oba te ustawienia dotyczą interfejsu wiersza polecenia. Korzystając z SDK, musisz samodzielnie zarządzać wszystkimi kolejkami żądań. Obsługa AWS twierdzi, że osiągnęła około 80% maksymalnej możliwej przepustowości między EC2 i S3 przy użyciu Linuksa (tj. Reklamowanej przepustowości sieci instancji EC2). Windows jest obywatelem drugiej kategorii w AWS i nie może uzyskać nawet połowy tego dzięki narzędziom dostarczonym przez Amazon i wygląda na to, że nie planują tego naprawiać. :-( W przypadku maszyny T2 AWS nie określa dokładnie, jaką przepustowość uzyskujesz, chociaż sytuacja nieco się poprawi, jeśli skonfigurujesz punkt końcowy S3 VPC.
James,
@James Doszedłem do tego, że zrównoleglenie listy plików w klastrze w Spark, połączenie z równoległością na każdej partycji, a następnie użycie transfermanagera do równoległego przesyłania dowolnego pliku. Widzę poprawę z 80 do 45 sekund po zrobieniu tego, ale wciąż brakuje mi sposobu, w jaki CLI radzi sobie z EC2. Ale dzięki za tę konfigurację. Poprawiło to również wydajność w przypadku okien. W SDK możemy ustawić maksymalną liczbę połączeń, ale nie rozmiar kolejki, więc myślę, że będziemy musieli z tym wyjść. :) Wszelkie wskazówki, jak zarządzać kolejkami, dowolny przykładowy kod, który mogę przyjąć jako punkt odniesienia.
Dwarrior
2
S5Cmd ( github.com/peakgames/s5cmd ) to narzędzie używane przez pracowników obsługi AWS w celu uzyskania maksymalnej przepustowości. Rozmiar instancji robi dużą różnicę. Nowa seria c5n jest bardzo opłacalna w przypadku sieci i osiąga niesamowitą przepustowość 100 Gb / s.
James,
28

Aby przenieść / skopiować z jednego zasobnika do drugiego lub tego samego zasobnika, używam narzędzia s3cmd i działa dobrze. Na przykład:

s3cmd cp --recursive s3://bucket1/directory1 s3://bucket2/directory1
s3cmd mv --recursive s3://bucket1/directory1 s3://bucket2/directory1
sgimeno
źródło
13

Przykład .NET na żądanie:

using (client)
{
    var existingObject = client.ListObjects(requestForExisingFile).S3Objects; 
    if (existingObject.Count == 1)
    {
        var requestCopyObject = new CopyObjectRequest()
        {
            SourceBucket = BucketNameProd,
            SourceKey = objectToMerge.Key,
            DestinationBucket = BucketNameDev,
            DestinationKey = newKey
        };
        client.CopyObject(requestCopyObject);
    }
}

a klient jest czymś podobnym

var config = new AmazonS3Config { CommunicationProtocol = Protocol.HTTP, ServiceURL = "s3-eu-west-1.amazonaws.com" };
var client = AWSClientFactory.CreateAmazonS3Client(AWSAccessKey, AWSSecretAccessKey, config);

Może być lepszy sposób, ale to tylko krótki kod, który napisałem, aby przenieść niektóre pliki.

Matt Dell
źródło
1
Wydaje się, że to dobre rozwiązanie. ale co się stanie, jeśli masz różne poświadczenia dla dwóch zasobników?
Roee Gavirel
2
Poświadczenia służą do wykonywania polecenia kopiowania. Te pojedyncze poświadczenia wymagają odpowiednich uprawnień do odczytu / zapisu w zasobnikach źródłowych / docelowych. Aby kopiować między kontami, musisz użyć zasad zasobnika, aby zezwolić na dostęp do zasobnika z poświadczeń innego konta.
Matt Houser
9

Jeśli masz hosta unixowego w AWS, użyj s3cmd z s3tools.org. Skonfiguruj uprawnienia tak, aby Twój klucz miał dostęp do odczytu do zasobnika programistycznego. Następnie uruchomić:

s3cmd cp -r s3://productionbucket/feed/feedname/date s3://developmentbucket/feed/feedname
dk.
źródło
Po stronie serwera? Nie ma strony serwera dla s3. Wszystkie polecenia są wykonywane ze zdalnego klienta.
dk.
Nawiasem mówiąc, to polecenie wydaje się działać dobrze w Internecie!
Gabe Kopley
3
Pytanie „po stronie serwera” jest prawidłowe. Czy transfer s3cmd przesuwa wszystkie dane do klienta, czy jest to bezpośredni transfer S3 do S3? W pierwszym przypadku lepiej byłoby uruchomić to w chmurze AWS, aby uniknąć zewnętrznych transferów WAN.
Bruce Edge,
1
Kopiowanie odbywa się zdalnie na S3.
dk.
Pamiętaj również, że jeśli przypadkowo przerwiesz ten proces s3cmd cp, nie zaakceptujesz --skip-existingopcji, możesz jednak uruchomić s3cmd synczamiast tego z pominięciem istniejącego
ianstarz.
9

Dla mnie to polecenie właśnie zadziałało:

aws s3 mv s3://bucket/data s3://bucket/old_data --recursive
lony
źródło
2
proste i nieskomplikowane rozwiązanie ... po co używać narzędzi innych firm lub obejść tak proste zadanie, skoro można to zrobić za pomocą aws cli ?!
Fr0zenFyr
7

Oto klasa ruby ​​do tego: https://gist.github.com/4080793

Przykładowe użycie:

$ gem install aws-sdk
$ irb -r ./bucket_sync_service.rb
> from_creds = {aws_access_key_id:"XXX",
                aws_secret_access_key:"YYY",
                bucket:"first-bucket"}
> to_creds = {aws_access_key_id:"ZZZ",
              aws_secret_access_key:"AAA",
              bucket:"first-bucket"}
> syncer = BucketSyncService.new(from_creds, to_creds)
> syncer.debug = true # log each object
> syncer.perform
bantic
źródło
6

Właściwie od niedawna po prostu używam akcji kopiuj + wklej w interfejsie AWS s3. Po prostu przejdź do plików, które chcesz skopiować, kliknij „Działania” -> „Kopiuj”, a następnie przejdź do zasobnika docelowego i „Działania” -> „Wklej”

Przesyła pliki dość szybko i wydaje się, że jest to mniej zawiłe rozwiązanie, które nie wymaga żadnego programowania lub takich rozwiązań z górnej półki.

Justin Workman
źródło
Tak. Odkryłem to samo kilka minut temu. Głosowałem za, więc więcej ludzi zaoszczędzi czas :)
JCarlosR
Wypróbowałem to na wiadrze do kopiowania kubełkowego z 134 364 obiektami. Zajęło to kilka godzin. W docelowym miejscu znalazło się tylko 134 333 plików - kopia zawierała informację, że jest „Udana”, ale brakowało żadnego wyjaśnienia.
warrens
Używając polecenia typu „aws s3 sync” opisanego w innych postach tutaj, wszystkie 134 364 obiekty zostały skopiowane w około 20 minut.
warrens
4

Dokładnie ten problem mieliśmy z naszymi zadaniami ETL w Snowplow , więc wyodrębniliśmy nasz równoległy kod kopiowania plików (Ruby, zbudowany na bazie Fog ), do jego własnego klejnotu Ruby o nazwie Śluza:

https://github.com/snowplow/sluice

Sluice obsługuje również usuwanie, przenoszenie i pobieranie plików S3; wszystko równoległe i z automatyczną ponowną próbą, jeśli operacja się nie powiedzie (co robi się zaskakująco często). Mam nadzieję, że to przydatne!

Alex Dean
źródło
0

W nowej wersji aws2.

aws2 s3 sync s3://SOURCE_BUCKET_NAME s3://NEW_BUCKET_NAME
Ankit Kumar Rajpoot
źródło