Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

s3cmd restore --recursive s3://mybucketname/ 

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

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

Ответ 3

Если вы используете инструмент 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> на количество дней, в течение которых вы хотите восстановить объект.

Ответ 4

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

  1. Получить список всех файлов 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
    

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

Ответ 5

Мне недавно понадобилось восстановить целую ведро и все его файлы и папки. Для этого вам понадобятся инструменты 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 $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

Ответ 6

Вот моя версия интерфейса 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 "{}"

Ответ 7

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

Ответ 8

Вариант ответа Дастина на использование 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 является старым. Чтобы использовать --recursive, вам нужно установить через github.

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

Ответ 9

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

Ответ 10

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

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

ProTip

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