Перейти к основному содержимому

Об объектах

Объекты — это пользовательские данные, которые хранятся в бакетах. Каждый объект содержит данные произвольного формата в том виде, в котором они были загружены.

Основная информация

Идентификатор объекта — строковый ключ, который уникально определяет объект в пределах бакета.

Что хранится вместе с объектом:

  • Пользовательские данные;
  • Системные метаданные;
  • Пользовательские метаданные.

S3 позволяет выбирать класс хранилища для объектов в зависимости от требований к длительности хранения и частоте операций.

Операции с объектами

S3 поддерживает следующие базовые операции:

  • Загрузка объекта в хранилище;
  • Скачивание объекта из хранилища;
  • Копирование объекта внутри хранилища (включая копирование между бакетами);
  • Удаление объекта;
  • Частичное изменение объекта в хранилище.

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

Дополнительные возможности:

  • Настройка жизненных циклов для объектов в бакете;
  • Ограничения на размеры объектов и метаданных (подробнее в разделе "Квоты и лимиты").

Ключ объекта

Ключ — это идентификатор объекта в бакете. Хотя структура хранения объектов плоская, инструменты с графическим интерфейсом представляют ее как иерархическую файловую систему.

Пример ключа: top_level_prefix/subprefix/text_data.txt

Требования к ключу:

  • Кодировка UTF-8;
  • Длина менее 1024 байт;
  • Не должен содержать символов: : * ? " < > | !.

Безопасные символы: [a-zA-Z0-9], -, _, /, \

Использование других символов может вызвать проблемы при работе с S3.

Папки

S3 не имеет концепции папок на уровне хранилища. Однако графические интерфейсы (например, CyberDuck) эмулируют папки для удобства пользователя.

Как это работает:

  • Папка представляется как объект с нулевым размером;
  • Ключ этого объекта служит префиксом для других объектов;
  • Пример: объект с ключом x (размер 0) отображается как папка, а объект с ключом x/y.txt — как файл y.txt в папке x.

Каждый инструмент управления работает с объектами и папками согласно своей собственной логике.

Примечание: Удаление папки с объектами — асинхронная операция. S3 сначала готовит список объектов для удаления, затем выполняет удаление. Если во время этого процесса загрузить объект в удаляемую папку, он успешно загрузится, и папка останется в хранилище вместе с новым объектом.

Особенности доступа:

Публичные бакеты:

  • Доступ по HTTP и HTTPS;
  • Для HTTPS используется сертификат от GlobalSign на уровне облака;
  • Работает даже без настройки хостинга сайта.

Бакеты с ограниченным доступом:

  • Генерация временных подписанных ссылок;
  • Возможность скачивания объектов с ограниченным доступом.

Метаданные

С каждым объектом хранятся метаданные в виде пар "ключ-значение". Метаданные делятся на системные и пользовательские и могут использоваться для поиска объектов.

Системные метаданные

Определяются S3 автоматически:

КлючОписание
DateДата и время отправки запроса на загрузку объекта
Content-LengthРазмер объекта в байтах
Last-ModifiedДата создания или последнего изменения объекта
Content-MD5MD5-хеш объекта, закодированный в base64
Cache-ControlЗначение HTTP-заголовка Cache-Control, переданное при сохранении объекта. Возвращается клиентам при запросе объекта или его метаданных. Пример: Cache-Control: max-age=300 — объект устаревает через 300 секунд после получения клиентом.
ExpiresЗначение HTTP-заголовка Expires, переданное при сохранении объекта. Возвращается клиентам при запросе объекта или его метаданных. Пример: Expires: Thu, 1 Apr 2025 21:00:00 GMT — объект устаревает 1 апреля 2025 года в 21:00:00 по Гринвичу.

Пользовательские метаданные

Могут быть переданы при загрузке объекта в виде пар "ключ-значение".

Особенности работы через HTTP API:

  • Метаданные передаются в виде HTTP-заголовков;
  • Имена заголовков должны начинаться с X-Amz-Meta-;
  • S3 возвращает метаданные в виде HTTP-заголовков с тем же префиксом;
  • Ключи метаданных должны состоять только из ASCII-символов.

Преобразование заголовков: X-Amz-Meta-foo-bar_bazX-Amz-Meta-Foo-Bar_baz

Где Foo-Bar_baz — ключ метаданных, который будет сохранен вместе с объектом.

Примечание: Заголовок PUT-запроса не должен превышать 8 КБ. Размер пользовательских метаданных в этом заголовке не должен превышать 2 КБ.

Условная запись (conditional writes)

Условная запись позволяет избежать случайной перезаписи и конфликтов при одновременных загрузках объектов.

Заголовки для условной записи:

Для методов upload и completeUpload:

  • If-Match — запись выполняется только если объект уже существует и его ETag совпадает с указанным значением;
  • If-None-Match — запись выполняется только если объект с таким ключом отсутствует в бакете.

Для методов copy и copyPart:

  • X-Amz-Copy-Source-If-Match — копирование выполняется только если исходный объект существует и его ETag совпадает;
  • X-Amz-Copy-Source-If-None-Match — копирование выполняется только если исходный объект отсутствует.

Коды ответов:

  • 404 (Not Found) — объект по ключу отсутствует (только для If-Match);
  • 409 (Conflict) — условие выполнено, но во время загрузки ключ был изменен другой операцией записи;
  • 412 (Precondition Failed) — условие не выполнено.

Особенности составной загрузки:

  • Инициация составной загрузки происходит без условий;
  • Условные заголовки применяются на этапе Complete Multipart Upload;
  • При получении кода ответа 409 необходимо самостоятельно прервать текущую составную загрузку и начать новую.

Блокировка версии объекта (Object Lock)

Механизм блокировки версии объекта (Object Lock) в версионируемых бакетах позволяет запретить удаление или перезапись конкретной версии объекта.
Блокировка обеспечивает хранение версии по принципу WORM (Write Once Read Many), при этом не мешает загружать новые версии того же объекта.

Чтобы можно было устанавливать блокировки на версии объектов, включите соответствующую опцию в настройках бакета.

Примечание:\

  • Блокировка версий объектов невозможна в бакетах с выключенным или приостановленным версионированием;\
  • Если блокировка включена, приостановить версионирование нельзя;\
  • Включение механизма блокировок не устанавливает их автоматически на уже загруженные версии --- оно лишь позволяет добавлять их вручную;\
  • Отключение блокировок не снимает уже действующие --- они продолжают работать.

Типы блокировок

Блокировки различаются по сроку действия и уровню строгости. Их можно устанавливать:

  • для отдельных версий объектов (во время загрузки или после нее);
  • по умолчанию --- для всех новых версий, загружаемых в бакет.

Временные блокировки

Управляемая блокировка (governance-mode retention)

  • Может быть установлена пользователем с ролью storage.uploader;
  • Пользователь с ролью storage.admin имеет больше возможностей:
    • может удалить или перезаписать версию объекта;
    • изменить срок блокировки;
    • снять блокировку. Для таких действий нужно явное подтверждение, например, при работе через REST API --- с помощью заголовка
      X-Amz-Bypass-Governance-Retention: true.

Строгая блокировка (compliance-mode retention)

  • Может быть установлена пользователем с ролью storage.uploader;
  • Пользователь с ролью storage.admin может только продлить блокировку;
  • До окончания срока снять, сократить или обойти блокировку невозможно.
  • Пользователь с ролью storage.uploader может установить и снять такую блокировку;
  • Обойти блокировку нельзя;
  • Бессрочная и временная блокировки могут существовать одновременно. При этом бессрочная имеет приоритет: удалить или перезаписать версию невозможно, даже если временная блокировка это допускает.

Таблица действий и ролей

ДействиеУправляемая (governance)Строгая (compliance)Бессрочная (legal hold)
Установить блокировкуstorage.uploaderstorage.uploaderstorage.uploader
Удалить или перезаписать версиюstorage.admin
Сократить блокировкуstorage.admin
Продлить блокировкуstorage.adminstorage.admin
Заменить временную блокировкуstorage.admin
Снять блокировкуstorage.adminstorage.uploader

Блокировки по умолчанию

Для бакета можно настроить блокировки, которые будут применяться автоматически ко всем новым версиям объектов.

Нужно указать:

  • тип блокировки: временная управляемая или временная строгая;
  • срок действия: в днях или годах с момента загрузки версии объекта.

Дата окончания блокировки рассчитывается автоматически для каждой версии.

Важно:\

  • Если включены блокировки по умолчанию, при каждой загрузке версии нужно вычислить MD5-хеш, закодировать его в Base64 и указать в запросе, например в заголовке Content-MD5 при работе через REST API;\
  • Можно задать собственные параметры временной блокировки при загрузке конкретной версии --- они будут иметь приоритет;\
  • Нельзя загрузить версию без временной блокировки или снять ее после загрузки;\
  • Изменение настроек блокировок по умолчанию не влияет на уже загруженные версии.

Частичное изменение и дозапись объектов в S3

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

Примечание:

  • Механизм частичного изменения объекта не входит в стандартную функциональность S3 API;
  • Он доступен только для бакетов с выключенным версионированием.

Зачем использовать частичное изменение

С помощью этого механизма можно хранить, например, логи в виде одного файла и периодически дописывать в него данные, не создавая новые объекты. Кроме того, частичное изменение упрощает работу с крупными файлами.

Чтобы изменить всего один байт информации в большом файле, вы можете использовать один из подходов:

  • Стандартный способ: скачать объект с помощью метода GET, внести изменения и загрузить его обратно через UPLOAD. Это требует полной перезаписи файла;
  • Оптимизированный способ: использовать метод PATCH, передав только ту часть файла, которая изменилась или добавилась.

Такой подход позволяет увеличить скорость работы с S3 и снизить стоимость хранения и передачи данных.

Как работает частичное изменение на стороне сервера

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

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

Эта функциональность реализована в виде метода PATCH и поддерживается в GeeseFS — рекомендованном инструменте для частичного изменения объектов в бакете.

Также можно:

  • Отправлять запросы PATCH напрямую к S3 API;
  • Расширить набор методов AWS SDK, воспользовавшись спецификацией метода PATCH.

Одновременное изменение объектов

S3 поддерживает параллельное частичное изменение одного и того же объекта.

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

Разрешение конфликтов

При одновременных изменениях работает механизм разрешения конфликтов.

  • Если изменения пересекаются, применяется то, которое было выполнено позднее;
  • Количество попыток перезаписи ограничено сервером;
  • Если сервер не смог разрешить конфликт, возвращается ошибка ConcurrentUpdatesPatchConflict.

Спецификация метода PATCH

"PatchObject": {
"name": "PatchObject",
"http": {
"method": "PATCH",
"requestUri": "/{Bucket}/{Key+}"
},
"input": { "shape": "PatchObjectRequest" },
"output": { "shape": "PatchObjectOutput" },
"httpChecksum": {
"requestAlgorithmMember": "ChecksumAlgorithm",
"requestChecksumRequired": false
}
},

"PatchAppendPartSize": { "type": "integer" },

"PatchedObjectInfo": {
"type": "structure",
"members": {
"ETag": { "shape": "ETag" },
"LastModified": { "shape": "LastModified" }
}
},

"PatchObjectOutput": {
"type": "structure",
"members": {
"Object": { "shape": "PatchedObjectInfo" }
}
},

"PatchObjectRequest": {
"type": "structure",
"required": ["Bucket", "Key", "ContentRange"],
"members": {
"Body": {
"shape": "Body",
"streaming": true
},
"Bucket": {
"shape": "BucketName",
"location": "uri",
"locationName": "Bucket"
},
"ContentLength": {
"shape": "ContentLength",
"location": "header",
"locationName": "Content-Length"
},
"ContentMD5": {
"shape": "ContentMD5",
"location": "header",
"locationName": "Content-MD5"
},
"ContentRange": {
"shape": "ContentRange",
"location": "header",
"locationName": "Content-Range"
},
"IfMatch": {
"shape": "IfMatch",
"location": "header",
"locationName": "If-Match"
},
"IfUnmodifiedSince": {
"shape": "IfUnmodifiedSince",
"location": "header",
"locationName": "If-Unmodified-Since"
},
"Key": {
"shape": "ObjectKey",
"location": "uri",
"locationName": "Key"
},
"PatchAppendPartSize": {
"shape": "PatchAppendPartSize",
"location": "header",
"locationName": "X-Yc-S3-Patch-Append-Part-Size"
}
},
"payload": "Body"
}

Жизненные циклы объектов в бакете

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

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

Виды действий

  • Изменение класса хранилища объектов или их неактивных версий на более «холодный».
    Изменение класса на ледяной (ICE) можно настроить с помощью AWS CLI, Terraform или API;
  • Удаление объектов или их неактивных версий;
  • Удаление незавершенных составных загрузок.

Фильтры для группировки объектов

  • Префикс ключа объекта;
  • Минимальный или максимальный размер объекта;
  • Метка объекта (недоступно в консоли управления);
  • Логический оператор AND — позволяет объединять несколько фильтров, чтобы гибко определять группу объектов.

В одном правиле жизненного цикла можно указать только один фильтр.
Чтобы применить несколько условий одновременно, используйте оператор AND.
Подробнее см. раздел «Конфигурация жизненного цикла».

Форматы конфигурации

Если вы используете S3 API, настройка жизненного цикла выполняется в формате XML.
Для других инструментов с поддержкой S3 API могут использоваться иные форматы. Например:

  • Для AWS CLIJSON;
  • Для TerraformHCL.

Применение конфигурации

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

Изменения, внесенные в правила жизненного цикла, применяются раз в сутки
с учетом состояния на момент 00:00 UTC.
Обновление может занимать несколько часов.

Классы хранения объектов в S3

S3 позволяет хранить объекты в различных классах хранения, в зависимости от ваших требований к длительности хранения и частоте доступа к данным. Ниже краткий обзор доступных классов:

  • STANDARD — стандартное хранилище для объектов с частым доступом;
  • COLD / STANDARD_IA / NEARLINE — холодное хранилище для объектов с редким доступом;
  • ICE / GLACIER — ледяное архивное хранилище для долгосрочного хранения, доступ к данным возможен напрямую (ICE) или через процедуру восстановления (GLACIER).

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


Особенности классов хранения

  • Все классы имеют одинаковый SLA и защищают данные от потери даже при полном отказе одной из трех зон доступности;
  • Классы STANDARD и COLD идентичны по техническим характеристикам и схеме резервирования: используется репликация ×3 — по одной копии в каждой зоне доступности;
  • Класс ICE отличается производительностью: доступ к данным осуществляется напрямую для чтения и записи. Особенности:
    • в других облачных решениях архивного класса (например, AWS Glacier) для доступа к данным требуется сначала переместить их в более «горячий» класс хранения, что может занимать от нескольких десятков минут до суток;
    • ICE упрощает инфраструктуру и снижает расходы.

Хранилище по умолчанию для бакета

  • Если при загрузке объекта не указан класс хранения, используется хранилище по умолчанию, заданное для бакета;
  • Хранилище по умолчанию можно установить:
    • при создании бакета в консоли управления;
    • позже изменить для конкретного бакета через консоль.

Нельзя установить хранилище по умолчанию для всех бакетов одновременно, каталога или всего облака.
Хранилище по умолчанию полезно, если инструмент не позволяет указать класс хранения при загрузке объекта.


Изменение класса хранения для объекта

Вы можете изменить класс хранения объекта следующими способами:

  1. Повторная загрузка объекта с новым классом хранения.
  2. Перемещение или копирование объекта с указанием нового класса хранения.
  3. Автоматическое изменение класса хранения через жизненные циклы объектов.

Примечание:

  • При перемещении или повторной загрузке с тем же ключом исходный объект удаляется.

Идентификаторы классов хранения

При работе с S3 через API, совместимый с Amazon S3, или с поддерживаемыми инструментами, используйте следующие идентификаторы:

  • Стандартное хранилище: STANDARD;
  • Холодное хранилище: COLD, STANDARD_IA, NEARLINE (последние два — только при загрузке объектов);
  • Ледяное хранилище: ICE, GLACIER (GLACIER — только при загрузке объектов).

Резервное копирование

S3 — удобное и надежное хранилище для резервных копий ваших данных. Оно позволяет хранить данные с высокой доступностью и защитой от потери, а также легко интегрируется с различными инструментами для бэкапов.

Основные подходы к резервному копированию

  1. Ручное копирование объектов
  • Используйте AWS CLI или API, чтобы копировать объекты в другой бакет или регион;
  • Подходит для небольшого объема данных и нерегулярного копирования.
  1. Автоматизированное резервное копирование
  • Настройте скрипты или инструменты резервного копирования, которые периодически копируют новые и измененные объекты;
  • Инструменты: aws s3 sync, rclone, restic, Velero (для Kubernetes).
  1. Использование версионирования
  • Включите версионирование для бакета.
    Это позволяет хранить все версии объектов, защищая от случайного удаления или перезаписи.
  1. Репликация между бакетами
  • Настройте Cross-Region Replication (CRR) или Same-Region Replication (SRR) для автоматической копии объектов в другой бакет.
    Это обеспечивает дополнительный уровень защиты и доступность данных даже при сбое региона.

Рекомендации

  • Храните резервные копии в отдельных бакетах или регионах для защиты от локальных сбоев;
  • Используйте холодные классы хранения (например, COLD или ICE) для долгосрочного хранения резервных копий и экономии средств;
  • Настройте жизненные циклы объектов, чтобы автоматически удалять старые резервные копии и оптимизировать использование пространства.

Метки объектов

Метки (Tags) — это пары ключ-значение, которые можно присвоить объектам в S3.
Они помогают организовывать, фильтровать и управлять объектами, особенно в больших бакетах.

Основные возможности меток

  • Присвоение ключа и значения каждому объекту;
  • Возможность фильтровать объекты по меткам при поиске или настройке правил жизненного цикла;
  • Использование меток для отслеживания расходов и аналитики (например, распределение затрат по проектам);
  • Поддержка до 10 меток на один объект.

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

  1. Жизненные циклы объектов
  • Применение правил к объектам с определенной меткой:
    • temporary=true — удалять объекты через 30 дней;
    • archive=true — переводить объекты в ледяное хранилище (ICE);
    • project=marketing — хранить данные проекта в течение года.
  1. Управление доступом
  • В политиках IAM можно ограничивать доступ к объектам с конкретными метками, например:
    • department=finance — доступ только для финансового отдела.
  1. Отчеты и аналитика
  • Сбор статистики и распределение затрат по меткам:
    • team=backend — учет расходов команды разработки;
    • environment=prod — учет объектов из продакшн-среды.

Создание и управление метками

  • Через консоль управления: добавляйте или изменяйте метки при загрузке объекта или для уже существующих объектов.
  • Через API или CLI: используйте команды:
    • put-object-tagging — для добавления меток;
    • get-object-tagging — для получения меток объекта.

Рекомендации

  • Придерживайтесь одинаковой схемы именования меток, чтобы облегчить фильтрацию и управление;
  • Используйте метки для автоматизации процессов, например в сочетании с жизненными циклами и правилами доступа;
  • Метки не влияют на стоимость хранения, но помогают оптимизировать управление объектами.

Составная (multipart) загрузка

S3 позволяет сохранять объекты размером в несколько терабайт.
Чем больше объект, тем выше вероятность, что загрузка прервется из-за ошибок сети.

Поэтому большие объекты эффективнее загружать частями меньшего размера.
Такой способ сохранения объектов называется составная загрузка (multipart upload).

Основные моменты

Через консоль управления (например, AWS Management Console) порой можно увидеть сообщения о незавершенных загрузках следующего рода:

  • «Есть незавершенные загрузки»;
  • «N незавершенных загрузок». В интерфейсе той же консоли можно просмотреть детали, завершить загрузку или удалить объект.

Для составной загрузки доступны многие инструменты, например, перечисленные ниже:

  1. AWS Management Console
  • Позволяет загружать файлы больших размеров через веб-интерфейс;
  • Автоматически разбивает объект на части и выполняет параллельную загрузку.
  1. CLI (Command Line Interface)
  • AWS CLI: команды aws s3 cp и aws s3api create-multipart-upload / upload-part / complete-multipart-upload поддерживают multipart при загрузке больших файлов.
  1. SDK для языков программирования
  • Python (boto3): методы create_multipart_upload, upload_part, complete_multipart_upload;
  • Java (AWS SDK for Java): классы InitiateMultipartUploadRequest, UploadPartRequest, CompleteMultipartUploadRequest;
  • Go, JavaScript, C# и др.: все официальные SDK для работы с S3 поддерживают multipart.
  1. GeeseFS
  • Рекомендуемый инструмент для работы с большими объектами в S3;
  • Позволяет эффективно использовать составную загрузку и работать с объектами больших размеров.
  1. Другие S3-совместимые инструменты
  • Rclone, s3cmd, Cyberduck, MinIO Client и другие клиенты, совместимые с S3 API, поддерживают multipart upload.

Как работать с незавершенными загрузками

  • Удаление вручную: например, через интерфейс консоли или методы SDK;
  • Автоматическое удаление: можно настроить для бакета автоматическое удаление незавершенных загрузок в определенный момент времени:
    • для этого создайте правило жизненного цикла с действием AbortIncompleteMultipartUpload.

Загрузка файла с помощью HTML формы

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

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

Как это работает

  1. Создание формы HTML
    Форма отправляет данные методом POST на URL вашего бакета. В ней указываются необходимые параметры для авторизации, ограничения по размеру и типу файла.

  2. Использование pre-signed POST
    Поскольку публичный доступ к бакету небезопасен, обычно используют pre-signed POST. Он создается на сервере и содержит:

  • Срок действия подписи;
  • Ограничения на размер файла;
  • Ограничения по имени объекта;
  • Другие условия (например, тип содержимого).

Pre-signed POST позволяет браузеру отправить файл напрямую в S3, не раскрывая ключи доступа.

Дополнительно смотрите раздел Управление доступом.

  1. Отправка файла через форму
    Пользователь выбирает файл, форма отправляет данные на S3. Если условия pre-signed POST соблюдены, объект успешно загружается в бакет.

Пример HTML формы

<form action="https://my-bucket.s3.amazonaws.com/" method="post" enctype="multipart/form-data">
<input type="hidden" name="key" value="uploads/${filename}">
<input type="hidden" name="AWSAccessKeyId" value="ВАШ_ACCESS_KEY">
<input type="hidden" name="policy" value="BASE64_POLICY">
<input type="hidden" name="signature" value="SIGNATURE">
<input type="file" name="file">
<input type="submit" value="Загрузить">
</form>
  • key — путь и имя файла в бакете;
  • AWSAccessKeyId — ваш публичный ключ;
  • policy — ограничения и срок действия загрузки в формате Base64;
  • signature — подпись, которая проверяет валидность policy.

Никогда не используйте постоянные ключи доступа в клиентском коде. Для безопасности формируйте pre-signed POST на сервере.

Генерация pre-signed POST через Python (boto3)

import boto3

s3 = boto3.client('s3')
bucket_name = 'my-bucket'

# Создание pre-signed POST
response = s3.generate_presigned_post(
Bucket=bucket_name,
Key='uploads/myfile.txt',
Fields={"acl": "private"},
Conditions=[
{"acl": "private"},
["content-length-range", 0, 10485760] # Максимум 10 MB
],
ExpiresIn=3600 # 1 час
)

print(response)
  • Fields — значения, которые нужно добавить в форму.
  • Conditions — ограничения на загрузку (размер, ACL, имя и др.).
  • ExpiresIn — срок действия подписи.

Советы и рекомендации

  • Ограничивайте размер файлов через Conditions, чтобы защитить бакет;
  • Используйте временные pre-signed POST, чтобы ключи не были уязвимыми;
  • Если нужно, можно генерировать уникальные имена файлов на сервере для предотвращения перезаписи;
  • Проверяйте тип и размер файлов на клиенте и на сервере для безопасности;

Загрузка через HTML форму — простой и безопасный способ позволить пользователям отправлять файлы напрямую в S3, при этом не раскрывая ваши секретные ключи доступа.