Как восстановить с AWS Glacier обратно на S3 навсегда?

У меня около 50 Гб файлов, которые хранились в S3. Вчера я тупо добавил правило жизненного цикла для передачи файлов, которые были старше 30 дней, из S3 в Glacier, не понимая, что это приведет к отключению публичной ссылки на исходный файл.

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

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

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

Мои вопросы:

  1. Мне было интересно, есть ли способ сделать это без необходимости копировать мои файлы в новое ведро?

  2. Если я просто изменю класс хранения файла, как только он вернется в S3, это остановит его возвращение в Glacier?

  3. Если мне нужно скопировать файлы в новое ведро, я предполагаю, что эти копии случайно не вернутся в Glacier?

Я довольно новичок в S3 (как вы, вероятно, можете сказать по моей глупой ошибке), поэтому, пожалуйста, постарайтесь быть мягкими

6 ответов

Решение

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

Переход объектов в класс хранения GLACIER является односторонним.

Вы не можете использовать правило конфигурации жизненного цикла для преобразования класса хранения объекта из GLACIER в классы хранения STANDARD или REDUCED_REDUNDANCY. Если вы хотите изменить класс хранения заархивированного объекта на STANDARD или REDUCED_REDUNDANCY, вы должны сначала использовать операцию восстановления, чтобы сделать временную копию. Затем используйте операцию копирования, чтобы перезаписать объект как объект STANDARD, STANDARD_IA, ONEZONE_IA или REDUCED_REDUNDANCY.

Ссылка

... возвращаясь к леднику

Будучи педантичным на мгновение, архивные объекты не перемещаются между s3 и ледником, они постоянно находятся в леднике, и временные копии делаются в S3. Важно отметить, что вы платите за ледник и s3, когда вы временно восстанавливаете их. По истечении срока хранения копии S3 удаляются.

Чтобы дать полный ответ, я объединил два других SO сообщения:

Шаг первый временно восстановить все:

  1. Получите список всех файлов GLACIER (ключей) в корзине (вы можете пропустить этот шаг, если вы уверены, что все файлы находятся в Glacier).

    aws s3api list-objects-v2 --bucket <bucketName> --query "Contents[?StorageClass=='GLACIER']" --output text | awk '{print $2}' > glacier-restore.txt

  2. Создайте сценарий оболочки и запустите его, заменив "bucketName".

    #!/bin/sh
    
    for x in `cat glacier-restore.txt`
      do
        echo "Begin restoring $x"
        aws s3api restore-object --restore-request Days=7 --bucket <bucketName> --key "$x"
        echo "Done restoring $x"
      done
    

Кредит Джош & @ Domenic-D.

Шаг второй для постоянного восстановления:

aws s3 cp s3://mybucket s3://mybucket --force-glacier-transfer --storage-class

сделано и сделано.

Спасибо за комментарий @pete-dermott здесь.

Я использовал следующую команду для восстановления объекта S3 из класса хранилища Amazon Glacier:

aws s3api restore-object --bucket bucket_name --key dir1/sample.obj --restore-request '{"Days":25,"GlacierJobParameters":{"Tier":"Standard"}}'

Здесь временная копия объекта становится доступной на время, указанное в запросе на восстановление, например 25 дней, использованных в приведенной выше команде.

Если синтаксис JSON, используемый в примере, приводит к ошибке на клиенте Windows, замените запрос восстановления следующим синтаксисом:

--restore-request Days=25,GlacierJobParameters={"Tier"="Standard"}

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

Чтобы изменить класс хранилища объекта на Amazon S3 Standard, используйте следующую команду:

aws s3 cp s3://bucket_name/dir1 s3://bucket_name/dir1 --storage-class STANDARD --recursive --force-glacier-transfer

Это рекурсивно скопирует и перезапишет существующие объекты с классом хранилища Amazon S3 Standard.

Если кто-то хочет получить весь объект в сегменте, вот несколько команд PowerShell Core, которые помогут сделать это.

Если вам нужно сначала установить ядро ​​PowerShell — сделайте это. Затем установите инструменты AWS для PowerShell в Windows , Linux или macOS . Затем установитеAWS.Tools.S3модуль черезInstall-AWSToolsModule AWS.Tools.S3

Запустите операцию извлечения для каждого объекта в сегменте:

      Get-S3Object -BucketName arq-backup-s3 | ForEach-Object -Parallel {
    aws s3api restore-object --bucket $_.BucketName --key $_.Key --restore-request 'Days=14,GlacierJobParameters={Tier=Standard}'
}

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

      Get-S3Object -BucketName arq-backup-s3 | ForEach-Object -Parallel {
    $obj = aws s3api head-object --bucket $_.BucketName --key $_.Key | ConvertFrom-Json
    $restoredCount = ($obj | Where-Object -Property Restore -eq 'ongoing-request="false"' | Measure-Object).Count
    $workItems = ($obj | Where-Object -Property Restore -eq 'ongoing-request="true"' | Measure-Object).Count
    
    return [pscustomobject]@{
        Done = $restoredCount
        Missing = $workItems
    }
} | Measure-Object -Property Done, Missing -Sum

Получение объекта может занять от 3 до 5 часов.

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

      Get-S3Object -BucketName arq-backup-s3 | ForEach-Object -Parallel {
    aws s3 cp s3://$($_.BucketName)/$($_.Key) s3://$($_.BucketName)/$($_.Key) --force-glacier-transfer --storage-class STANDARD
}

Я запускаю приведенный выше код, чтобы навсегда получить 6337 объектов из Glacier общим размером 65 ГБ.

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

Есть два лимита дней. Когда вы запрашиваете получение файлов, у вас фактически два файла: один пересылается в Glacier, второй — в класс Standard, однако в веб-консоли мы видим два файла как один. Итак, ограничение, о котором вы говорите, говорит о том, как долго существует «стандартная» копия.

Второй лимит в днях (и размер файла дляGlacier Instant Retrieval) — это минимальное время (и размер), за которое вам будет выставлен счет. Вы все равно заплатите за это, даже если вы удалите файл до этого дня (или если размер файла меньше 128 КБ), но вы определенно можете изменить класс хранения или удалить его.

Теперь (2022/06) изменить класс хранилища обратно на стандартный стало намного проще. Чтобы перезаписать существующий объект классом хранилища Amazon S3 Standard, выполните следующую команду:

      aws s3 cp s3://awsexamplebucket/dir1/example.obj s3://awsexamplebucket/dir1/example.obj --storage-class STANDARD

Чтобы выполнить рекурсивное копирование всего префикса и перезаписать существующие объекты классом хранилища Amazon S3 Standard, выполните следующую команду:

      aws s3 cp s3://awsexamplebucket/dir1/ s3://awsexamplebucket/dir1/ --storage-class STANDARD --recursive --force-glacier-transfer

Документ: откройте https://aws.amazon.com/premiumsupport/knowledge-center/restore-s3-object-glacier-storage-class/ , затем найдите «Изменить класс хранения объекта на Amazon S3 Standard».

Если я просто изменю класс хранения файла, как только он вернется в S3, помешает ли это вернуться в Glacier?

Не забудьте удалить/изменить правило жизненного цикла, иначе файлы будут снова перемещены в Glacier.

Если мне нужно скопировать файлы в новое ведро, я предполагаю, что эти копии не вернутся случайным образом в Glacier?

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

Чтобы восстановить все, что сейчас (2022 г.), можно использовать пакетные операции S3. Создание задания пакетных операций S3 :

  1. создать список файлов с помощью аналогичной команды list:

aws s3api list-objects-v2 --bucket mybucket --query "Contents[?StorageClass=='GLACIER']" --output text | awk '{print "mybucket,", $2}' > mybucket.csv

Обратите внимание на пробелы в файле csv: приведенная выше команда awk вставляет пробел после «,» перед именем файла, и это интерпретируется как имя файла, начинающееся с пробела. Его можно удалить сsed -i 's/, /,/' mybucket.csv'

  1. загрузите mybucket.csv куда-нибудь на S3 и используйте его как манифест для задания восстановления
Другие вопросы по тегам