Skip to content

Утилита командной строки скачивающая содержимое S3 бакета по ключу или префиксу

License

Notifications You must be signed in to change notification settings

mementomorri/solid-bucket

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

solid-bucket

Утилита командной строки скачивающая содержимое S3 бакета по ключу или префиксу

Тех. задание

Написать утилиту на Python, которая скачивает файлы с S3 из указанного бакета по ключу или префиксу. Для локального тестирования можно использовать MinIO или SeaweedFS - который можно поднять в docker контейнере.
Для авторизации в S3 используем aws access key (AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY).
Предполагается, что размер каждого файла в бакете не больше 5 мегабайт.
Оринтировочное кол-во файлов 10000.

Желательно:

  • оформить решение в виде pypi модуля (для разработки удобно использовать pip install -e .);
  • модуль оформить и использованием pyproject.toml (использовать poetry на свое усмотрение);
  • использовать модуль typing для аннотации типов.

Подсказки:

  1. Как мог бы выглядеть запуск утилиты
python s3download.py --bucket ... --prefix ... --config ...
python s3download.py --bucket ... --key ... --cpus ...
python s3download.py --bucket ... --key ... --coroutines ...
  1. Ожидается использование одно из модулей (или комбинации модулей): multiprocessing, threading, asyncio.
  2. Ожидается использование механизмов синхронизации из multiprocessing, threading, asyncio.

Реализация

В результате выполнения задания была реализована утилита solid-bucket, перечень зависимостей указан в pyproject.toml, код откомментирован и по возможности типизирован, в публикация на pypi пока в состоянии pending, далее описывается инструкция к использованию.

Примеры использования

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

$ python solid-bucket data-test --cpus 6 --prefix test --config aws/credentials.json
Загрузка в download/...
Загружено 10002 файла.
Время параллельной загрузки файлов 8.1 сек.

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

$ python solid-bucket data-test --coroutines --prefix test --config aws/credentials.json
Загрузка в download/...
Загрузка завершена!
Время асинхронной загрузки файлов 23.44 сек.

Пример использования с ключем:

$ python solid-bucket data-test --coroutines --key test/dummy.bin --config aws/credentials.json
Загрузка в download/...
Загрузка завершена!
Время асинхронной загрузки файлов 0.13 сек.

Утилита обрабатывет опцию --help и выводит описание работы утилиты:

$ python solid-bucket --help
Usage: solid-bucket [OPTIONS] BUCKET

  Утилита загрузки файлов с хранилища объектов AWS S3

Options:
  --help                 Показать это сообщение и завершить работу
  --version              Показать версию утилиты и завершить работу
  -p, --prefix TEXT      Префикс объекта для скачивания
  -k, --key TEXT         Ключ объекта для скачивания
  -cp, --cpus INTEGER    Число процессов используемых в параллельной загрузке
  -cr, --coroutines      Асинхронный способ загрузки
  -ld, --localdir TEXT   Путь к папке для загрузки
  -cf, --config TEXT     Путь к файлу конфигурации
  -ak, --accesskey TEXT  Указать Access Key в ручную
  -sk, --secretkey TEXT  Указать Secret Key в ручную
  -e, --endpoint TEXT    Указать конечную точку в ручную
  -t, --test             Выгрузить тестовые файлы в хранилище

Принцип работы

  1. Для использования утилиты нужно передать название бакета в виде аргумента утилиты и файла конфигурации с опцией --config, опция принимает на вход путь к файлу конфигурации.
    Утилита считывает файл конфигурации по примеру сгенерированного в MinIO:
{
"url":"http://192.168.1.110:9000",
"accessKey":"R17Y8MQjceNsR1CyMqit",
"secretKey":"r6tWwCtQFvBFULGfLRYLEwQfGA0jDkcMDQcphZvU",
"api":"s3v4",
"path":"auto"
}

Либо можно указать каждый параметр по отдельности c опциями:

  • --accesskey чтобы указать Access Key в ручную;
  • --secretkey чтобы указать Secret Key в ручную;
  • --endpoint чтобы указать конечную точку подключения в ручную.
  1. Затем нужно передать способ загрузки, либо параллельно с опцией --cpus передав количество допустимых процессов и передать префикс с опцией --prefix, либо с помощью корутин с флагом --coroutines и затем передать префикс с опцией --prefix или ключ с опцией --key соответственно.
  2. Опциноально можно передать путь к папке для загрузки файлов с опцией --localdir, по умолчанию утилита будет сохранять файлы в папку download/.

Далее утилита сама сообщит о завершении работы как это было показано в разделе с примерами использования.

Тестирование

Протестировать работу утилиты можно с помощью флага --test, утилита создаст в хранилще файлов бакет test, затем будет происходить загрузка тестовых файлов по принципу описанному в разделе с принципом работы. Пример запуска утилиты с тестовыми данными:

$ python solid-bucket test --test --coroutines --prefix test --config aws/credentials.json
Создание тестовых файлов в хранилище
Создание тестовый файлов в бакет test, по префиксу test, завершено
Загрузка в download/...
Загрузка завершена!
Время асинхронной загрузки файлов 22.78 сек.

Загруженные файлы будут расположены в папке download.

About

Утилита командной строки скачивающая содержимое S3 бакета по ключу или префиксу

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages