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?
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:
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:
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.
aws s3 sync s3://source s3://destination
adatta?
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
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.
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.
--cross-account-copy
un'opzione ( -C
in 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.
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.