Download di un intero bucket S3?


705

Ho notato che non sembra esserci un'opzione per scaricare un intero bucket S3 dalla Console di gestione AWS.

C'è un modo semplice per afferrare tutto in uno dei miei secchi? Stavo pensando di rendere pubblica la cartella principale, usando wgetper afferrarla tutta, e poi renderla di nuovo privata, ma non so se c'è un modo più semplice.


4
Come molte persone qui hanno detto, aws s3 syncè il migliore. Ma nessuno ha sottolineato una potente opzione: dryrun. Questa opzione ti consente di vedere cosa verrebbe scaricato / caricato da / a s3 quando lo stai usando sync. Questo è davvero utile quando non si desidera sovrascrivere il contenuto nel proprio locale o in un bucket s3. Ecco come si usa: l' aws s3 sync <source> <destination> --dryrunho usato tutto il tempo prima di spingere nuovi contenuti in un bucket per non caricare modifiche indesiderate.
Perimosh,

Risposte:


1335

CLI AWS

Per ulteriori informazioni, consultare la " Guida ai comandi della CLI AWS ".

AWS ha recentemente rilasciato i suoi strumenti da riga di comando, che funzionano in modo molto simile a boto e possono essere installati utilizzando

sudo easy_install awscli

o

sudo pip install awscli

Una volta installato, puoi semplicemente eseguire:

aws s3 sync s3://<source_bucket> <local_destination>

Per esempio:

aws s3 sync s3://mybucket .

scaricherà tutti gli oggetti nella mybucketdirectory corrente.

E produrrà:

download: s3://mybucket/test.txt to test.txt
download: s3://mybucket/test2.txt to test2.txt

Questo scaricherà tutti i tuoi file usando una sincronizzazione unidirezionale. Sarà Non eliminare i file esistenti nella directory corrente se non si specifica , e non cambierà o eliminare alcun file su S3. --delete

Puoi anche eseguire il bucket S3 con il bucket S3 o la sincronizzazione locale con il bucket S3.

Consulta la documentazione e altri esempi .

Mentre l'esempio sopra è come scaricare un bucket completo, è anche possibile scaricare una cartella in modo ricorsivo eseguendo

aws s3 cp s3://BUCKETNAME/PATH/TO/FOLDER LocalFolderName --recursive

Questo indicherà alla CLI di scaricare tutti i file e le chiavi delle cartelle in modo ricorsivo all'interno della PATH/TO/FOLDERdirectory all'interno del BUCKETNAMEbucket.


223
Prima esegui aws configuree aggiungi il tuo access keye secret access keyche puoi trovare qui .
Erwin Rooijakkers,

12
Vai qui per il programma di installazione di Windows aws.amazon.com/cli . Raccoglie l'ID chiave di accesso dalla variabile di ambiente "AWS_ACCESS_KEY_ID" e la tua chiave segreta da "AWS_SECRET_ACCESS_KEY".
Matt Bond,

7
Ho provato s3cmde Cyberduck, ma per me è awsclistato di gran lunga il modo più veloce per scaricare ~ 70.000 file dal mio bucket.
Arjen,

11
Si noti che, sebbene la domanda sia solo relativa al download, credo che questo comando eseguirà una sincronizzazione bidirezionale tra la directory e S3. Se non stai tentando di caricare nulla, assicurati che la directory corrente sia vuota.
Jesse Crossen,

15
@JesseCrossen Questo aws s3 synccomando non caricherà nulla, ma eliminerà i file localmente se non esistono su S3. Vedere la documentazione .
Flimm,

168

Puoi usare s3cmdper scaricare il tuo bucket:

s3cmd --configure
s3cmd sync s3://bucketnamehere/folder /destination/folder

C'è un altro strumento che puoi usare chiamato rclone. Questo è un esempio di codice nella documentazione di Rclone:

rclone sync /home/local/directory remote:bucket

5
Questo è abbastanza lento. Soprattutto se si tenta di utilizzarlo in modo incrementale. Esiste una soluzione multi-thread in modo da saturare la larghezza di banda?
Peter Lada,

le soluzioni sottostanti sono migliori, più standard e aperte a più piattaforme
abc123

Questo non funziona per il richiedente paga secchi (vedi arxiv.org/help/bulk_data_s3 ) :-(
Martin Thoma,

come posso utilizzare la soluzione se devo eseguire il pattern matching per il download? La mia domanda: stackoverflow.com/questions/25086722/...
Shrikant Kakani

84

Ho usato alcuni metodi diversi per copiare i dati di Amazon S3 su un computer locale, incluso s3cmd, e di gran lunga il più semplice è Cyberduck .

Tutto quello che devi fare è inserire le tue credenziali Amazon e utilizzare la semplice interfaccia per scaricare, caricare, sincronizzare i tuoi secchi, cartelle o file.

Immagine dello schermo


Funziona alla grande! Disponibile per Windows e Mac (GPL).
Craastad,

Cyberduck semplifica anche il download di file pubblici in modo anonimo - s3cmd sembra richiedere credenziali
chrishiestand,

Funziona benissimo anche con Transmit.
Disdetta

CLI mi stava dando un errore quando stavo cercando di salvare il mio secchio, questo ha funzionato perfettamente!
Lazar Kukolj,

Oh, è arrivato inaspettato. Ho usato cyberduck in precedenza per FTP, ma non mi sarei mai aspettato che avesse la connettività S3. Grazie per un grande suggerimento!
jskierbi,

51

Hai molte opzioni per farlo, ma la migliore è usare l'interfaccia della riga di comando di AWS.

Ecco una guida:

  1. Scarica e installa AWS CLI sul tuo computer:

  2. Configura l'interfaccia della riga di comando di AWS:

    inserisci qui la descrizione dell'immagine

    Assicurati di inserire un accesso valido e chiavi segrete , che hai ricevuto quando hai creato l'account.

  3. Sincronizza il bucket S3 usando:

    aws s3 sync s3://yourbucket /local/path
    

    Nel comando sopra, sostituisci i seguenti campi:

    • yourbucket >> il tuo bucket S3 che desideri scaricare.
    • /local/path >> percorso nel sistema locale in cui si desidera scaricare tutti i file.

Ho usato questo invece di cyberduck, perché cyberduck ha bisogno di "preparare" i file prima che inizi il download. Per grandi quantità di file che sembrano richiedere secoli e non sono riuscito a trovare informazioni su ciò che effettivamente fa "preparazione". La CLI ha iniziato a scaricare immediatamente
Tashows il

assicurati di avere quel s3://prefisso nel nome del bucket !!! Con aws s3 lste non hai bisogno di quel s3://prefisso ma hai bisogno di cpcomando.
giocherellando il

43

Per scaricare utilizzando l'interfaccia della riga di comando di AWS S3:

aws s3 cp s3://WholeBucket LocalFolder --recursive
aws s3 cp s3://Bucket/Folder LocalFolder --recursive

Per scaricare utilizzando il codice, utilizzare l'SDK AWS.

Per scaricare utilizzando la GUI, utilizzare Cyberduck.


1
Come ignorare alcuni file o cartelle?
Nabin,

1
@Nabin puoi usare --include & --exclude con jolly per escludere alcuni file o cartelle, in questo modo: aws s3 cp s3://my-bucket-name ./local-folder --recursive --include "*" --exclude "excludeFolder/*" --exclude "includeFolder/excludeFile.txt"
DarkCenobyte

21

Per Windows, S3 Browser è il modo più semplice che ho trovato. È un software eccellente ed è gratuito per uso non commerciale.


3
Ho appena provato l'opzione "Scarica tutti i file in ..." (che presumo equivale al "scarica intero secchio s3" e ha detto che ho bisogno della versione Pro.
Jack Ukleja

2
Aggiornamento: Ma sono stato in grado di scaricare un'intera cartella all'interno del bucket che era sufficiente per le mie esigenze ...
Jack Ukleja

sì, la versione gratuita è piuttosto limitata, puoi selezionare tutto e scaricare, ma solo 2 trasferimenti simultanei
Hayden Thring,

Stavo cercando una versione semplice di Windows dopo aver ricevuto un errore di supporto di python3 su Ubuntu 17.1 e s3cmd, funzionava bene.
edencorbin,

21

Se usi Visual Studio, scarica " AWS Toolkit for Visual Studio ".

Dopo l'installazione, vai su Visual Studio - AWS Explorer - S3 - Il tuo bucket - Fai doppio clic

Nella finestra sarai in grado di selezionare tutti i file. Fare clic con il tasto destro e scaricare i file.


13

La risposta di @Layke è buona, ma se hai un sacco di dati e non vuoi aspettare per sempre, dovresti leggere " Configurazione AWS CLI S3 ".

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 semplice synccomando:

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

o

aws s3 sync s3://source-bucket/source-path c:\my\local\data\path

Su un sistema con CPU 4 core e 16 GB di RAM, per casi come il mio (file da 3-50 GB) la velocità di sincronizzazione / copia è passata da circa 9,5 MiB / sa 700 + MiB / s, con un aumento della velocità di 70x rispetto alla configurazione predefinita.


1
questa è la vera risposta. appena testato, da ec2 ha trasferito circa 2,3 GB / min. senza le opzioni simultanee circa 1 GB / min. salvavita.
Karsten


12

Un'altra opzione che potrebbe aiutare alcuni utenti di OS X è Transmit.

È un programma FTP che ti consente anche di connetterti ai tuoi file S3. Inoltre, ha un'opzione per montare qualsiasi archivio FTP o S3 come cartella nel Finder, ma è solo per un tempo limitato.


9

Ho fatto un po 'di sviluppo per S3 e non ho trovato un modo semplice per scaricare un intero bucket.

Se si desidera codificare in Java la libreria jets3t è facile da usare per creare un elenco di bucket e scorrere su tale elenco per scaricarli.

Innanzitutto, ottieni un set di chiavi private pubbliche dal consule di gestione AWS in modo da poter creare un oggetto S3service:

AWSCredentials awsCredentials = new AWSCredentials(YourAccessKey, YourAwsSecretKey);
s3Service = new RestS3Service(awsCredentials);

Quindi, ottieni una matrice dei tuoi oggetti bucket:

S3Object[] objects = s3Service.listObjects(YourBucketNameString);

Infine, scorrere su quell'array per scaricare gli oggetti uno alla volta con:

S3Object obj = s3Service.getObject(bucket, fileName);
            file = obj.getDataInputStream();

Ho inserito il codice di connessione in un singleton thread-safe. La sintassi try / catch necessaria è stata omessa per ovvie ragioni.

Se preferisci programmare in Python, puoi usare Boto.

Dopo aver guardato BucketExplorer, " Scaricare l'intero bucket " può fare ciò che desideri.


A meno che non sia necessaria una soluzione Java, utilizzare la risposta di aws cli sopra.
jeremyjjbrown,

creare una nuova cartella e così lo stesso
Jisson

7

L'API sdk di AWS è la migliore opzione per caricare l'intera cartella e repository su s3 e scaricare l'intero bucket di s3 in locale.

Per caricare l'intera cartella su s3

aws s3 sync . s3://BucketName

per scaricare l'intero bucket s3 localmente

aws s3 sync s3://BucketName . 

puoi anche assegnare il percorso Come BucketName / Path per una particolare cartella da scaricare in s3


6

Puoi farlo con https://github.com/minio/mc :

mc cp -r https://s3-us-west-2.amazonaws.com/bucketName/ localdir

mc supporta anche sessioni, download ripristinabili, upload e molti altri. mcsupporta i sistemi operativi Linux, OS X e Windows. Scritto in Golang e rilasciato sotto Apache versione 2.0.


5

Se usi Firefox con S3Fox, QUESTO ti consente di selezionare tutti i file (maiusc-seleziona il primo e l'ultimo) e fare clic con il tasto destro e scaricare tutto ... L'ho fatto con oltre 500 file senza problemi


Questo non funziona per le sottocartelle all'interno di un bucket, anche se le "pseudo cartelle" sono state create nella console AWS. (Al momento della stesura di questo commento)
Wesley,

Confermato che non funziona, ho circa 12k chiavi di livello superiore = sottocartelle), S3Fox non si avvia nemmeno. Insistere anche sul permesso di elencare tutti i bucket!
Peter Lada,


3

Se ci sono solo file lì (nessuna sottodirectory) una soluzione rapida è selezionare tutti i file ( clicksul primo, Shift+clicksull'ultimo) e premere Entero right clicke selezionare Open. Per la maggior parte dei file di dati, questi verranno scaricati direttamente sul tuo computer.


3

Per aggiungere un'altra opzione GUI, utilizziamo la funzionalità S3 di WinSCP . È molto facile connettersi, richiede solo la chiave di accesso e la chiave segreta nell'interfaccia utente. È quindi possibile sfogliare e scaricare qualsiasi file richiesto da qualsiasi bucket accessibile, inclusi download ricorsivi di cartelle nidificate.

Dal momento che può essere una sfida cancellare i nuovi software attraverso la sicurezza e WinSCP è abbastanza diffuso, può essere davvero utile usarlo piuttosto che provare a installare un'utilità più specializzata.


1
  1. L'utente di Windows deve scaricare S3EXPLORER da questo link che contiene anche le istruzioni di installazione: - http://s3browser.com/download.aspx

  2. Quindi fornisci le credenziali AWS come secretkey, accesskey e region a s3explorer, questo link contiene le istruzioni di configurazione per s3explorer: Copia Incolla collegamento nel browser: s3browser.com/s3browser-first-run.aspx

  3. Ora tutti i tuoi secchi s3 sarebbero visibili sul pannello di sinistra di s3explorer.

  4. Basta selezionare il bucket e fare clic sul menu Buckets nell'angolo in alto a sinistra, quindi selezionare Scarica tutti i file nell'opzione dal menu. Di seguito è riportato lo screenshot per lo stesso:

Schermata di selezione della benna

  1. Quindi sfogliare una cartella per scaricare il bucket in un determinato luogo

  2. Fai clic su OK e il download inizierà.


1

aws sync è la soluzione perfetta. Non fa un doppio senso ... è un solo modo dalla sorgente alla destinazione. Inoltre, se hai molti elementi nel bucket, sarà una buona idea creare prima l'endpoint s3 in modo che il download avvenga più rapidamente (perché il download non avviene tramite Internet ma tramite Intranet) e senza costi


1

Ecco alcune cose per scaricare tutti i bucket, elencarli, elencare i loro contenuti.

    //connection string
    private static void dBConnection() {
    app.setAwsCredentials(CONST.getAccessKey(), CONST.getSecretKey());
    conn = new AmazonS3Client(app.getAwsCredentials());
    app.setListOfBuckets(conn.listBuckets());
    System.out.println(CONST.getConnectionSuccessfullMessage());
    }

    private static void downloadBucket() {

    do {
        for (S3ObjectSummary objectSummary : app.getS3Object().getObjectSummaries()) {
            app.setBucketKey(objectSummary.getKey());
            app.setBucketName(objectSummary.getBucketName());
            if(objectSummary.getKey().contains(CONST.getDesiredKey())){
                //DOWNLOAD
                try 
                {
                    s3Client = new AmazonS3Client(new ProfileCredentialsProvider());
                    s3Client.getObject(
                            new GetObjectRequest(app.getBucketName(),app.getBucketKey()),
                            new File(app.getDownloadedBucket())
                            );
                } catch (IOException e) {
                    e.printStackTrace();
                }

                do
                {
                     if(app.getBackUpExist() == true){
                        System.out.println("Converting back up file");
                        app.setCurrentPacsId(objectSummary.getKey());
                        passIn = app.getDataBaseFile();
                        CONVERT= new DataConversion(passIn);
                        System.out.println(CONST.getFileDownloadedMessage());
                    }
                }
                while(app.getObjectExist()==true);

                if(app.getObjectExist()== false)
                {
                    app.setNoObjectFound(true);
                }
            }
        }
        app.setS3Object(conn.listNextBatchOfObjects(app.getS3Object()));
    } 
    while (app.getS3Object().isTruncated());
}

/ ---------------------------- Metodi di estensione ------------------- ------------------ /

//Unzip bucket after download 
public static void unzipBucket() throws IOException {
    unzip = new UnZipBuckets();
    unzip.unZipIt(app.getDownloadedBucket());
    System.out.println(CONST.getFileUnzippedMessage());
}

//list all S3 buckets
public static void listAllBuckets(){
    for (Bucket bucket : app.getListOfBuckets()) {
        String bucketName = bucket.getName();
        System.out.println(bucketName + "\t" + StringUtils.fromDate(bucket.getCreationDate()));
    }
}

//Get the contents from the auto back up bucket
public static void listAllBucketContents(){     
    do {
        for (S3ObjectSummary objectSummary : app.getS3Object().getObjectSummaries()) {
            if(objectSummary.getKey().contains(CONST.getDesiredKey())){
                System.out.println(objectSummary.getKey() + "\t" + objectSummary.getSize() + "\t" + StringUtils.fromDate(objectSummary.getLastModified()));
                app.setBackUpCount(app.getBackUpCount() + 1);   
            }
        }
        app.setS3Object(conn.listNextBatchOfObjects(app.getS3Object()));
    } 
    while (app.getS3Object().isTruncated());
    System.out.println("There are a total of : " + app.getBackUpCount() + " buckets.");
}

}


1

Puoi ottenerlo semplicemente con il comando s3cmd :

s3cmd get --recursive --continue s3://test-bucket local-directory/

1

Come ha spiegato Neel Bhaat in questo blog , ci sono molti strumenti diversi che possono essere usati per questo scopo. Alcuni sono forniti da AWS, dove la maggior parte sono strumenti di terze parti. Tutti questi strumenti richiedono di salvare la chiave dell'account AWS e di nasconderla nello strumento stesso. Sii molto cauto quando usi strumenti di terze parti, poiché le credenziali che risparmi potrebbero costarti, tutto il tuo valore e farti morire.

Pertanto, consiglio sempre di utilizzare l' interfaccia della riga di comando di AWS per questo scopo. Puoi semplicemente installarlo da questo link . Quindi, esegui il comando seguente e salva la chiave, i valori segreti nella CLI AWS.

aws configure

E usa il seguente comando per sincronizzare il tuo secchio AWS S3 con il tuo computer locale. (Sul computer locale dovrebbe essere installata l'interfaccia della riga di comando di AWS)

aws s3 sync <source> <destination>

Esempi:

1) Per AWS S3 su archiviazione locale

aws s3 sync <S3Uri> <LocalPath>

2) Dall'archiviazione locale ad AWS S3

aws s3 sync <LocalPath> <S3Uri>

3) Dal secchio AWS s3 a un altro secchio

aws s3 sync <S3Uri> <S3Uri> 

Ad esempio 3, posso puntare a una cartella Bucket su un'altra cartella Bucket? In realtà, voglio sincronizzare una cartella bucket con un'altra cartella bucket.
lukai,

@lukai sì. Questo è quello che ho dato nell'esempio 3. Devi semplicemente avere gli URI bucket S3 di origine e destinazione
Keet Sugathadasa,

1

Se desideri scaricare il bucket solo da AWS, installa prima l'interfaccia della riga di comando di AWS sul tuo computer. Nel terminale cambiare la directory in cui si desidera scaricare i file ed eseguire questo comando.

aws s3 sync s3://bucket-name .

Se vuoi anche sincronizzare le directory sia locale che s3 (nel caso in cui tu abbia aggiunto alcuni file nella cartella locale), esegui questo comando:

aws s3 sync . s3://bucket-name

1

AWS CLI è l'opzione migliore per scaricare un intero bucket S3 localmente.

  1. Installa l' interfaccia della riga di comando di AWS.

  2. Configura l' interfaccia della riga di comando di AWS per l'utilizzo delle credenziali di sicurezza predefinite e della regione AWS predefinita.

  3. Per scaricare l'intero bucket S3 utilizzare il comando

    aws s3 sync s3: // yourbucketname localpath

Riferimento per l'uso di AWS cli per diversi servizi AWS: https://docs.aws.amazon.com/cli/latest/reference/


1

Puoi utilizzare questo comando cli AWS per scaricare l'intero contenuto del bucket S3 nella cartella locale

aws s3 sync s3://your-bucket-name "Local Folder Path"

Se vedi un errore come questo

fatal error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)

--no-confirm-ssl (booleano)

Per impostazione predefinita, l'interfaccia della riga di comando di AWS utilizza SSL quando comunica con i servizi AWS. Per ogni connessione SSL, l'interfaccia della riga di comando di AWS verificherà i certificati SSL. Questa opzione sovrascrive il comportamento predefinito della verifica dei certificati SSL. riferimento

Usa questo tag con il comando --no-confirm-ssl

aws s3 sync s3://your-bucket-name "Local Folder Path" --no-verify-ssl

L'uso di s3 syncè già descritto più volte sopra. + Suggerire un uso --no-verify-sslsenza spiegarne le conseguenze sulla sicurezza è un crimine.
Martin Prikryl,

Grazie per le informazioni sulla sicurezza. Ho affrontato questo problema e risolto utilizzando questo documento di riferimento docs.aws.amazon.com/cli/latest/reference
Dimuthu

1

Se il bucket è abbastanza grande, c'è un comando chiamato s4cmdche crea connessioni parallele e migliora il tempo di download:

Per installarlo su Debian piace

apt install s4cmd

Se hai pip:

pip install s4cmd

Leggerà il ~/.s3cfgfile se presente (se non installato s3cmded eseguito s3cmd --configure) oppure è possibile specificare--access-key=ACCESS_KEY --secret-key=SECRET_KEY il comando.

Il cli è simile a s3cmd. Nel tuo caso, syncsi consiglia di annullare il download e di riavviarlo senza dover scaricare nuovamente i file.

s4cmd [--access-key=ACCESS_KEY --secret-key=SECRET_KEY] sync s3://<your-bucket> /some/local/dir

Fai attenzione se scarichi molti dati (> 1 TB) questo potrebbe influire sulla tua fattura, calcola prima quale sarà il costo


0

Come ha detto @layke, è consigliabile scaricare il file da S3 cli in modo sicuro. Ma in alcuni casi, le persone devono usare wget per scaricare il file ed ecco la soluzione

aws s3 presign s3://<your_bucket_name/>

Questo assegnerà un URL pubblico temporaneo che puoi utilizzare per scaricare contenuti da S3 utilizzando presign_url, nel tuo caso utilizzando wget o qualsiasi altro client di download.


0

Prova questo comando:

aws s3 sync yourBucketnameDirectory yourLocalDirectory

Ad esempio, se il nome del bucket è myBuckete la directory locale è c:\local, quindi:

aws s3 sync s3://myBucket c:\local

Per maggiori informazioni su awscli controlla questa installazione di aws cli

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.