Вопрос или проблема
Нам нужно скопировать содержимое бакета в новую учетную запись в другом регионе AWS.
Бакет содержит около 200 тыс. объектов, большинство из которых архивированы (Glacier), и большая часть из них довольно большая (более 10 ГБ).
Сначала мы попробовали следующее:
- Пакетный скрипт для восстановления всех объектов.
- Настройка триггера Lambda для обработки завершения восстановления для каждого объекта.
- Выполнение метода копирования с помощью boto3 в функции Lambda.
Это хорошо работает для меньших объектов (до ~2 ГБ), но большие объекты занимают больше времени, чем максимальная разрешенная продолжительность Lambda (15 минут).
Чтобы завершить оставшиеся (>10 тыс. объектов), нам нужно использовать какую-то ВМ, однако ВМ вынуждены находиться в VPC, и по какой-то причине boto3 не может обрабатывать команды копирования между регионами из VPC:
Произошла ошибка (AccessDenied) при вызове операции UploadPartCopy: Точки доступа VPC не поддерживают межрегиональные запросы
Поэтому мы решили скачать и загрузить каждый объект. Это занимает слишком много времени для количества объектов, которые нам нужно скопировать.
Может кто-то предложить лучшее решение?
ЗАМЕТКА #1: У AWS есть так называемые пакетные задания, которые могут быть актуальны, но их немного сложно настроить, и по какой-то причине требуется, чтобы как исходный, так и целевой бакеты имели включенную версионирование (что отключено в этом случае).
ЗАМЕТКА #2: У нас есть роль в целевой учетной записи, которая имеет доступ к исходной учетной записи, и запросы S3 выполняются с оплатой со стороны запрашивающего.
Ответ или решение
Для копирования содержимого бакета Amazon S3 между аккаунтами и регионами, особенно когда речь идет о большом количестве объектов и крупных размерах файлов, необходимо использовать подход, который будет более эффективным, чем загрузка и скачивание. Вот пошаговое решение, которое учитывает ваши требования и ограничения:
Шаг 1: Восстановление объектов из Glacier
-
Восстановление объектов: Для начала, необходимо завершить восстановление всех объектов Glacier. Вы можете использовать AWS CLI или Python с boto3 для пакетного восстановления объектов. Убедитесь, что вы тестируете процесс на меньшем количестве объектов перед тем, как запускать его на всех, чтобы убедиться, что всё работает без ошибок.
Пример кода на Python для восстановления объектов:
import boto3 s3 = boto3.client('s3') def restore_glacier_objects(bucket_name): objects = s3.list_objects_v2(Bucket=bucket_name) for obj in objects.get('Contents', []): s3.restore_object(Bucket=bucket_name, Key=obj['Key'], RestoreRequest={ 'Days': 7, 'GlacierJobParameters': { 'Tier': 'Standard' # или 'Expedited', в зависимости от ваших потребностей } }) restore_glacier_objects('your-source-bucket')
Шаг 2: Использование AWS DataSync
-
AWS DataSync: DataSync — это сервис, который позволяет быстро и безопасно переносить данные между хранением данных либо в пределах AWS, либо в локальные хранилища. Он идеально подходит для вашей ситуации, так как может копировать данные между регионами и аккаунтами, и позаботится о больших объемах данных и количестве объектов.
- Создайте Task в DataSync, указав исходный и целевой бакеты S3.
- Простой интерфейс настроек позволяет вам выбрать фильтры для копирования, окончания задач и уведомления.
- Учтите, что DataSync будет использовать ваши IAM разрешения для доступа к обоим бакетам.
Шаг 3: Настройка IAM ролей и политик
- Убедитесь, что у вас есть необходимые разрешения: Вам необходимо убедиться, что роль, используемая для доступа к DataSync, имеет права на чтение из исходного бакета и запись в целевой бакет. Вам также понадобятся соответствующие политики на обоих аккаунтах, чтобы разрешить доступ к ресурсам друг друга.
Шаг 4: Наблюдение и отладка
- Мониторинг и завершение задач: Следите за прогрессом копирования через консоль DataSync или с помощью CloudWatch, чтобы получить уведомления о завершении задач.
Примечания и дополнительные рекомендации
- Если нужно копировать большие объекты (>10 ГБ), убедитесь, что вы активно используете функционал партирования (Multipart Upload) в S3; однако, когда вы используете DataSync, это будет происходить автоматически.
- Если необходимо, используйте AWS Batch для автоматизации ваших задач, даже если версия включена (вы можете попробовать включить версионирование только для временного копирования, а затем отключить его).
Эти шаги должны помочь вам успешно перенести большие объемы данных между аккаунтами и регионами S3 с минимальными затратами времени и ресурсов.