2017-01-24 14 views
3

Я тестирую сценарий для восстановления даты, хранящейся в ведре S3, с правилом жизненного цикла, которое каждый день перемещает данные на ледник. Итак, теоретически, когда я загружаю файл в ведро S3, через день инфраструктура Amazon должна переместить его на ледник.S3 ведра для ледника по запросу Возможно ли это из boto3 API?

Но я хочу протестировать скрипт, который я разрабатываю на python, чтобы протестировать процесс восстановления . Итак, если я понимаю API boto3, я не видел никакого способа заставить файл, хранящийся в ведре S3, немедленно перемещать в хранилище ледников. Возможно это сделать или необходимо ждать, пока инфраструктура Amazon не выполнит правило жизненного цикла.

Я хотел бы использовать код, как это:

bucket = s3.Bucket(TARGET_BUCKET) 
for obj in bucket.objects.filter(Bucket=TARGET_BUCKET, Prefix=TARGET_KEYS + KEY_SEPARATOR): 
    obj.move_to_glacier() 

Но я не могу найти API, которые делают этот шаг к леднику по требованию. Кроме того, я не знаю, если я могу заставить это по требованию, используя ведро правила жизненного цикла

ответ

3

Это невозможно. Единственный способ миграции объекта S3 в класс хранения GLACIER - это политика жизненного цикла.

x-amz-storage-class

Ограничения: Вы не можете указать GLACIER как класс хранения. Чтобы переместить объекты в класс хранения GLACIER, вы можете использовать конфигурацию жизненного цикла.

http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html

The Rest API представляет собой интерфейс, используемый всеми SDKs, консоли и AWS-Cli.

Примечание ... Испытание с использованием небольших объектов, но не архивирование небольших объектов на ледник в процессе производства. S3 выставляет счет за 90 дней минимум хранения ледников, даже если вы удалите объект до 90 дней. (Эта плата задокументирована.)

0

Можно загружать файлы из S3 в Glacier, используя upload_archive() метод Glacier.

Обновление: Это будет не так, как управление жизненным циклом объекта S3, но прямая загрузка на ледник.

glacier_client = boto3.client('glacier') 

bucket = s3.Bucket(TARGET_BUCKET) 

for obj in bucket.objects.filter(Prefix=TARGET_KEYS + KEY_SEPARATOR): 
    archive_id = glacier_client.upload_archive(vaultName='TARGET_VAULT',body=obj.get()['Body'].read()) 
    print obj.key, archive_id 

.filter() не принимает аргумент Bucket ключевое слово.

+1

Это не будет делать то, что хочет OP. Объекты S3 в классе хранения «GLACIER» принципиально отличаются от архивов в хранилище ледников. Недавно я описал разницу [в ответе] (http://stackoverflow.com/a/41828828/1695906) на несвязанный вопрос. –

+0

Согласовано, это не то же самое, что AWS делает через жизненный цикл S3 obj. Этот метод будет выполнять только часть загрузки архива в хранилище ледников по требованию (например, прямая загрузка на ледник). – franklinsijo