Пакетная загрузка файлов в AWS S3 с использованием заранее заданных URL

Введение

В этой статье объясняется, как загружать несколько файлов в AWS S3 партиями, используя предварительно подписанные URL-адреса.

В конце этой статьи вы сможете сделать следующее

  • Создавать партии из списка файлов
  • Загрузить в AWS S3 с помощью предварительно подписанных URL-адресов
  • Реализация параллелизма для загрузок.
  • Отображение индикатора выполнения ваших загрузок с помощью tqdm

Что такое предварительно подписанный URL?

Из документов Amazon: «Предварительно подписанный URL-адрес дает вам доступ к объекту, указанному в URL-адресе, при условии, что создатель предварительно подписанного URL-адреса имеет разрешения на доступ к этому объекту. То есть, если вы получили заранее подписанный URL-адрес для загрузки объекта, вы можете загрузить объект только в том случае, если создатель предварительно подписанного URL-адреса имеет необходимые разрешения для загрузки этого объекта ».

Почему предварительно подписанные URL-адреса?

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

Поскольку предварительно подписанные URL-адреса недолговечны, этот подход безопасен и является наиболее рекомендуемым подходом AWS для передачи файлов.

Создание предварительно подписанных URL-адресов

В этой статье не рассматривается создание предварительно подписанных URL-адресов, поскольку это отдельная статья. Чтобы узнать, как сгенерировать предварительно подписанные URL-адреса, перейдите здесь.

Создать пакеты загрузки

Первым шагом в загрузке файлов в S3 является создание пакетов файлов для загрузки. Следовательно, нам нужно получить исходный путь к файлам. Кроме того, нам нужно знать количество файлов, которые нужно загрузить. Почему? Потому что мы используем предварительно подписанные URL-адреса для загрузки, и для каждого файла требуется собственный URL-адрес для загрузки. Если нужно загрузить 1000 файлов, нам понадобится 1000 предварительно подписанных URL-адресов.

Чтобы узнать о различных способах разделения списка на более мелкие подсписки, ознакомьтесь с этой статьей.

Сгенерируйте предварительно подписанные URL-адреса для файлов в пакетах:

Теперь, когда мы создали наши пакеты, следующим шагом будет создание предварительно подписанного URL-адреса. Мы предполагаем, что служба генерации предварительно подписанных URL-адресов запущена и работает, и URL-адрес у нас есть. Для простоты я просто генерирую предварительно подписанные URL-адреса для одного списка файлов.

Итак, в приведенном выше коде мы запрашиваем предварительно подписанные URL-адреса для всех наших файлов, которые будут загружены в виде списка в API. Предварительно подписанные URL-адреса будут основаны на имени, которое мы предоставляем API.

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

Теперь, когда у нас есть предварительно подписанные URL-адреса, мы загрузим их в корзину s3.

Подготовка загрузки

Итак, теперь, когда мы подготовили все наши файлы для загрузки, остается только задача отправки файлов с использованием предварительно подписанных URL-адресов.

Загрузка на S3 с использованием предварительно подписанного URL-адреса

def post_to_s3(self, endpoint, file_name, data, files):


    # POST to S3 presigned url
    http_response = requests.post(endpoint, data=data, files=files)
    if http_response.status_code in [204, 201]:
       print(f" Upload success for : {file_name}")

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

использованная литература

Https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html

Первоначально опубликовано на https://dock2learn.com 8 сентября 2021 г.