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
, --include
obsł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 Object
kopiuje tylko pliki, więc DELETE Object
po 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 ).
Nowy oficjalny interfejs CLI interfejsu AWS natywnie obsługuje większość funkcji
s3cmd
. Wcześniej używałems3cmd
lub 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
źródło
aws s3 sync s3://my-bucket-in-eu-west1 s3://my-bucket-in-eu-central1 --source-region=eu-west-1 --region=eu-central-1
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-commandSpę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ń:
Po ich uruchomieniu możesz użyć prostego polecenia synchronizacji w następujący sposób:
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ą.
źródło
Aby przenieść / skopiować z jednego zasobnika do drugiego lub tego samego zasobnika, używam narzędzia s3cmd i działa dobrze. Na przykład:
źródło
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.
źródło
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ć:
źródło
s3cmd cp
, nie zaakceptujesz--skip-existing
opcji, możesz jednak uruchomićs3cmd sync
zamiast tego z pominięciem istniejącegoDla mnie to polecenie właśnie zadziałało:
źródło
Oto klasa ruby do tego: https://gist.github.com/4080793
Przykładowe użycie:
źródło
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.
źródło
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!
źródło
Wiem, że to stary wątek, ale dla innych, którzy tam docierają, proponuję utworzenie zaplanowanego zadania w celu skopiowania treści z segmentu produkcyjnego do segmentu rozwojowego.
Jeśli korzystasz z platformy .NET, możesz skorzystać z tego artykułu
https://edunyte.com/2015/03/aws-s3-copy-object-from-one-bucket-or/
źródło
W nowej wersji aws2.
źródło