Утилита командной строки скачивающая содержимое 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 для аннотации типов.
Подсказки:
- Как мог бы выглядеть запуск утилиты
python s3download.py --bucket ... --prefix ... --config ...
python s3download.py --bucket ... --key ... --cpus ...
python s3download.py --bucket ... --key ... --coroutines ...
- Ожидается использование одно из модулей (или комбинации модулей):
multiprocessing
,threading
,asyncio
. - Ожидается использование механизмов синхронизации из
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 Выгрузить тестовые файлы в хранилище
- Для использования утилиты нужно передать название бакета в виде аргумента утилиты и файла конфигурации с опцией
--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
чтобы указать конечную точку подключения в ручную.
- Затем нужно передать способ загрузки, либо параллельно с опцией
--cpus
передав количество допустимых процессов и передать префикс с опцией--prefix
, либо с помощью корутин с флагом--coroutines
и затем передать префикс с опцией--prefix
или ключ с опцией--key
соответственно. - Опциноально можно передать путь к папке для загрузки файлов с опцией
--localdir
, по умолчанию утилита будет сохранять файлы в папкуdownload/
.
Далее утилита сама сообщит о завершении работы как это было показано в разделе с примерами использования.
Протестировать работу утилиты можно с помощью флага --test
, утилита создаст в хранилще файлов бакет test,
затем будет происходить загрузка тестовых файлов по принципу описанному в разделе с принципом работы.
Пример запуска утилиты с тестовыми данными:
$ python solid-bucket test --test --coroutines --prefix test --config aws/credentials.json
Создание тестовых файлов в хранилище
Создание тестовый файлов в бакет test, по префиксу test, завершено
Загрузка в download/...
Загрузка завершена!
Время асинхронной загрузки файлов 22.78 сек.
Загруженные файлы будут расположены в папке download
.