Vous téléchargez un bucket S3 entier?

705

J'ai remarqué qu'il ne semble pas y avoir d'option pour télécharger un compartiment S3 entier à partir de la AWS Management Console.

Existe-t-il un moyen facile de tout saisir dans l'un de mes seaux? Je pensais à rendre le dossier racine public, à utiliser wgetpour tout récupérer, puis à le rendre à nouveau privé, mais je ne sais pas s'il existe un moyen plus simple.

rugbert
la source
4
Comme beaucoup de gens l'ont dit ici, aws s3 syncc'est le meilleur. Mais personne ne fait une option puissante: dryrun. Cette option vous permet de voir ce qui serait téléchargé / téléchargé depuis / vers s3 lorsque vous utilisez sync. Ceci est vraiment utile lorsque vous ne voulez pas écraser le contenu dans votre compartiment local ou s3. Voici comment cela est utilisé: aws s3 sync <source> <destination> --dryrunje l'ai utilisé tout le temps avant de pousser le nouveau contenu dans un compartiment afin de ne pas télécharger les modifications indésirables.
Perimosh

Réponses:

1336

CLI AWS

Consultez la « Référence de commande AWS CLI » pour plus d'informations.

AWS a récemment publié ses outils de ligne de commande, qui fonctionnent un peu comme boto et peuvent être installés à l'aide de

sudo easy_install awscli

ou

sudo pip install awscli

Une fois installé, vous pouvez alors simplement exécuter:

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

Par exemple:

aws s3 sync s3://mybucket .

téléchargera tous les objets dans mybucketle répertoire courant.

Et affichera:

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

Cela téléchargera tous vos fichiers à l'aide d'une synchronisation unidirectionnelle. Il ne supprimera aucun fichier existant dans votre répertoire actuel sauf si vous le spécifiez , et il ne modifiera ni ne supprimera aucun fichier sur S3. --delete

Vous pouvez également effectuer une synchronisation de compartiment S3 à S3 ou une synchronisation locale à S3.

Consultez la documentation et d'autres exemples .

Alors que l'exemple ci-dessus montre comment télécharger un compartiment complet, vous pouvez également télécharger un dossier de manière récursive en effectuant

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

Cela demandera à la CLI de télécharger tous les fichiers et les clés de dossier de manière récursive dans le PATH/TO/FOLDERrépertoire du BUCKETNAMEcompartiment.

Layke
la source
223
Exécutez d'abord aws configureet ajoutez votre access keyet secret access keyqui peut être trouvé ici .
Erwin Rooijakkers
12
Allez ici pour l'installateur de fenêtres aws.amazon.com/cli . Il récupère l'ID de la clé d'accès dans la variable d'environnement "AWS_ACCESS_KEY_ID" et votre clé secrète dans "AWS_SECRET_ACCESS_KEY".
Matt Bond
7
J'ai essayé s3cmdet Cyberduck, mais pour moi, awsclic'était de loin le moyen le plus rapide de télécharger ~ 70 000 fichiers depuis mon compartiment.
Arjen
11
Veuillez noter que même si la question concerne uniquement le téléchargement, je pense que cette commande effectuera une synchronisation bidirectionnelle entre votre répertoire et S3. Si vous n'essayez pas de télécharger quoi que ce soit, assurez-vous que le répertoire actuel est vide.
Jesse Crossen
15
@JesseCrossen Cette aws s3 synccommande ne téléchargera rien, mais elle supprimera les fichiers localement s'ils n'existent pas sur S3. Consultez la documentation .
Flimm
168

Vous pouvez utiliser s3cmdpour télécharger votre bucket:

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

Il existe un autre outil que vous pouvez utiliser appelé rclone. Il s'agit d'un exemple de code dans la documentation Rclone:

rclone sync /home/local/directory remote:bucket
Phil M.
la source
5
C'est assez lent. Surtout si vous essayez de l'utiliser progressivement. Existe-t-il une solution multi-threadée pour saturer la bande passante?
Peter Lada
les solutions ci-dessous sont meilleures, plus standard et ouvertes à plus de plateformes
abc123
Cela ne fonctionne pas pour les compartiments du demandeur payeur (voir arxiv.org/help/bulk_data_s3 ) :-(
Martin Thoma
comment puis-je utiliser votre solution si je dois effectuer une correspondance de modèle pour le téléchargement? Ma question: stackoverflow.com/questions/25086722/…
Shrikant Kakani
84

J'ai utilisé plusieurs méthodes différentes pour copier des données Amazon S3 sur une machine locale, y compris s3cmd, et de loin la plus simple est Cyberduck .

Tout ce que vous devez faire est d'entrer vos informations d'identification Amazon et d'utiliser l'interface simple pour télécharger, télécharger, synchroniser l'un de vos compartiments, dossiers ou fichiers.

Capture d'écran

wedocando
la source
Fonctionne très bien! Disponible pour Windows et Mac (GPL).
craastad
Cyberduck facilite également le téléchargement anonyme de fichiers publics - s3cmd semble exiger des informations d'identification
chrishiestand
Fonctionne très bien avec Transmit aussi.
Undistraction
CLI me donnait une erreur lorsque j'essayais d'enregistrer mon seau, cela a parfaitement fonctionné!
Lazar Kukolj
Oh, cela est venu inattendu. J'ai utilisé cyberduck plus tôt pour FTP, mais je ne m'attendais pas à ce qu'il ait une connectivité S3. Merci pour un bon indice!
jskierbi
51

Vous disposez de nombreuses options pour ce faire, mais la meilleure consiste à utiliser l'AWS CLI.

Voici une présentation:

  1. Téléchargez et installez AWS CLI sur votre machine:

  2. Configurer l'AWS CLI:

    entrez la description de l'image ici

    Assurez-vous de saisir des clés d' accès et des clés secrètes valides , que vous avez reçues lors de la création du compte.

  3. Synchronisez le compartiment S3 en utilisant:

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

    Dans la commande ci-dessus, remplacez les champs suivants:

    • yourbucket >> votre bucket S3 que vous souhaitez télécharger.
    • /local/path >> chemin dans votre système local où vous souhaitez télécharger tous les fichiers.
Darshan Lila
la source
J'ai utilisé ceci au lieu de cyberduck, car cyberduck doit "préparer" les fichiers avant de commencer le téléchargement. Pour de grandes quantités de fichiers qui semblaient prendre du temps et je n'ai pas pu trouver d'informations sur ce que fait réellement la "préparation". CLI a commencé à télécharger instantanément
Tashows
assurez-vous d'avoir ce s3://préfixe dans le nom du compartiment !!! Avec aws s3 lsvous n'avez pas besoin de ce s3://préfixe mais vous avez besoin d'une cpcommande.
cjmling
43

Pour télécharger à l'aide de l'AWS S3 CLI:

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

Pour télécharger à l'aide de code, utilisez le kit SDK AWS.

Pour télécharger à l'aide de l'interface graphique, utilisez Cyberduck.

Sarat Chandra
la source
1
Comment ignorer certains fichiers ou dossiers?
Nabin
1
@Nabin, vous pouvez utiliser --include & --exclude avec un caractère générique pour exclure un fichier ou un dossier, comme ceci: aws s3 cp s3://my-bucket-name ./local-folder --recursive --include "*" --exclude "excludeFolder/*" --exclude "includeFolder/excludeFile.txt"
DarkCenobyte
21

Pour Windows, le navigateur S3 est le moyen le plus simple que j'ai trouvé. C'est un excellent logiciel et gratuit pour une utilisation non commerciale.

dworrad
la source
3
Je viens d'essayer l'option "Télécharger tous les fichiers sur ..." (qui, je présume, équivaut à "télécharger l'ensemble du s3" et il m'a dit que j'avais besoin de la version Pro.
Jack Ukleja
2
Mise à jour: Mais j'ai pu télécharger un dossier entier dans le seau qui était suffisant pour mes besoins ...
Jack Ukleja
oui, la version gratuite est assez limitée, vous pouvez tout sélectionner et télécharger, mais limitée à seulement 2 transferts simultanés
Hayden Thring
Je cherchais une version simple de Windows après avoir obtenu une erreur de support de python3 sur Ubuntu 17.1 et s3cmd, cela a bien fonctionné.
edencorbin
21

Si vous utilisez Visual Studio, téléchargez " AWS Toolkit for Visual Studio ".

Une fois installé, accédez à Visual Studio - AWS Explorer - S3 - Votre compartiment - Double-cliquez

Dans la fenêtre, vous pourrez sélectionner tous les fichiers. Faites un clic droit et téléchargez les fichiers.

Ives.me
la source
13

La réponse de @Layke est bonne, mais si vous avez une tonne de données et que vous ne voulez pas attendre indéfiniment, vous devriez lire " Configuration AWS CLI S3 ".

Les commandes suivantes indiquent à l'AWS CLI d'utiliser 1000 threads pour exécuter des travaux (chacun étant un petit fichier ou une partie d'une copie en plusieurs parties) et anticiper 100 000 travaux:

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

Après les avoir exécutés, vous pouvez utiliser la synccommande simple :

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

Sur un système avec CPU 4 cœurs et 16 Go de RAM, pour des cas comme le mien (fichiers de 3 à 50 Go), la vitesse de synchronisation / copie est passée d'environ 9,5 Mo / s à 700 + MiB / s, soit une augmentation de vitesse de 70x par rapport à la configuration par défaut.

James
la source
1
c'est la vraie réponse. vient de le tester, à partir d'ec2, il a transféré environ 2,3 Go / min. sans les options simultanées environ 1 Go / min. bouée de sauvetage.
Karsten
12

Utilisez cette commande avec l' AWS CLI :

aws s3 cp s3://bucketname . --recursive
ashack
la source
12

Une autre option qui pourrait aider certains utilisateurs d'OS X est la transmission.

C'est un programme FTP qui vous permet également de vous connecter à vos fichiers S3. Et, il a une option pour monter n'importe quel stockage FTP ou S3 en tant que dossier dans le Finder, mais ce n'est que pour une durée limitée.

Diederik
la source
9

J'ai fait un peu de développement pour S3 et je n'ai pas trouvé de moyen simple de télécharger un bucket entier.

Si vous souhaitez coder en Java, la bibliothèque jets3t est facile à utiliser pour créer une liste de compartiments et parcourir cette liste pour les télécharger.

Tout d'abord, obtenez un ensemble de clés privées publiques à partir de la console de gestion AWS afin de pouvoir créer un objet S3service:

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

Ensuite, obtenez un tableau de vos objets buckets:

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

Enfin, parcourez ce tableau pour télécharger les objets un par un avec:

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

J'ai mis le code de connexion dans un singleton threadsafe. La syntaxe try / catch nécessaire a été omise pour des raisons évidentes.

Si vous préférez coder en Python, vous pouvez utiliser Boto à la place.

Après avoir parcouru BucketExplorer, " Télécharger le compartiment entier " peut faire ce que vous voulez.

jeremyjjbrown
la source
Sauf si vous avez besoin d'une solution Java, utilisez la réponse aws cli ci-dessus.
jeremyjjbrown
créer un nouveau dossier et donc la même chose
Jisson
7

L'API AWS sdk ne sera la meilleure option que pour télécharger l'intégralité du dossier et du dépôt sur s3 et télécharger le seau entier de s3 localement.

Pour télécharger un dossier entier vers s3

aws s3 sync . s3://BucketName

pour télécharger le seau s3 entier localement

aws s3 sync s3://BucketName . 

vous pouvez également attribuer le chemin d'accès comme BucketName / Path pour un dossier particulier en s3 à télécharger

Harsh Manvar
la source
6

Vous pouvez le faire avec https://github.com/minio/mc :

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

mc prend également en charge les sessions, les téléchargements pouvant être repris, les téléchargements et bien d'autres. mcprend en charge les systèmes d'exploitation Linux, OS X et Windows. Écrit en Golang et publié sous Apache Version 2.0.

Krishna Srinivas
la source
5

Si vous utilisez Firefox avec S3Fox, cela vous permet de sélectionner tous les fichiers (shift-select en premier et en dernier) et de cliquer avec le bouton droit et de télécharger tout ... Je l'ai fait avec plus de 500 fichiers sans problème

jpw
la source
Cela ne fonctionne pas pour les sous-dossiers d'un compartiment, même si les "pseudo-dossiers" ont été créés dans la console AWS. (Au moment de la rédaction de ce commentaire)
Wesley
Confirmé ne fonctionne pas, j'ai environ 12k clés de niveau supérieur = sous-dossiers), S3Fox ne démarre même pas. Insistez également sur l'autorisation de répertorier tous les seaux!
Peter Lada
3

Si vous n'y avez que des fichiers (pas de sous-répertoires), une solution rapide consiste à sélectionner tous les fichiers ( clickle premier, Shift+clickle dernier) et appuyez sur Enterou right clicket sélectionnez Open. Pour la plupart des fichiers de données, cela les téléchargera directement sur votre ordinateur.

Lukasz Czerwinski
la source
3

Pour ajouter une autre option d'interface graphique, nous utilisons la fonctionnalité S3 de WinSCP . Il est très facile de se connecter, ne nécessitant que votre clé d'accès et votre clé secrète dans l'interface utilisateur. Vous pouvez ensuite parcourir et télécharger tous les fichiers dont vous avez besoin à partir de tous les compartiments accessibles, y compris les téléchargements récursifs de dossiers imbriqués.

Puisqu'il peut être difficile d'effacer de nouveaux logiciels grâce à la sécurité et que WinSCP est assez répandu, il peut être vraiment bénéfique de simplement l'utiliser plutôt que d'essayer d'installer un utilitaire plus spécialisé.

bsplosion
la source
1
  1. L'utilisateur Windows doit télécharger S3EXPLORER à partir de ce lien qui contient également des instructions d'installation: - http://s3browser.com/download.aspx

  2. Ensuite, fournissez des informations d'identification AWS telles que clé secrète, clé d'accès et région à s3explorer, ce lien contient des instructions de configuration pour s3explorer: Copier Coller le lien dans le navigateur: s3browser.com/s3browser-first-run.aspx

  3. Maintenant, tous vos seaux s3 seraient visibles sur le panneau gauche de s3explorer.

  4. Sélectionnez simplement le compartiment, puis cliquez sur le menu Seaux dans le coin supérieur gauche, puis sélectionnez Télécharger tous les fichiers dans le menu. Ci-dessous, la capture d'écran pour le même:

Écran de sélection du compartiment

  1. Parcourez ensuite un dossier pour télécharger le compartiment à un endroit particulier

  2. Cliquez sur OK et votre téléchargement commencera.

Patrick R
la source
1

aws sync est la solution parfaite. Il ne fait pas deux sens. C'est un sens de la source à la destination. De plus, si vous avez beaucoup d'articles dans le bucket, ce sera une bonne idée de créer d'abord le point de terminaison s3 afin que le téléchargement se fasse plus rapidement (car le téléchargement ne se fait pas via Internet mais via intranet) et sans frais

Deepak Singhal
la source
1

Voici quelques trucs pour télécharger tous les compartiments, les lister, lister leur contenu.

    //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éthodes d'extension ------------------- ------------------ /

//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
la source
1

Vous pouvez simplement l'obtenir avec la commande s3cmd :

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

Comme Neel Bhaat l'a expliqué dans ce blog , il existe de nombreux outils différents qui peuvent être utilisés à cette fin. Certains sont fournis par AWS, la plupart étant des outils tiers. Tous ces outils vous obligent à enregistrer votre clé de compte AWS et votre secret dans l'outil lui-même. Soyez très prudent lorsque vous utilisez des outils tiers, car les informations d'identification que vous enregistrez peuvent vous coûter la totalité de votre valeur et vous faire perdre la vie.

Par conséquent, je recommande toujours d'utiliser l' AWS CLI à cet effet. Vous pouvez simplement l'installer à partir de ce lien . Ensuite, exécutez la commande suivante et enregistrez vos clés et valeurs secrètes dans AWS CLI.

aws configure

Et utilisez la commande suivante pour synchroniser votre compartiment AWS S3 avec votre machine locale. (La machine locale doit avoir installé AWS CLI)

aws s3 sync <source> <destination>

Exemples:

1) Pour AWS S3 vers le stockage local

aws s3 sync <S3Uri> <LocalPath>

2) Du stockage local à AWS S3

aws s3 sync <LocalPath> <S3Uri>

3) Du compartiment AWS s3 à un autre compartiment

aws s3 sync <S3Uri> <S3Uri> 
Keet Sugathadasa
la source
Par exemple 3, puis-je pointer vers un dossier Bucket vers un autre dossier Bucket? En fait, je souhaite synchroniser un dossier de compartiment avec un autre dossier de compartiment.
lukai
@lukai oui. C'est ce que j'ai donné dans l'exemple 3. Vous devez simplement avoir les URI du s3 seau de la source et de la destination
Keet Sugathadasa
1

Si vous souhaitez uniquement télécharger le compartiment à partir d'AWS, installez d'abord l'AWS CLI sur votre machine. Dans le terminal, changez le répertoire où vous souhaitez télécharger les fichiers et exécutez cette commande.

aws s3 sync s3://bucket-name .

Si vous souhaitez également synchroniser les répertoires local et s3 (au cas où vous auriez ajouté des fichiers dans le dossier local), exécutez cette commande:

aws s3 sync . s3://bucket-name
Muzammil
la source
1

L'AWS CLI est la meilleure option pour télécharger un compartiment S3 entier localement.

  1. Installez l' AWS CLI.

  2. Configurez l' AWS CLI pour utiliser les informations d'identification de sécurité par défaut et la région AWS par défaut.

  3. Pour télécharger la totalité de la commande d'utilisation du compartiment S3

    aws s3 sync s3: // yourbucketname localpath

Référence pour utiliser AWS cli pour différents services AWS: https://docs.aws.amazon.com/cli/latest/reference/

chanth30
la source
1

Vous pouvez utiliser cette commande AWS cli pour télécharger l'intégralité du contenu du compartiment S3 dans le dossier local

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

Si vous voyez une erreur comme celle-ci

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

--no-verify-ssl (booléen)

Par défaut, l'AWS CLI utilise SSL lors de la communication avec les services AWS. Pour chaque connexion SSL, l'AWS CLI vérifiera les certificats SSL. Cette option remplace le comportement par défaut de vérification des certificats SSL. référence

Utilisez cette balise avec la commande --no-verify-ssl

aws s3 sync s3://your-bucket-name "Local Folder Path" --no-verify-ssl
Dimuthu
la source
L'utilisation de la s3 syncest déjà couverte plusieurs fois ci-dessus. + Proposer un usage --no-verify-sslsans expliquer ses conséquences sur la sécurité est un délit.
Martin Prikryl
Merci pour les informations sur la sécurité. J'ai rencontré ce problème et l'ai résolu en utilisant cette référence docs.aws.amazon.com/cli/latest/reference
Dimuthu
1

Si le bucket est assez gros, une commande appelée s4cmdqui établit des connexions parallèles et améliore le temps de téléchargement:

Pour l'installer sur Debian comme

apt install s4cmd

Si vous avez pip:

pip install s4cmd

Il lira le ~/.s3cfgfichier s'il est présent (s'il n'est pas installé s3cmdet exécuté s3cmd --configure) ou vous pouvez le spécifier --access-key=ACCESS_KEY --secret-key=SECRET_KEYsur la commande.

Le cli est similaire à s3cmd. Dans votre cas, un syncest recommandé car vous pouvez annuler le téléchargement et le redémarrer sans avoir à retélécharger les fichiers.

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

Soyez prudent si vous téléchargez beaucoup de données (> 1 To) cela peut avoir un impact sur votre facture, calculez d'abord quel sera le coût

Bartomeu
la source
0

Comme l'a dit @layke, il est préférable de télécharger le fichier à partir du cli S3, il est sûr et sécurisé. Mais dans certains cas, les gens doivent utiliser wget pour télécharger le fichier et voici la solution

aws s3 presign s3://<your_bucket_name/>

Cette présélection vous obtiendra une URL publique temporaire que vous pouvez utiliser pour télécharger du contenu à partir de S3 en utilisant presign_url, dans votre cas en utilisant wget ou tout autre client de téléchargement.

Balaji JB
la source
0

Essayez cette commande:

aws s3 sync yourBucketnameDirectory yourLocalDirectory

Par exemple, si le nom de votre compartiment est myBucketet que le répertoire local l'est c:\local, alors:

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

Pour plus d'informations sur awscli, vérifiez cette installation de aws cli

PKP
la source