¿Descargar un cubo S3 completo?

705

Noté que no parece haber una opción para descargar un bucket S3 completo de la consola de administración de AWS.

¿Hay una manera fácil de agarrar todo en uno de mis cubos? Estaba pensando en hacer pública la carpeta raíz, usarla wgetpara capturar todo, y luego volver a hacerlo privado, pero no sé si hay una manera más fácil.

Rugbert
fuente
44
Como mucha gente aquí dijo, aws s3 synces lo mejor. Pero nadie señaló una opción poderosa: dryrun. Esta opción le permite ver lo que se descargaría / cargaría de / a s3 cuando lo esté utilizando sync. Esto es realmente útil cuando no desea sobrescribir el contenido en su bucket local o s3. Así es como se usa: aws s3 sync <source> <destination> --dryrunlo usé todo el tiempo antes de enviar contenido nuevo a un bucket para no cargar cambios no deseados.
Perimosh

Respuestas:

1336

AWS CLI

Consulte la " Referencia de comandos de AWS CLI " para obtener más información.

AWS lanzó recientemente sus herramientas de línea de comandos, que funcionan de manera muy similar a boto y se pueden instalar usando

sudo easy_install awscli

o

sudo pip install awscli

Una vez instalado, puede simplemente ejecutar:

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

Por ejemplo:

aws s3 sync s3://mybucket .

descargará todos los objetos en mybucketel directorio actual.

Y dará salida:

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

Esto descargará todos sus archivos mediante una sincronización unidireccional. Será no elimine los archivos existentes en el directorio actual a menos que se especifique , y no va a cambiar o eliminar cualquier archivo en S3. --delete

También puede hacer S3 bucket a S3 bucket, o local a S3 bucket sync.

Consulte la documentación y otros ejemplos .

Mientras que el ejemplo anterior es cómo descargar un depósito completo, también puede descargar una carpeta de forma recursiva realizando

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

Esto le indicará a la CLI que descargue todos los archivos y claves de carpeta de forma recursiva dentro del PATH/TO/FOLDERdirectorio dentro del BUCKETNAMEdepósito.

Layke
fuente
223
Primero ejecute aws configurey agregue su access keyy secret access keyque se puede encontrar aquí .
Erwin Rooijakkers
12
Vaya aquí para el instalador de Windows aws.amazon.com/cli . Recoge la identificación de la clave de acceso de la variable de entorno "AWS_ACCESS_KEY_ID" y su clave secreta de "AWS_SECRET_ACCESS_KEY".
Matt Bond
77
Lo intenté s3cmdy Cyberduck, pero para mí awsclifue, con mucho, la forma más rápida de descargar ~ 70,000 archivos de mi bucket.
Arjen
11
Tenga en cuenta que, si bien la pregunta se refiere solo a la descarga, creo que este comando realizará una sincronización bidireccional entre su directorio y S3. Si no está intentando cargar nada, asegúrese de que el directorio actual esté vacío.
Jesse Crossen
15
@JesseCrossen Ese aws s3 synccomando no cargará nada, pero eliminará los archivos localmente si no existen en S3. Ver la documentación .
Flimm
168

Puedes usar s3cmdpara descargar tu bucket:

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

Hay otra herramienta que puede usar llamada rclone. Este es un ejemplo de código en la documentación de Rclone:

rclone sync /home/local/directory remote:bucket
Phil M.
fuente
55
Esto es bastante lento. Especialmente si intentas usarlo de forma incremental. ¿Existe una solución que sea multiproceso para que pueda saturar el ancho de banda?
Peter Lada
las soluciones a continuación son mejores, más estándar y abiertas a más plataformas
abc123
Esto no funciona para los solicitantes que pagan cubos (ver arxiv.org/help/bulk_data_s3 ) :-(
Martin Thoma
¿Cómo puedo usar su solución si tengo que realizar una coincidencia de patrones para la descarga? Mi pregunta: stackoverflow.com/questions/25086722/…
Shrikant Kakani
84

He utilizado algunos métodos diferentes para copiar datos de Amazon S3 en una máquina local, incluido s3cmd, y con mucho, el más fácil es Cyberduck .

Todo lo que necesita hacer es ingresar sus credenciales de Amazon y usar la interfaz simple para descargar, cargar, sincronizar cualquiera de sus buckets, carpetas o archivos.

Captura de pantalla

wedocando
fuente
¡Funciona genial! Disponible para Windows y Mac (GPL).
craastad
Cyberduck también facilita la descarga de archivos públicos de forma anónima - s3cmd parece requerir credenciales
chrishiestand
Funciona muy bien con Transmitir también.
Desvío
CLI me estaba dando un error cuando intentaba guardar mi cubo, ¡esto funcionó perfectamente!
Lazar Kukolj
Oh, eso vino inesperado. Utilicé cyberduck anteriormente para FTP, pero nunca esperé que tuviera conectividad S3. Gracias por una gran pista!
jskierbi
51

Tiene muchas opciones para hacerlo, pero la mejor es usar la CLI de AWS.

Aquí hay un recorrido:

  1. Descargue e instale AWS CLI en su máquina:

  2. Configure AWS CLI:

    ingrese la descripción de la imagen aquí

    Asegúrese de ingresar el acceso válido y las claves secretas , que recibió cuando creó la cuenta.

  3. Sincronice el bucket S3 usando:

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

    En el comando anterior, reemplace los siguientes campos:

    • yourbucket >> su bucket S3 que desea descargar.
    • /local/path >> ruta en su sistema local donde desea descargar todos los archivos.
Darshan Lila
fuente
Usé esto en lugar de cyberduck, porque cyberduck necesita "preparar" los archivos antes de que comience la descarga. Para grandes cantidades de archivos que parecían tomar años y no pude encontrar información sobre lo que realmente hace la "preparación". CLI comenzó a descargar al instante
Tashows
¡Asegúrate de tener ese s3://prefijo en el nombre del cubo! Con aws s3 lsusted no necesita ese s3://prefijo pero necesita un cpcomando.
cjmling
43

Para descargar con AWS S3 CLI:

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

Para descargar usando código, use el SDK de AWS.

Para descargar usando GUI, use Cyberduck.

Sarat Chandra
fuente
1
¿Cómo ignorar algunos archivos o carpetas?
Nabin
1
@Nabin puede usar --include y --excluye con comodín para excluir algunos archivos o carpetas, como este: aws s3 cp s3://my-bucket-name ./local-folder --recursive --include "*" --exclude "excludeFolder/*" --exclude "includeFolder/excludeFile.txt"
DarkCenobyte
21

Para Windows, S3 Browser es la forma más fácil que he encontrado. Es un excelente software y es gratuito para uso no comercial.

dworrad
fuente
3
Acabo de probar la opción "Descargar todos los archivos a ..." (que supongo que es equivalente a "descargar todo el s3 bucket" y decía que necesitaba la versión Pro.
Jack Ukleja
2
Actualización: Pero pude descargar una carpeta completa dentro del cubo que era suficiente para mis necesidades ...
Jack Ukleja
sí, la versión gratuita es bastante limitada, puedes seleccionar todo y descargar, pero solo 2 transferencias simultáneas
Hayden Thring
Estaba buscando una versión simple de Windows después de obtener un error de soporte de python3 en Ubuntu 17.1 y s3cmd, esto funcionó bien.
edencorbin
21

Si usa Visual Studio, descargue " AWS Toolkit for Visual Studio ".

Después de la instalación, vaya a Visual Studio - AWS Explorer - S3 - Su depósito - Haga doble clic

En la ventana podrá seleccionar todos los archivos. Haga clic derecho y descargue archivos.

Ives.me
fuente
13

La respuesta de @Layke es buena, pero si tiene un montón de datos y no quiere esperar para siempre, debe leer " Configuración de AWS CLI S3 ".

Los siguientes comandos le indicarán a la AWS CLI que use 1,000 subprocesos para ejecutar trabajos (cada uno un archivo pequeño o una parte de una copia multiparte) y anticipará 100,000 trabajos:

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

Después de ejecutar estos, puede usar el synccomando simple :

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

En un sistema con CPU de 4 núcleos y 16 GB de RAM, para casos como el mío (archivos de 3-50 GB), la velocidad de sincronización / copia pasó de aproximadamente 9.5MiB / sa 700 + MiB / s, un aumento de velocidad de 70x sobre la configuración predeterminada.

James
fuente
1
Esta es la verdadera respuesta. acabo de probarlo, desde ec2 transfirió alrededor de 2.3GB / min. sin las opciones concurrentes sobre 1GB / min. salvador de la vida.
Karsten
12

Utilice este comando con la AWS CLI :

aws s3 cp s3://bucketname . --recursive
asco
fuente
12

Otra opción que podría ayudar a algunos usuarios de OS X es Transmitir.

Es un programa FTP que también te permite conectarte a tus archivos S3. Y tiene una opción para montar cualquier almacenamiento FTP o S3 como una carpeta en el Finder, pero es solo por un tiempo limitado.

Diederik
fuente
9

He desarrollado un poco para S3 y no he encontrado una manera simple de descargar un paquete completo.

Si desea codificar en Java, jets3t lib es fácil de usar para crear una lista de cubos e iterar sobre esa lista para descargarlos.

Primero, obtenga un conjunto de claves públicas y privadas del consulado de administración de AWS para que pueda crear un objeto de servicio S3:

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

Luego, obtenga una matriz de sus objetos de cubos:

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

Finalmente, repita esa matriz para descargar los objetos uno a la vez con:

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

Puse el código de conexión en un singleton seguro para subprocesos. La sintaxis de prueba / captura necesaria se ha omitido por razones obvias.

Si prefieres codificar en Python, puedes usar Boto en su lugar.

Después de mirar alrededor de BucketExplorer, " Descargar el cubo completo " puede hacer lo que quieras.

jeremyjjbrown
fuente
A menos que necesite una solución Java, use la respuesta aws cli anterior.
jeremyjjbrown
crear una nueva carpeta y lo mismo
Jisson
7

AWS sdk API solo será la mejor opción para cargar toda la carpeta y repositorio a s3 y descargar todo el paquete de s3 a nivel local.

Para cargar toda la carpeta en s3

aws s3 sync . s3://BucketName

para descargar todo el s3 bucket localmente

aws s3 sync s3://BucketName . 

también puede asignar una ruta como BucketName / Path para una carpeta particular en s3 para descargar

Manvar duro
fuente
6

Puede hacer esto con https://github.com/minio/mc :

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

mc también admite sesiones, descargas reanudables, cargas y mucho más. mcadmite sistemas operativos Linux, OS X y Windows. Escrito en Golang y publicado bajo la versión 2.0 de Apache.

Krishna Srinivas
fuente
5

Si usa Firefox con S3Fox, eso le permite seleccionar todos los archivos (shift-select primero y último) y hacer clic derecho y descargar todo ... Lo he hecho con más de 500 archivos sin problema

jpw
fuente
Esto no funciona para subcarpetas dentro de un depósito, incluso si las "pseudocarpetas" se crearon en la consola de AWS. (Al momento de escribir este comentario)
Wesley
Confirmado que no funciona, tengo unas 12k claves de nivel superior = subcarpetas), S3Fox ni siquiera se inicia. ¡También insista en el permiso para enumerar todos los cubos!
Peter Lada
3

Si solo tiene archivos allí (sin subdirectorios), una solución rápida es seleccionar todos los archivos ( clicken el primero, Shift+clicken el último) y presionar Entero right clicky seleccionar Open. Para la mayoría de los archivos de datos, esto los descargará directamente a su computadora.

Lukasz Czerwinski
fuente
3

Para agregar otra opción de GUI, utilizamos la funcionalidad S3 de WinSCP . Es muy fácil conectarse, solo requiere su clave de acceso y clave secreta en la interfaz de usuario. A continuación, puede examinar y descargar los archivos que necesite de cualquier depósito accesible, incluidas las descargas recursivas de carpetas anidadas.

Dado que puede ser un desafío eliminar el nuevo software a través de la seguridad y WinSCP es bastante frecuente, puede ser realmente beneficioso usarlo en lugar de intentar instalar una utilidad más especializada.

bsplosion
fuente
1
  1. El usuario de Windows debe descargar S3EXPLORER desde este enlace que también tiene instrucciones de instalación: - http://s3browser.com/download.aspx

  2. Luego proporcione sus credenciales de AWS como secretkey, accesskey y region al s3explorer, este enlace contiene instrucciones de configuración para s3explorer: Copiar Pegar enlace en el navegador: s3browser.com/s3browser-first-run.aspx

  3. Ahora todos sus depósitos de s3 serían visibles en el panel izquierdo de s3explorer.

  4. Simplemente seleccione el cubo y haga clic en el menú Cubos en la esquina superior izquierda, luego seleccione Descargar todos los archivos a la opción del menú. A continuación se muestra la captura de pantalla para el mismo:

Pantalla de selección de cubeta

  1. Luego busque una carpeta para descargar el depósito en un lugar en particular

  2. Haga clic en Aceptar y comenzará su descarga.

Patrick R
fuente
1

aws sync es la solución perfecta. No lo hace en dos sentidos ... es unidireccional desde el origen hasta el destino. Además, si tiene muchos elementos en el cubo, será una buena idea crear un punto final s3 primero para que la descarga se realice más rápido (porque la descarga no se realiza a través de Internet sino a través de la intranet) y sin cargos

Deepak Singhal
fuente
1

Aquí hay algunas cosas para descargar todos los cubos, enumerarlos, enumerar sus contenidos.

    //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());
}

/ ---------------------------- Métodos de extensión ------------------- ------------------ /

//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.");
}

}

John Hanewich
fuente
1

Puede obtenerlo simplemente con el comando s3cmd :

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

Como Neel Bhaat ha explicado en este blog , hay muchas herramientas diferentes que pueden usarse para este propósito. Algunos son provistos por AWS, donde la mayoría son herramientas de terceros. Todas estas herramientas requieren que guarde la clave y el secreto de su cuenta de AWS en la herramienta misma. Sea muy cauteloso cuando use herramientas de terceros, ya que las credenciales que guarda pueden costarle todo su valor y dejarlo muerto.

Por lo tanto, siempre recomiendo usar la AWS CLI para este propósito. Simplemente puede instalar esto desde este enlace . A continuación, ejecute el siguiente comando y guarde su clave, valores secretos en la CLI de AWS.

aws configure

Y use el siguiente comando para sincronizar su AWS S3 Bucket con su máquina local. (La máquina local debe tener AWS CLI instalada)

aws s3 sync <source> <destination>

Ejemplos:

1) Para AWS S3 a almacenamiento local

aws s3 sync <S3Uri> <LocalPath>

2) Del almacenamiento local a AWS S3

aws s3 sync <LocalPath> <S3Uri>

3) De la cubeta AWS s3 a otra cubeta

aws s3 sync <S3Uri> <S3Uri> 
Keet Sugathadasa
fuente
Por ejemplo 3, ¿puedo señalar una carpeta de depósito a otra carpeta de depósito? En realidad, quiero sincronizar una carpeta de cubo con otra carpeta de cubo.
lukai
@lukai sí. Esto es lo que he dado en el Ejemplo 3. Simplemente necesita tener los URI de cubo s3 de origen y destino
Keet Sugathadasa
1

Si solo desea descargar el bucket de AWS, primero instale la AWS CLI en su máquina. En la terminal, cambie el directorio a donde desea descargar los archivos y ejecute este comando.

aws s3 sync s3://bucket-name .

Si también desea sincronizar los directorios local y s3 ​​(en caso de que haya agregado algunos archivos en la carpeta local), ejecute este comando:

aws s3 sync . s3://bucket-name
Muzammil
fuente
1

AWS CLI es la mejor opción para descargar un bucket S3 completo localmente.

  1. Instale AWS CLI.

  2. Configure la CLI de AWS para usar las credenciales de seguridad predeterminadas y la Región de AWS predeterminada.

  3. Para descargar todo el cubo S3, use el comando

    aws s3 sync s3: // yourbucketname localpath

Referencia para usar AWS cli para diferentes servicios de AWS: https://docs.aws.amazon.com/cli/latest/reference/

singh30
fuente
1

Puede usar este comando de AWS cli para descargar todo el contenido del depósito S3 a la carpeta local

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

Si ves un error como este

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

--no-verificar-ssl (booleano)

De manera predeterminada, la CLI de AWS usa SSL cuando se comunica con los servicios de AWS. Para cada conexión SSL, la AWS CLI verificará los certificados SSL. Esta opción anula el comportamiento predeterminado de verificar los certificados SSL. referencia

Use esta etiqueta con el comando --no-verificar-ssl

aws s3 sync s3://your-bucket-name "Local Folder Path" --no-verify-ssl
Dimuthu
fuente
El uso del s3 syncestá cubierto anteriormente varias veces ya. + Sugerir un uso de --no-verify-sslsin explicar sus consecuencias de seguridad es un delito.
Martin Prikryl
Gracias por la información sobre seguridad. Enfrenté
Dimuthu
1

Si el cubo es bastante grande, hay un comando llamado s4cmd que realiza conexiones paralelas y mejora el tiempo de descarga:

Para instalarlo en Debian como

apt install s4cmd

Si tienes pip:

pip install s4cmd

Leerá el ~/.s3cfgarchivo si está presente (si no se instala s3cmdy ejecuta s3cmd --configure) o puede especificar--access-key=ACCESS_KEY --secret-key=SECRET_KEY en el comando.

El cli es similar a s3cmd. En su caso, syncse recomienda a ya que puede cancelar la descarga e iniciarla nuevamente sin tener que volver a descargar los archivos.

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

Tenga cuidado si descarga una gran cantidad de datos (> 1 TB), esto puede afectar su factura, calcule primero cuál será el costo

Bartomeu
fuente
0

Como dijo @layke, es la mejor práctica descargar el archivo desde el cli S3, es seguro y protegido. Pero en algunos casos, las personas necesitan usar wget para descargar el archivo y aquí está la solución

aws s3 presign s3://<your_bucket_name/>

Esto presignará obtendrá una URL pública temporal que puede usar para descargar contenido de S3 usando presign_url, en su caso usando wget o cualquier otro cliente de descarga.

Balaji JB
fuente
0

Prueba este comando:

aws s3 sync yourBucketnameDirectory yourLocalDirectory

Por ejemplo, si el nombre de su depósito es myBuckety el directorio local es c:\local, entonces:

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

Para obtener más información sobre awscli, consulte esta instalación de aws cli

PKP
fuente