Come spostare i file tra due secchi S3 con un costo minimo?


44

Ho milioni di file in un bucket Amazon S3 e vorrei spostare questi file in altri bucket e cartelle con un costo minimo o nessun costo, se possibile. Tutti i secchi sono nella stessa zona.

Come potrei farlo?

Risposte:


53

Milioni di persone sono un gran numero - ci tornerò più tardi.

Indipendentemente dal tuo approccio, il meccanismo di base deve essere la copia diretta da un bucket a un altro - in questo modo (poiché i bucket sono nella stessa regione) non devi sostenere alcun costo per la larghezza di banda. Qualsiasi altro approccio è semplicemente inefficace (ad es. Download e re-caricamento dei file).

La copia tra i bucket viene eseguita utilizzando "Copia PUT", ovvero una richiesta PUT che include l'intestazione "x-amz-copy-source" - Credo che questo sia classificato come una richiesta COPIA. Questo copierà il file e di default i metadati associati. È necessario includere un 'x-amz-acl' con il valore corretto se si desidera impostare l'ACL contemporaneamente (altrimenti, per impostazione predefinita sarà privato). Ti verranno addebitate le tue richieste di COPIA ($ 0,01 / 1.000 richieste). È possibile eliminare i file non necessari dopo che sono stati copiati (le richieste DELETE non vengono addebitate). (Un punto su cui non sono del tutto chiaro è se una richiesta COPIA incorre anche nell'addebito di una richiesta GET, poiché l'oggetto deve prima essere recuperato dal bucket di origine - in caso contrario, l'addebito sarà di $ 0,01 / 10.000 aggiuntivo richieste).

Le accuse di cui sopra sono apparentemente inevitabili - per un milione di oggetti stai guardando a circa $ 10 (o $ 11). Dato che alla fine devi effettivamente creare i file sul bucket di destinazione, altri approcci (ad esempio tar-gziping dei file, Amazon Import / Export, ecc.) Non aggireranno questo costo. Tuttavia, potrebbe valere la pena contattare Amazon se hai più di un paio di milioni di oggetti da trasferire.

Dato quanto sopra (prezzo inevitabile), la prossima cosa da esaminare è il tempo, che sarà un grande fattore quando si copiano "milioni di file". Tutti gli strumenti che possono eseguire la copia diretta tra i bucket dovranno sostenere la stessa carica. Sfortunatamente, hai bisogno di una richiesta per file (da copiare), una richiesta da eliminare e possibilmente una richiesta per leggere i dati ACL (se i tuoi file hanno ACL diversi). La migliore velocità verrà da qualunque cosa possa eseguire le operazioni più parallele.

Esistono alcuni approcci da riga di comando che potrebbero essere abbastanza praticabili:

  • La modifica di s3cmd (quella specifica richiesta pull) include comandi paralleli cp e mv e dovrebbe essere una buona opzione per te.
  • La console AWS può eseguire direttamente la copia, ma non posso parlare di quanto sia parallela.
  • Lo script aws di Tim Kay può fare la copia - ma non è parallelo - dovrai eseguirlo per eseguire la copia completa che desideri (probabilmente non è l'opzione migliore in questo caso - sebbene sia un ottimo script).
  • CloudBerry S3 Explorer , Bucket Explorer e CloudBuddy dovrebbero essere tutti in grado di eseguire l'attività, anche se non so come aumenti l'efficienza di ciascuno. Ritengo tuttavia che le funzionalità multi-thread della maggior parte di questi richiedano l'acquisto del software.
  • Crea il tuo script usando uno degli SDK disponibili.

Esiste la possibilità che s3fs funzioni - è abbastanza parallelo, supporta copie tra lo stesso bucket - NON supporta copie tra bucket diverse, ma potrebbe supportare spostamenti tra bucket diverse.

Vorrei iniziare con la modifica di s3cmd e vedere se hai successo con esso o contattare Amazon per una soluzione migliore.


Bucket Explorer sembra funzionare bene per me (spostare file tra due secchi al momento)
Noodles

3
Dove si aws s3 sync s3://source s3://destinationadatta?
Olivier Lalonde,

7

Vecchio argomento, ma questo è per chiunque stia studiando lo stesso scenario. Insieme al tempo che ho impiegato, per oltre 20.000 oggetti. In esecuzione su AWS Linux / Centos, ogni oggetto è rappresentato per lo più da immagini, insieme ad alcuni video e vari file multimediali.

Utilizzo degli strumenti della CLI AWS per copiare i file dal bucket A al bucket B.

A. Crea il nuovo bucket

$ aws s3 mb s3://new-bucket-name

B. Sincronizza il vecchio bucket con il nuovo bucket

$ aws s3 sync s3://old-bucket-name s3://new-bucket-name

Copia di oltre 20.000 oggetti ...

Iniziato alle 17:03

Terminato 17:06

Tempo totale per oltre 20.000 oggetti = circa 3 minuti

Una volta che il nuovo bucket è configurato correttamente, ovvero autorizzazioni, criteri, ecc. E si desidera rimuovere il bucket precedente.

C. Rimuovere / eliminare il vecchio secchio

$ aws s3 rb --force s3://old-bucket-name

Salvatore della vita. Sto copiando 300 + GB. Un consiglio: se copi da secchi nella stessa regione è molto più veloce che in un'altra regione (e leggo che è meno costoso).
Marcelo Agimóvel,

Ho avuto un problema con il tuo metodo: la privacy dei file era impostata su PRIVATO, anche la maggior parte degli oggetti era pubblica, cosa è successo?
Marcelo Agimóvel,

5

Non sono sicuro che sia l'approccio migliore, ma la console di gestione AWS ha una funzione taglia / copia / incolla. molto facile da usare ed efficiente.


6
Non è probabile che funzioni bene con un milione di file.
James,

@James può dolorosamente confermarlo;)
derubare il

3

Immagino che probabilmente hai trovato una buona soluzione ormai, ma per gli altri che stanno riscontrando questo problema (come lo ero solo di recente), ho creato una semplice utility specificamente allo scopo di rispecchiare un bucket S3 su un altro in un modo altamente concorrenziale, ma efficiente per CPU e memoria.

È su github con licenza Apache qui: https://github.com/cobbzilla/s3s3mirror

Se decidi di provare, fammi sapere se hai qualche feedback.


Ho avuto un'ottima esperienza con s3s3mirror. Sono stato in grado di installarlo su un nodo m1.small EC2 e copiare 1,5 milioni di oggetti in circa 2 ore. L'installazione è stata un po 'dura, a causa della mia scarsa familiarità con Maven e Java, ma ci sono voluti solo alcuni comandi apt-get su Ubuntu per installare tutto. Un'ultima nota: se (come me) sei preoccupato di eseguire uno script sconosciuto su un bucket s3 grande e importante, crea un utente speciale con accesso di sola lettura sul bucket da copia e usa queste credenziali. Zero possibilità di cancellazione accidentale.
Michea il

Questo può essere applicato ai bucket tra account diversi?
Oliver Burdekin,

@OliverBurdekin sì, c'è --cross-account-copyun'opzione ( -Cin breve) per farlo. Si noti che durante la copia tra account, gli ACL non vengono copiati; il proprietario del bucket di destinazione disporrà delle autorizzazioni complete per i dati copiati.
cobbzilla,

Grazie @rfcreader Come posso stimare il costo di questo? Sono a conoscenza del calcolatore di costi AWS, ma non ho idea di cosa comporterà questo processo in termini di numero di richieste, ecc. Immagino che sia abbastanza facile contare queste metriche utilizzando l'interfaccia della riga di comando, ma se ne sai di più, ti preghiamo di contattarci. Il supporto AWS ha suggerito "il richiedente paga". ah!
Oliver Burdekin,

@OliverBurdekin s3s3mirror tiene traccia del numero di richieste AWS per tipo (GET, COPY, DELETE, ecc.). Queste statistiche vengono stampate periodicamente durante l'esecuzione e un'ultima volta alla fine. È possibile eseguire un'esecuzione limitata / di prova per copiare un piccolo sottoinsieme degli oggetti, questo dovrebbe darvi un'idea generale di quante richieste totali saranno necessarie per copiare l'intero set di dati.
cobbzilla,

2

La CLI AWS offre un modo per copiare un bucket in un altro in processi paralleli. Tratto da https://stackoverflow.com/a/40270349/371699 :

I seguenti comandi indicano all'interfaccia della riga di comando di AWS di utilizzare 1.000 thread per eseguire lavori (ciascuno un piccolo file o una parte di una copia multipart) e guardare avanti a 100.000 lavori:

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

Dopo aver eseguito questi, è possibile utilizzare il comando di sincronizzazione semplice come segue:

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

Su una macchina m4.xlarge (in AWS - 4 core, 16 GB di RAM), nel mio caso (file da 3-50 GB) la velocità di sincronizzazione / copia è passata da circa 9,5 MiB / sa 700 + MiB / s, un aumento della velocità di 70x rispetto alla configurazione predefinita.


0

Nel bucket perdente, selezionare i file che si desidera copiare su un altro bucket.

  • In Azioni, seleziona "Copia".
  • Vai al secchio che guadagna.
  • In Azioni, seleziona "Incolla"

1
Perché ripetere una soluzione che altri hanno menzionato un anno prima?
Benjamin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.