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

StackOverflow https://stackoverflow.com//questions/20033651

Вопрос

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

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

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

Это было полезно?

Решение

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

Конечно, вы можете написать скрипт для иераргии через иерархию и отправлять эти запросы на восстановление с помощью SDKS или API для отдыха в вашем языке программирования.

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

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

Другие советы

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

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

Я также использовал его, чтобы восстановить только папки:

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

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

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

Заменять <bucket_name> с нужным вам именем корзины.

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

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

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

    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
    
  3. Кредит едет в Джош на http://capnjosh.com/blog/a-client-Oror-invalidobjectState-occurred-Chen-calling-the-copyObject- -Номация - недействительна - для укладки источника - класс для источников / , ресурс, который я обнаружил после попытки некоторых из вышеуказанных решений.

Я недавно должен был восстановить целое ведро и все его файлы и папки.Вам понадобится инструменты S3CMD и AWS CLI 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 $4}' | 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 и как восстановить данные из ледника.Я изменил некоторые из приведенных выше примеров для работы, когда ключ восстановления файлов содержит пробелы.

# 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 может «восстановить из ледника» на уровне папки, но не на уровне ведра.Единственное, что вы должны купить PRO версию.Так что не лучшее решение.

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

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

Бит эха XARGS генерирует список команд «AWS S3API Restore-Object», и трубопровод, что для SH, вы можете продолжить ошибку.

Примечание: Ubuntu 14.04 AWS-CLI Package старый.Для использования --recursive, вам нужно Установите через GitHub.

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

Другой способ RCLONE.Этот инструмент может синхронизировать / копировать / толкать данные (например, мы могли бы сделать с файлами). https://rclone.org/faq/#Can-RONE-Sync-Note-From-Drive-S3 (пример ссылки для Google Drive, но это агностик).Но как сказал Майкл - SQLBOT, сервер или контейнер должен запускать функцию синхронизации / резервной копии где-то.

Эта команда сработала для меня:

aws s3api list-objects-v2 \
--bucket BUCKET_NAME \
--query "Contents[?StorageClass=='GLACIER']" \
--output text | \
awk -F $'\t' '{print $2}' | \
tr '\n' '\0' | \
xargs -L 1 -0 \
aws s3api restore-object \
--restore-request Days=7 \
--bucket BUCKET_NAME \
--key

Подсказка

  • Эта команда может занять довольно много времени, если у вас много объектов.
  • Не нажимайте CTRL-C / прерывайте выполнение команды, иначе вам придется подождать, пока обработанные объекты выйдут из RestoreAlreadyInProgress состояние, прежде чем вы сможете повторно запустить его.Переход в другое состояние может занять несколько часов.Вы увидите это сообщение об ошибке, если вам нужно подождать: An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top