Как восстановить папки (или целые ведра) в Amazon S3 из Glacier?

Я изменил жизненный цикл для группы моих ведер на Amazon S3, поэтому их класс хранения был установлен на Glacier. Я сделал это с помощью онлайн-консоли AWS. Теперь мне снова нужны эти файлы.

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

Я предполагаю, что есть способ запрограммировать a решение. Но я хотел посмотреть, есть ли способ сделать это в консоли. Или с другой программой? Или что-то еще, чего мне не хватает?

9 ответов


для этого нет встроенного инструмента. "Папки" в S3-это иллюзия для удобства человека, основанная на косых чертах в ключе объекта (путь/имя файла), и каждый объект, который мигрирует в glacier, должен быть восстановлен индивидуально...

конечно, вы можете написать сценарий для итерации по иерархии и отправить эти запросы на восстановление с помощью SDK или REST API на выбранном вами языке программирования.

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

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


Если вы используете s3cmd вы можете использовать его для рекурсивного восстановления довольно легко:

s3cmd restore --recursive s3://mybucketname/ 

Я также использовал его для восстановления только папок:

s3cmd restore --recursive s3://mybucketname/folder/

Если вы используете AWS CLI tool (это хорошо, вы должны), вы можете сделать это так:

aws s3 ls s3://<bucket_name> | awk '{print }' | xargs -L 1 aws s3api restore-object --restore-request Days=<days> --bucket <bucket_name> --key

заменить <bucket_name> С именем ведра, которое вы хотите.

заменить <days> С количеством дней, которые вы хотите восстановить объект.


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

  1. получить список всех файлов GLACIER (ключей) в ведро

    aws s3api list-objects-v2 --bucket <bucketName> --query "Contents[?StorageClass=='GLACIER']" --output text | awk '{print }' > 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> <bucketName> --key "$x"
        echo "Done restoring $x"
      done
    

кредит идет Джошу на http://capnjosh.com/blog/a-client-error-invalidobjectstate-occurred-when-calling-the-copyobject-operation-operation-is-not-valid-for-the-source-objects-storage-class/, ресурс, который я нашел после попытки некоторых из вышеуказанных решений.


недавно мне нужно было восстановить целое ведро и все его файлы и папки. Для этого вам понадобятся инструменты s3cmd и aws cli, настроенные с вашими учетными данными.

Я нашел это довольно надежным для обработки ошибок с конкретными объектами в ведре, которые, возможно, уже имели запрос на восстановление.

#!/bin/sh

# This will give you a nice list of all objects in the bucket with the bucket name stripped out
s3cmd ls -r s3://<your-bucket-name> | awk '{print }' | sed 's#s3://<your-bucket-name>/##' > glacier-restore.txt

for x in `cat glacier-restore.txt`
do
    echo "restoring $x"
    aws s3api restore-object --restore-request Days=7 --bucket <your-bucket-name> --profile <your-aws-credentials-profile> --key "$x"
done

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

# Parameters
BUCKET="my-bucket" # the bucket you want to restore, no s3:// no slashes
BPATH="path/in/bucket/" # the objects prefix you wish to restore (mind the `/`) 
DAYS=1 # For how many days you wish to restore the data.

# Restore the objects
aws s3 ls s3://{BUCKET}/${BPATH} --recursive | \
awk '{out=""; for(i=4;i<=NF;i++){out=out" "$i}; print out}'| \
xargs -I {} aws s3api restore-object --restore-request Days={DAYS} \
--bucket {BUCKET} --key "{}"

похоже, что браузер S3 может "восстановить из Glacier" на уровне папки, но не на уровне ковша. Единственное, что вам нужно купить Pro версию. Так что не лучшее решение.


вариант ответа Дастина на использование AWS CLI, но использование рекурсии и pipe to sh для пропуска ошибок (например, если некоторые объекты уже запросили восстановление...)

BUCKET=my-bucket
BPATH=/path/in/bucket
DAYS=1
aws s3 ls s3://$BUCKET$BPATH --recursive | awk '{print }' | xargs -L 1 \
 echo aws s3api restore-object --restore-request Days=$DAYS \
 --bucket $BUCKET --key | sh

бит xargs echo генерирует список команд "aws s3api restore-object" и, передавая их в sh, вы можете продолжить работу с ошибкой.

Примечание: Ubuntu 14.04 aws-cli пакет старый. Для того, чтобы использовать --recursive вам потребуется установить через github.

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


другой способ-rclone. Этот инструмент может синхронизировать / копировать / толкать данные ( как мы могли бы сделать с файлами). https://rclone.org/faq/#can-rclone-sync-directly-from-drive-to-s3 (пример ссылки для Google Диска, но это агностика). Но, как сказал Майкл - sqlbot, сервер или контейнер должны начать операцию синхронизации/резервного копирования где-то.