web-dev-qa-db-ja.com

GlacierからAmazon S3にフォルダー(またはバケット全体)を復元する方法は?

Amazon S3上の多数のバケットのライフサイクルを変更したため、ストレージクラスがGlacierに設定されました。オンラインAWSコンソールを使用してこれを行いました。これらのファイルが再び必要になりました。

ファイルごとにS3に復元する方法を知っています。しかし、私のバケットには何千ものファイルがあります。バケット全体をGlacierに送信する方法があったのと同じように、バケット全体をS3に戻す方法があるかどうかを確認したかったのです。

ソリューションをプログラムする方法があると思います。しかし、コンソールでそれを行う方法があるかどうかを見たかったのです。または別のプログラムで?または私が行方不明になっているかもしれない何か?

34
TylerW

このための組み込みツールはありません。 S3の「フォルダー」は、オブジェクトキー(パス/ファイル名)のスラッシュに基づく人間の利便性のための幻想であり、氷河に移行するすべてのオブジェクトは個別に復元する必要がありますが...

もちろん、階層を反復処理するスクリプトを記述し、SDKまたは選択したプログラミング言語のREST APIを使用してこれらの復元要求を送信できます。

先に進む前に、氷河からS3への復元の仕組みを理解してください。これは常に一時的な復元であり、各オブジェクトがS3で保持される日数を選択してから、氷河に保存されるだけに戻ります。

また、短時間で大量の氷河データを復元した場合のペナルティ料金を理解するか、予想外の費用が発生する可能性があります。緊急度に応じて、復元操作を数日または数週間にわたって分散させることができます。

11

s3cmdを使用する場合は、それを使用して非常に簡単に再帰的に復元できます。

s3cmd restore --recursive s3://mybucketname/ 

また、フォルダーだけを復元するためにも使用しました。

s3cmd restore --recursive s3://mybucketname/folder/
57
Nate Fox

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>オブジェクトを復元する日数。

32
dustinmm80

上記の回答は、バケットがGlacierのオブジェクトと混在しているものとそうでないものがあるため、うまくいきませんでした。私にとって最も簡単なことは、バケット内のallGLACIERオブジェクトのリストを作成し、エラーを無視して(それぞれのように)進行中、オブジェクトなどではありません)。

  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-operation-is-not-valid-for-the -source-objects-storage-class / 、上記のソリューションのいくつかを試した後に見つけたリソース。

13
Domenic D.

最近、バケット全体とそのすべてのファイルとフォルダーを復元する必要がありました。これを実行するには、資格情報で設定された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
5
SR.

ここに私のバージョンの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 "{}"
4
Stanislav

S3ブラウザはフォルダレベルで「Glacierから復元」できるように見えますが、バケットレベルではできません。唯一のことは、Proバージョンを購入する必要があることです。最適なソリューションではありません。

2
TylerW

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: Glacierの復元は、予想外に非常に高価になります。 ユースケースによっては、Infrequent Access層がより適切であることがわかります。 AWSにはさまざまな層の説明があります。

1
dannyman

別の方法はrcloneです。このツールは、データを同期/コピー/プッシュできます(ファイルでできるように)。 https://rclone.org/faq/#can-rclone-sync-directly-from-drive-to-s (リンクの例はGoogleドライブ用ですが、これはagnostiqueです)。しかし、Michael-sqlbotが言ったように、サーバーまたはコンテナーはどこかで同期/バックアップ操作を開始する必要があります。

0
MouIdri

このコマンドは私のために働いた:

_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

  • たくさんのオブジェクトがある場合、このコマンドはかなり時間がかかります。
  • CTRL-C /コマンドを中断しないでください。そうしないと、再実行する前に、処理されたオブジェクトがRestoreAlreadyInProgress状態から抜け出すのを待つ必要があります。状態が遷移するまでに数時間かかる場合があります。待機する必要がある場合は、次のエラーメッセージが表示されます:An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation
0
Jason Leach