Загрузка всего ведра S3?

705

Я заметил, что, похоже, нет возможности загрузить всю корзину S3 из Консоли управления AWS.

Есть ли простой способ взять все в одно из моих ведер? Я думал о том, чтобы сделать корневую папку общедоступной, использовать ее wgetдля захвата всего, а затем снова сделать ее приватной, но я не знаю, есть ли более простой способ.

rugbert
источник
4
Как многие люди здесь сказали, aws s3 syncэто лучшее. Но никто не указал на мощный вариант dryrun. Эта опция позволяет вам увидеть, что будет загружено / загружено с / на s3, когда вы используете sync. Это действительно полезно, когда вы не хотите перезаписывать контент ни в вашем локальном хранилище, ни в сегменте s3. Вот как это используется: aws s3 sync <source> <destination> --dryrunя использовал его все время, прежде чем помещать новый контент в корзину, чтобы не загружать нежелательные изменения.
Перимош

Ответы:

1336

AWS CLI

См. « Справочник по командам CLI AWS » для получения дополнительной информации.

AWS недавно выпустила свои инструменты командной строки, которые работают так же, как boto, и могут быть установлены с помощью

sudo easy_install awscli

или

sudo pip install awscli

После установки вы можете просто запустить:

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

Например:

aws s3 sync s3://mybucket .

загрузит все объекты в mybucketтекущий каталог.

И будет выводить:

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

Это загрузит все ваши файлы, используя одностороннюю синхронизацию. Он не будет удалять любые существующие файлы в вашем текущем каталоге, если вы не укажете , и не будет изменять или удалять любые файлы на S3. --delete

Вы также можете выполнить S3 Bucket для S3 Bucket или локально для S3 Bucket Sync.

Ознакомьтесь с документацией и другими примерами .

В то время как приведенный выше пример показывает, как загрузить полный пакет, вы также можете рекурсивно загрузить папку, выполнив

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

Это даст CLI команду рекурсивно загружать все файлы и ключи папок в PATH/TO/FOLDERкаталоге внутри BUCKETNAMEкорзины.

Layke
источник
223
Сначала запустите aws configureи добавьте свой access keyи secret access keyкоторый можно найти здесь .
Эрвин Ройяккерс
12
Зайдите сюда для установщика Windows aws.amazon.com/cli . Он получает идентификатор ключа доступа из переменной среды "AWS_ACCESS_KEY_ID" и ваш секретный ключ из "AWS_SECRET_ACCESS_KEY".
Мэтт Бонд
7
Я пробовал s3cmdи Cyberduck, но для меня это awscliбыл самый быстрый способ загрузить ~ 70 000 файлов из моего ведра.
Арьен
11
Обратите внимание, что хотя вопрос задан только о загрузке, я считаю, что эта команда выполнит двустороннюю синхронизацию между вашим каталогом и S3. Если вы не пытаетесь загрузить что-либо, убедитесь, что текущий каталог пуст.
Джесси Кроссен
15
@JesseCrossen Эта aws s3 syncкоманда ничего не загружает, но удаляет файлы локально, если их нет на S3. Смотрите документацию .
Flimm
168

Вы можете использовать s3cmdдля загрузки вашего ведра:

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

Существует еще один инструмент, который вы можете использовать, называется rclone. Это пример кода в документации по Rclone:

rclone sync /home/local/directory remote:bucket
Фил М.
источник
5
Это довольно медленно. Особенно, если вы пытаетесь использовать его постепенно. Есть ли решение, которое является многопоточным, чтобы оно могло насытить пропускную способность?
Питер Лада
нижеприведенные решения лучше, более стандартны и открыты для большего количества платформ
abc123
Это не работает для тех, кто запрашивает оплату (см. Arxiv.org/help/bulk_data_s3 ) :-(
Martin Thoma
как я могу использовать ваше решение, если мне нужно выполнить сопоставление с образцом для загрузки? Мой вопрос: stackoverflow.com/questions/25086722/…
Шрикант Какани
84

Я использовал несколько различных методов для копирования данных Amazon S3 на локальный компьютер, в том числе s3cmd, и на сегодняшний день самым простым является Cyberduck .

Все, что вам нужно сделать, это ввести свои учетные данные Amazon и использовать простой интерфейс для загрузки, загрузки, синхронизации любых ваших корзин, папок или файлов.

Скриншот

wedocando
источник
Работает отлично! Доступно для Windows и Mac (GPL).
Craastad
Cyberduck также позволяет легко загружать публичные файлы анонимно - s3cmd, похоже, требует учетных данных
chrishiestand
Отлично работает и с Transmit.
Undistraction
CLI давал мне ошибку, когда я пытался спасти свое ведро, это работало отлично!
Лазарь Куколь
О, это случилось неожиданно. Ранее я использовал Cyberduck для FTP, но никогда не ожидал, что у него будет S3-соединение. Спасибо за отличный совет!
Jskierbi
51

У вас есть много вариантов сделать это, но лучший из них - использовать интерфейс командной строки AWS.

Вот прохождение:

  1. Загрузите и установите AWS CLI на своем компьютере:

  2. Настройте интерфейс командной строки AWS:

    введите описание изображения здесь

    Убедитесь, что вы ввели действительный доступ и секретные ключи, которые вы получили при создании учетной записи.

  3. Синхронизируйте ведро S3, используя:

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

    В приведенной выше команде замените следующие поля:

    • yourbucket >> Ваше ведро S3, которое вы хотите скачать.
    • /local/path >> Путь в вашей локальной системе, куда вы хотите скачать все файлы.
Даршан Лила
источник
Я использовал это вместо cyberduck, потому что cyberduck должен «подготовить» файлы, прежде чем он начнет загружаться. Для большого количества файлов, которые, казалось, заняли много времени, и я не мог найти информацию о том, что на самом деле делает «подготовка». CLI начал загружаться мгновенно
Tashows
убедитесь, что у вас есть этот s3://префикс в имени корзины !!! С этим aws s3 lsвам не нужен этот s3://префикс, но вам нужно для cpкоманды.
cjmling
43

Чтобы загрузить с помощью AWS S3 CLI:

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

Для загрузки с использованием кода используйте AWS SDK.

Для загрузки с использованием графического интерфейса используйте Cyberduck.

Сарат Чандра
источник
1
Как игнорировать некоторые файлы или папки?
Набин
1
@Nabin, вы можете использовать --include & --exclude с подстановочным знаком, чтобы исключить какой-либо файл или папку, например так: aws s3 cp s3://my-bucket-name ./local-folder --recursive --include "*" --exclude "excludeFolder/*" --exclude "includeFolder/excludeFile.txt"
DarkCenobyte
21

Для Windows S3 Browser - самый простой способ, который я нашел. Это отличное программное обеспечение, и это бесплатно для некоммерческого использования.

dworrad
источник
3
Я только что попробовал опцию «Загрузить все файлы в ...» (которая, как я полагаю, эквивалентна «загрузить всю
корзину S3
2
Обновление: Но я смог загрузить целую папку внутри
корзины,
да, бесплатная версия довольно ограничена, вы можете выбрать все и загрузить, но ограничены только 2 одновременными передачами
Hayden Thring
Искал простую версию для Windows после получения ошибки поддержки Python3 в Ubuntu 17.1 и s3cmd, это работало хорошо.
edencorbin
21

Если вы используете Visual Studio, загрузите « AWS Toolkit for Visual Studio ».

После установки перейдите в Visual Studio - AWS Explorer - S3 - Ваша корзина - Двойной щелчок

В окне вы сможете выбрать все файлы. Щелкните правой кнопкой мыши и загрузите файлы.

Ives.me
источник
13

Ответ @Layke хорош, но если у вас есть тонна данных и вы не хотите ждать вечно, прочитайте « Конфигурация AWS CLI S3 ».

Следующие команды сообщат CLI AWS использовать 1000 потоков для выполнения заданий (каждый небольшой файл или одна часть многокомпонентной копии) и просмотреть 100 000 заданий:

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

После запуска вы можете использовать простую syncкоманду:

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

или

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

В системе с процессором 4 ядра и 16 ГБ ОЗУ, для таких случаев, как у меня (файлы 3-50 ГБ), скорость синхронизации / копирования была увеличена с 9,5 МБ / с до 700 + МБ / с, что в 70 раз больше, чем в конфигурации по умолчанию.

Джеймс
источник
1
это настоящий ответ. только что проверил, из ec2 он передал около 2.3GB / мин. без одновременных опций около 1Гб / мин. спасатель.
Карстен
12

Используйте эту команду с CLI AWS :

aws s3 cp s3://bucketname . --recursive
ashack
источник
12

Другой вариант, который может помочь некоторым пользователям OS X, - Transmit.

Это программа FTP, которая также позволяет вам подключаться к файлам S3. И он имеет возможность монтировать любое хранилище FTP или S3 как папку в Finder, но это только на ограниченное время.

Diederik
источник
9

Я немного поработал над S3 и не нашел простого способа загрузить целое ведро.

Если вы хотите кодировать на Java, библиотеку jets3t легко использовать для создания списка сегментов и перебора этого списка для их загрузки.

Во-первых, получите открытый закрытый ключ из потока управления AWS, чтобы вы могли создать объект S3service:

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

Затем получите массив ваших объектов buckets:

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

Наконец, итерация по этому массиву для загрузки объектов по одному с:

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

Я поместил код подключения в однозаходный безопасный поток. Необходимый синтаксис try / catch был опущен по понятным причинам.

Если вы предпочитаете писать код на Python, вы можете использовать Boto.

Посмотрев вокруг BucketExplorer, « Загрузка всей корзины » может сделать то, что вы хотите.

jeremyjjbrown
источник
Если вам не нужно Java-решение, используйте ответ aws cli выше.
jeremyjjbrown
создать новую папку и так же
Jisson
7

AWS SDK API будет только лучшим вариантом для загрузки всей папки и репозитория на s3 и загрузки всей корзины s3 локально.

Для загрузки всей папки в s3

aws s3 sync . s3://BucketName

для загрузки всего ведра s3 локально

aws s3 sync s3://BucketName . 

Вы также можете назначить путь Как и BucketName / Path для конкретной папки в s3 для загрузки

Суровый Манвар
источник
6

Вы можете сделать это с помощью https://github.com/minio/mc :

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

mc также поддерживает сессии, возобновляемые загрузки, загрузки и многое другое. mcподдерживает операционные системы Linux, OS X и Windows. Написан на Golang и выпущен под Apache версии 2.0.

Кришна Шринивас
источник
5

Если вы используете Firefox с S3Fox, это позволяет вам выбрать все файлы (shift-select first и last), щелкнуть правой кнопкой мыши и загрузить все ... Я сделал это с 500+ файлами без проблемы

JPW
источник
Это не работает для подпапок внутри корзины, даже если «псевдопапки» были созданы в консоли AWS. (На момент написания этого комментария)
Уэсли
Подтверждено, что не работает, у меня около 12 тыс. Ключей верхнего уровня = подпапки), S3Fox даже не запускается. Также настаивайте на разрешении перечислить все ведра!
Питер Лада
3

Если у вас есть только файлы (без подкаталогов), быстрое решение состоит в том, чтобы выбрать все файлы ( clickв первом, Shift+clickпоследнем) и нажать Enterили right clickи выбрать Open. Для большинства файлов данных они будут загружены прямо на ваш компьютер.

Лукаш Червинский
источник
3

Чтобы добавить еще один вариант графического интерфейса, мы используем функциональность WinSCP S3 . Это очень легко подключить, требуя только ваш ключ доступа и секретный ключ в пользовательском интерфейсе. Затем вы можете просматривать и загружать любые файлы, которые вам нужны, из любых доступных блоков, включая рекурсивные загрузки вложенных папок.

Поскольку очистка нового программного обеспечения с помощью безопасности может быть сложной задачей, а WinSCP довольно распространен, может быть действительно полезно просто использовать его, а не пытаться установить более специализированную утилиту.

bsplosion
источник
1
  1. Пользователю Windows необходимо загрузить S3EXPLORER по этой ссылке, которая также содержит инструкции по установке: - http://s3browser.com/download.aspx

  2. Затем предоставьте свои учетные данные AWS, такие как secretkey, accesskey и region, для s3explorer, эта ссылка содержит инструкцию по настройке для s3explorer: Скопируйте Вставьте ссылку в браузере: s3browser.com/s3browser-first-run.aspx

  3. Теперь все ваши сегменты s3 будут видны на левой панели s3explorer.

  4. Просто выберите контейнер и нажмите меню «Ведра» в верхнем левом углу, затем выберите «Загрузить все файлы в опцию» из меню. Ниже скриншот для того же:

Экран выбора ковша

  1. Затем просмотрите папку, чтобы загрузить корзину в определенном месте.

  2. Нажмите OK, и загрузка начнется.

Патрик Р
источник
1

AWS Sync является идеальным решением. Это не делает два пути .. это один путь от источника до места назначения. Кроме того, если у вас много элементов в корзине, было бы неплохо сначала создать конечную точку s3, чтобы загрузка происходила быстрее (поскольку загрузка происходит не через Интернет, а через интранет), и никаких сборов

Дипак Сингхал
источник
1

Вот некоторые вещи, чтобы загрузить все ведра, перечислить их, перечислить их содержимое.

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

/ ---------------------------- Методы расширения ------------------- ------------------ /

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

Вы можете просто получить его с помощью команды s3cmd :

s3cmd get --recursive --continue s3://test-bucket local-directory/
Hubbitus
источник
1

Как объяснил Нил Баат в этом блоге , для этой цели можно использовать много разных инструментов. Некоторые из них предоставляются AWS, а большинство - сторонними инструментами. Все эти инструменты требуют сохранения ключа учетной записи AWS и секрета в самом инструменте. Будьте очень осторожны при использовании сторонних инструментов, поскольку учетные данные, которые вы сохраняете, могут стоить вам, всей вашей ценности и привести к смерти.

Поэтому я всегда рекомендую использовать для этой цели интерфейс командной строки AWS . Вы можете просто установить это по этой ссылке . Затем выполните следующую команду и сохраните ключ, секретные значения в CLI AWS.

aws configure

И используйте следующую команду для синхронизации вашего AWS S3 Bucket с вашим локальным компьютером. (На локальном компьютере должен быть установлен AWS CLI)

aws s3 sync <source> <destination>

Примеры:

1) Для AWS S3 в локальном хранилище

aws s3 sync <S3Uri> <LocalPath>

2) Из локального хранилища в AWS S3

aws s3 sync <LocalPath> <S3Uri>

3) Из ведра AWS s3 в другое ведро

aws s3 sync <S3Uri> <S3Uri> 
Кит Сугатхадаса
источник
Например, 3, можно ли указать папку Bucket на другую папку Bucket? На самом деле, я хочу синхронизировать папку с другой папкой.
Лукай
@ Лукай да. Это то, что я
привел
1

Если вы хотите только загрузить корзину из AWS, сначала установите CLI AWS на свой компьютер. В терминале измените каталог, куда вы хотите скачать файлы и выполните эту команду.

aws s3 sync s3://bucket-name .

Если вы также хотите синхронизировать оба локальных каталога и каталоги s3 (если вы добавили некоторые файлы в локальную папку), выполните эту команду:

aws s3 sync . s3://bucket-name
Muzammil
источник
1

AWS CLI - лучший вариант для загрузки всей корзины S3 локально.

  1. Установите AWS CLI.

  2. Настройте интерфейс командной строки AWS для использования учетных данных безопасности по умолчанию и региона AWS по умолчанию.

  3. Чтобы загрузить всю корзину S3, используйте команду

    aws s3 sync s3: // yourbucketname localpath

Ссылка на использование AWS cli для различных сервисов AWS: https://docs.aws.amazon.com/cli/latest/reference/

singh30
источник
1

Вы можете использовать эту команду AWS cli для загрузки всего содержимого сегмента S3 в локальную папку.

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

Если вы видите ошибку, как это

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

--no-verify-ssl (логическое)

По умолчанию интерфейс командной строки AWS использует SSL при взаимодействии со службами AWS. Для каждого SSL-соединения AWS CLI будет проверять SSL-сертификаты. Этот параметр переопределяет поведение по умолчанию при проверке сертификатов SSL. ссылка

Используйте этот тег с командой --no-verify-ssl

aws s3 sync s3://your-bucket-name "Local Folder Path" --no-verify-ssl
Dimuthu
источник
Использование s3 syncописано выше уже несколько раз. + Предлагать использование --no-verify-sslбез объяснения его последствий для безопасности является преступлением.
Мартин Прикрыл
Спасибо за информацию о безопасности. Я столкнулся с этой проблемой и решил ее, используя эту ссылку docs.aws.amazon.com/cli/latest/reference
Dimuthu
1

Если область достаточно велика, существует команда, s4cmdкоторая выполняет параллельные соединения и сокращает время загрузки:

Чтобы установить его на Debian, как

apt install s4cmd

Если у вас есть пункт:

pip install s4cmd

Он будет читать ~/.s3cfgфайл, если он есть (если он не установлен s3cmdи не запускается s3cmd --configure), или вы можете указать --access-key=ACCESS_KEY --secret-key=SECRET_KEYв команде.

Cli похож на s3cmd. В вашем случае syncрекомендуется использовать a, так как вы можете отменить загрузку и начать ее заново без необходимости повторной загрузки файлов.

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

Будьте внимательны, если вы загружаете много данных (> 1 ТБ), это может повлиять на ваш счет, сначала рассчитайте, какой будет стоимость.

Bartomeu
источник
0

Как сказал @layke, лучше всего скачать файл с S3 cli, это безопасно и надежно. Но в некоторых случаях люди должны использовать wget для загрузки файла, и вот решение

aws s3 presign s3://<your_bucket_name/>

Это приведет к тому, что вы получите временный общедоступный URL-адрес, который вы можете использовать для загрузки контента с S3 с помощью presign_url, в вашем случае - с помощью wget или любого другого загрузочного клиента.

Balaji JB
источник
0

Попробуйте эту команду:

aws s3 sync yourBucketnameDirectory yourLocalDirectory

Например, если ваше имя группы myBucketи локальный каталог c:\local, то:

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

Для получения дополнительной информации о awscli проверьте эту установку aws cli

PKP
источник