Está baixando um depósito S3 inteiro?

705

Percebi que não parece haver uma opção para baixar um bucket S3 inteiro do AWS Management Console.

Existe uma maneira fácil de pegar tudo em um dos meus baldes? Eu estava pensando em tornar a pasta raiz pública, usando wgetpara pegar tudo e depois torná-la privada novamente, mas não sei se existe uma maneira mais fácil.

Rugbert
fonte
4
Como muitas pessoas aqui disseram, aws s3 syncé o melhor. Mas ninguém apontou uma opção poderosa: dryrun. Esta opção permite ver o que seria baixado / carregado de / para s3 quando você estiver usando sync. Isso é realmente útil quando você não deseja substituir o conteúdo no seu local ou em um bucket s3. É assim que é usado: aws s3 sync <source> <destination> --dryrunusei o tempo todo antes de enviar um novo conteúdo para um bucket para não fazer upload de alterações indesejadas.
Perimosh

Respostas:

1335

CLI da AWS

Consulte a " Referência de comandos da AWS CLI " para obter mais informações.

A AWS lançou recentemente suas ferramentas de linha de comando, que funcionam como boto e podem ser instaladas usando

sudo easy_install awscli

ou

sudo pip install awscli

Depois de instalado, você pode simplesmente executar:

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

Por exemplo:

aws s3 sync s3://mybucket .

fará o download de todos os objetos no mybucketdiretório atual.

E irá produzir:

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

Isso fará o download de todos os seus arquivos usando uma sincronização unidirecional. Ele não excluirá nenhum arquivo existente no diretório atual, a menos que você especifique , e não irá alterar ou excluir nenhum arquivo no S3. --delete

Você também pode fazer a sincronização do balde S3 para o balde S3 ou a sincronização local com o balde S3.

Confira a documentação e outros exemplos .

Enquanto o exemplo acima é como baixar um bucket completo, você também pode baixar uma pasta recursivamente executando

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

Isso instruirá a CLI a baixar todos os arquivos e chaves de pasta recursivamente no PATH/TO/FOLDERdiretório dentro do BUCKETNAMEbucket.

Layke
fonte
223
Primeiro, execute aws configuree adicione o seu access keye secret access keyque pode ser encontrado aqui .
Erwin Rooijakkers
12
Acesse aqui o instalador do Windows aws.amazon.com/cli . Ele seleciona o ID da chave de acesso da variável de ambiente "AWS_ACCESS_KEY_ID" e sua chave secreta de "AWS_SECRET_ACCESS_KEY".
Matt Bond
7
Eu tentei s3cmde Cyberduck, mas para mim, awsclifoi de longe a maneira mais rápida de baixar ~ 70.000 arquivos do meu balde.
Arjen
11
Observe que, embora a pergunta feita apenas sobre download, acredito que este comando faça uma sincronização bidirecional entre seu diretório e o S3. Se você não está tentando fazer upload de nada, verifique se o diretório atual está vazio.
Jesse Crossen
15
@JesseCrossen Esse aws s3 synccomando não carrega nada, mas exclui arquivos localmente se eles não existirem no S3. Veja a documentação .
Flimm
168

Você pode usar s3cmdpara baixar seu balde:

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

Há outra ferramenta que você pode usar chamada rclone. Este é um exemplo de código na documentação do Rclone:

rclone sync /home/local/directory remote:bucket
Phil M.
fonte
5
Isso é bem lento. Especialmente se você tentar usá-lo de forma incremental. Existe uma solução multiencadeada para saturar a largura de banda?
Peter13
as soluções abaixo desta são melhores, mais padrão e aberto para mais plataformas
abc123
Isso não funciona para o solicitante paga baldes (consulte arxiv.org/help/bulk_data_s3 ) :-(
Martin Thoma
como posso usar sua solução se precisar executar a correspondência de padrões para fazer o download? Minha pergunta: stackoverflow.com/questions/25086722/…
Shrikant Kakani
84

Usei alguns métodos diferentes para copiar dados do Amazon S3 para uma máquina local, incluindo s3cmde, de longe, o mais fácil é o Cyberduck .

Tudo que você precisa fazer é inserir suas credenciais da Amazon e usar a interface simples para baixar, fazer upload, sincronizar qualquer um de seus buckets, pastas ou arquivos.

Captura de tela

wedocando
fonte
Funciona bem! Disponível para Windows e Mac (GPL).
craastad 27/11
Cyberduck também torna mais fácil de baixar arquivos públicos de forma anónima - s3cmd parece exigir credenciais
chrishiestand
Funciona muito bem com o Transmit também.
Undistraction
A CLI estava me dando um erro quando eu estava tentando salvar meu bucket, isso funcionou perfeitamente!
Lazar Kukolj
Oh, isso veio inesperado. Eu usei o cyberduck anteriormente para FTP, mas nunca esperei que ele tivesse conectividade S3. Obrigado por uma ótima dica!
jskierbi
51

Você tem muitas opções para fazer isso, mas a melhor é usar a CLI da AWS.

Aqui está um passo a passo:

  1. Faça o download e instale a AWS CLI em sua máquina:

  2. Configure a CLI da AWS:

    insira a descrição da imagem aqui

    Certifique-se de inserir o acesso válido e as chaves secretas que você recebeu quando criou a conta.

  3. Sincronize o bucket S3 usando:

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

    No comando acima, substitua os seguintes campos:

    • yourbucket >> seu bucket do S3 que você deseja baixar.
    • /local/path >> caminho no seu sistema local onde você deseja baixar todos os arquivos.
Darshan Lila
fonte
Eu usei isso em vez do cyberduck, porque o cyberduck precisa "preparar" os arquivos antes de iniciar o download. Para grandes quantidades de arquivos que pareciam levar séculos e eu não consegui encontrar informações sobre o que "preparar" realmente faz. O CLI começou a baixar instantaneamente
Tashows
verifique se você tem esse s3://prefixo no nome do bucket !!! Com aws s3 lsvocê, você não precisa desse s3://prefixo, mas precisa de cpcomando.
cjmling 15/04
43

Para fazer o download usando a AWS S3 CLI:

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

Para baixar usando o código, use o AWS SDK.

Para baixar usando a GUI, use o Cyberduck.

Sarat Chandra
fonte
1
Como ignorar alguns arquivos ou pastas?
Nabin
1
@Nabin você pode usar --include & --exclude com curinga para excluir algum arquivo ou pasta, como este: aws s3 cp s3://my-bucket-name ./local-folder --recursive --include "*" --exclude "excludeFolder/*" --exclude "includeFolder/excludeFile.txt"
DarkCenobyte
21

Para o Windows, o S3 Browser é a maneira mais fácil que encontrei. É um excelente software e é gratuito para uso não comercial.

dworrad
fonte
3
Eu apenas tentei o "Download Todos os arquivos para ..." opção (que eu presumo é equivalente ao "baixar todo balde de s3" e ele disse que eu preciso para a versão Pro.
Jack Ukleja
2
Update: Mas eu era capaz de baixar uma pasta inteira dentro do balde que foi suficiente para minhas necessidades ...
Jack Ukleja
Sim, a versão gratuita é bastante limitada, você pode selecionar tudo e fazer o download, mas limitada a apenas 2 transferências simultâneas.
Hayden Thring
Estava procurando uma versão simples do Windows depois de obter algum erro de suporte python3 no Ubuntu 17.1 e s3cmd, isso funcionou bem.
edencorbin 25/10
21

Se você usa o Visual Studio, faça o download do " AWS Toolkit for Visual Studio ".

Após a instalação, vá para o Visual Studio - AWS Explorer - S3 - Seu bucket - Clique duas vezes

Na janela, você poderá selecionar todos os arquivos. Clique com o botão direito e faça o download de arquivos.

Ives.me
fonte
13

A resposta de @Layke é boa, mas se você tiver uma tonelada de dados e não quiser esperar para sempre, leia " Configuração do AWS CLI S3 ".

Os comandos a seguir instruirão a CLI da AWS a usar 1.000 threads para executar tarefas (cada um pequeno arquivo ou uma parte de uma cópia com várias partes) e analisar 100.000 tarefas:

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

Depois de executá-los, você pode usar o synccomando simples :

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

ou

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

Em um sistema com CPU 4 núcleos e 16 GB de RAM, para casos como o meu (arquivos de 3 a 50 GB), a velocidade de sincronização / cópia passou de cerca de 9,5MiB / s para 700 + MiB / s, um aumento de 70x na velocidade da configuração padrão.

James
fonte
1
Esta é a resposta real. apenas testei, do ec2 ele transferiu cerca de 2,3 GB / min. sem as opções simultâneas de cerca de 1 GB / min. salva-vidas.
Karsten
12

Use este comando com a CLI da AWS :

aws s3 cp s3://bucketname . --recursive
ashack
fonte
12

Outra opção que pode ajudar alguns usuários do OS X é o Transmit.

É um programa FTP que também permite que você se conecte aos seus arquivos S3. Além disso, possui uma opção para montar qualquer armazenamento FTP ou S3 como uma pasta no Finder, mas é apenas por um tempo limitado.

Diederik
fonte
9

Desenvolvi um pouco de desenvolvimento para o S3 e não encontrei uma maneira simples de baixar um balde inteiro.

Se você deseja codificar em Java, é fácil usar o jets3t lib para criar uma lista de buckets e iterar sobre essa lista para fazer o download deles.

Primeiro, obtenha um conjunto de chaves privadas públicas no console de gerenciamento da AWS para poder criar um objeto S3service:

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

Em seguida, obtenha uma matriz de seus objetos de buckets:

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

Por fim, itere sobre essa matriz para baixar os objetos, um de cada vez, com:

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

Coloquei o código de conexão em um singleton threadsafe. A sintaxe de tentativa / captura necessária foi omitida por razões óbvias.

Se você preferir codificar em Python, use o Boto.

Depois de examinar o BucketExplorer, " Fazer o download do balde inteiro " pode fazer o que você deseja.

jeremyjjbrown
fonte
A menos que você precise de uma solução Java, use a resposta aws cli acima.
precisa saber é o seguinte
crie uma nova pasta e o mesmo
Jisson 8/01/15
7

A API do AWS sdk é a melhor opção apenas para fazer upload de pastas inteiras e repo para s3 e baixar todo o bucket de s3 para localmente.

Para carregar a pasta inteira no s3

aws s3 sync . s3://BucketName

para baixar todo o balde s3 localmente

aws s3 sync s3://BucketName . 

você também pode atribuir o caminho Como BucketName / Path para uma pasta específica no s3 para fazer o download

Harsh Manvar
fonte
6

Você pode fazer isso com https://github.com/minio/mc :

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

O mc também suporta sessões, downloads recuperáveis, uploads e muito mais. mcsuporta sistemas operacionais Linux, OS X e Windows. Escrito em Golang e lançado sob a versão 2.0 do Apache.

Krishna Srinivas
fonte
5

Se você usa o Firefox com S3Fox, isso permite que você selecione todos os arquivos (selecione Shift primeiro e último) e clique com o botão direito do mouse e faça o download de todos ... Eu fiz isso com mais de 500 arquivos sem problemas

jpw
fonte
Isso não funciona para subpastas dentro de um bucket, mesmo que as "pseudo pastas" tenham sido criadas no console da AWS. (Até o momento em que escrevi este comentário) #
Wesley
Confirmado que não está funcionando, tenho cerca de 12k teclas de nível superior = subpastas), o S3Fox nem inicia. Também insista na permissão para listar todos os baldes!
Peter Lada
3

Se você tiver apenas arquivos lá (sem subdiretórios), uma solução rápida é selecionar todos os arquivos ( clickno primeiro e Shift+clickno último) e pressionar Enterou right clicke selecionar Open. Para a maioria dos arquivos de dados, eles serão baixados diretamente no seu computador.

Lukasz Czerwinski
fonte
3

Para adicionar outra opção da GUI, usamos a funcionalidade S3 do WinSCP . É muito fácil conectar, exigindo apenas sua chave de acesso e chave secreta na interface do usuário. Em seguida, você pode procurar e fazer o download dos arquivos necessários a partir de todos os buckets acessíveis, incluindo downloads recursivos de pastas aninhadas.

Como pode ser um desafio limpar um novo software com segurança e o WinSCP é bastante prevalente, pode ser realmente benéfico usá-lo em vez de tentar instalar um utilitário mais especializado.

bsplosion
fonte
1
  1. O usuário do Windows precisa baixar o S3EXPLORER a partir deste link, que também possui instruções de instalação: - http://s3browser.com/download.aspx

  2. Em seguida, forneça as credenciais da AWS, como chave de acesso, chave de acesso e região ao s3explorer, este link contém instruções de configuração para o s3explorer: Copiar link de colar no navegador: s3browser.com/s3browser-first-run.aspx

  3. Agora todos os seus baldes s3 seriam visíveis no painel esquerdo do s3explorer.

  4. Simplesmente selecione o balde e clique no menu Baldes no canto superior esquerdo e selecione a opção Download de todos os arquivos no menu. Abaixo está a captura de tela do mesmo:

Tela Seleção de caçamba

  1. Em seguida, procure uma pasta para baixar o balde em um local específico

  2. Clique em OK e seu download começará.

Patrick R
fonte
1

O aws sync é a solução perfeita. Ele não funciona em dois sentidos. É um caminho de origem e destino. Além disso, se você tiver muitos itens no bucket, será uma boa ideia criar o endpoint s3 primeiro para que o download aconteça mais rapidamente (porque o download não ocorre via Internet, mas via intranet) e sem custos

Deepak Singhal
fonte
1

Aqui estão algumas coisas para baixar todos os buckets, listá-los e listar seu conteúdo.

    //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 extensão ------------------- ------------------ /

//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
fonte
1

Você pode obtê-lo com o comando s3cmd :

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

Como Neel Bhaat explicou neste blog , existem muitas ferramentas diferentes que podem ser usadas para esse fim. Alguns são fornecidos pela AWS, sendo a maioria ferramentas de terceiros. Todas essas ferramentas exigem que você salve a chave e o segredo da sua conta da AWS na própria ferramenta. Seja muito cauteloso ao usar ferramentas de terceiros, pois as credenciais que você salva podem custar todo o seu valor e deixá-lo morto.

Portanto, eu sempre recomendo usar a CLI da AWS para essa finalidade. Você pode simplesmente instalar isso a partir deste link . Em seguida, execute o seguinte comando e salve seus valores secretos de chave na AWS CLI.

aws configure

E use o comando a seguir para sincronizar seu AWS S3 Bucket com sua máquina local. (A máquina local deve ter a AWS CLI instalada)

aws s3 sync <source> <destination>

Exemplos:

1) Para o AWS S3 no armazenamento local

aws s3 sync <S3Uri> <LocalPath>

2) Do armazenamento local para o AWS S3

aws s3 sync <LocalPath> <S3Uri>

3) Do AWS s3 bucket para outro bucket

aws s3 sync <S3Uri> <S3Uri> 
Keet Sugathadasa
fonte
Por exemplo 3, posso apontar para uma pasta Balde para outra pasta Balde? Na verdade, quero sincronizar uma pasta de bucket para outra pasta de bucket.
Lukai
@lukai yes. Isto é o que eu tenho dado no Exemplo 3. Você simplesmente precisa ter o s3 balde URIs de origem e de destino
Keet Sugathadasa
1

Se você deseja apenas baixar o bucket da AWS, primeiro instale a CLI da AWS em sua máquina. No terminal, altere o diretório para onde deseja baixar os arquivos e execute este comando.

aws s3 sync s3://bucket-name .

Se você também deseja sincronizar os diretórios local e s3 (caso tenha adicionado alguns arquivos na pasta local), execute este comando:

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

A AWS CLI é a melhor opção para baixar localmente um bucket S3 inteiro.

  1. Instale a CLI da AWS.

  2. Configure a CLI da AWS para usar credenciais de segurança padrão e Região da AWS padrão.

  3. Para baixar todo o bucket S3, use o comando

    aws s3 sync s3: // nome_do_bucket_caminho local

Referência para usar o AWS cli para diferentes serviços da AWS: https://docs.aws.amazon.com/cli/latest/reference/

cantarh30
fonte
1

Você pode usar este comando cli da AWS para baixar todo o conteúdo do bucket do S3 para a pasta local

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

Se você vir um erro como este

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

--no-verifica-ssl (booleano)

Por padrão, a CLI da AWS usa SSL ao se comunicar com os serviços da AWS. Para cada conexão SSL, a AWS CLI verificará os certificados SSL. Esta opção substitui o comportamento padrão da verificação de certificados SSL. referência

Use esta tag com o comando --no-confirm-ssl

aws s3 sync s3://your-bucket-name "Local Folder Path" --no-verify-ssl
Dimuthu
fonte
O uso do s3 syncé coberto acima várias vezes já. + Sugerir um uso --no-verify-sslsem explicar suas conseqüências de segurança é um crime.
Martin Prikryl
Obrigado pelas informações sobre segurança. Eu enfrentei esse problema e resolveu-o usando esta referência docs.aws.amazon.com/cli/latest/reference
Dimuthu
1

Se o bucket for muito grande, existe um comando chamado s4cmdque faz conexões paralelas e melhora o tempo de download:

Para instalá-lo no Debian como

apt install s4cmd

Se você tem pip:

pip install s4cmd

Ele lerá o ~/.s3cfgarquivo se presente (se não for instalar s3cmde executar s3cmd --configure) ou você pode especificar --access-key=ACCESS_KEY --secret-key=SECRET_KEYno comando.

O cli é semelhante a s3cmd. No seu caso, a syncé recomendado, pois você pode cancelar o download e iniciá-lo novamente sem precisar baixar novamente os arquivos.

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

Tenha cuidado se você baixar muitos dados (> 1 TB), pois isso pode afetar sua fatura. Calcule primeiro qual será o custo

Bartomeu
fonte
0

Como o @layke disse, é a melhor prática fazer o download do arquivo do S3 CLI, é um sistema seguro. Mas em alguns casos, as pessoas precisam usar o wget para baixar o arquivo e aqui está a solução

aws s3 presign s3://<your_bucket_name/>

Isso indicará uma URL pública temporária, que você poderá usar para baixar o conteúdo do S3 usando o presign_url, no seu caso usando o wget ou qualquer outro cliente de download.

Balaji JB
fonte
0

Tente este comando:

aws s3 sync yourBucketnameDirectory yourLocalDirectory

Por exemplo, se o nome do seu depósito for myBuckete o diretório local for c:\local, então:

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

Para mais informações sobre o awscli, verifique esta instalação do aws cli

PKP
fonte