カピバラ好きなエンジニアブログ

興味ある技術とか検証した内容を赴くままに書いていきます。カピバラの可愛さこそ至高。

S3バッチオペレーションを使用したGlacierからの復元

経緯

Glacierからの復元方法として、S3バッチオペレーションがあると聞いたので試してみます。

バッチオペレーションについての公式のドキュメントはこちら
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/batch-ops.html

どのような機能かというと、S3上の大規模なデータに対しての特定のアクション(コピーやタグ付け)を行う場合に、LambdaやAWS CLIでコマンドやコードを作りこまなくても、フルマネージドのバッチとして実行可能な機能です。
※S3だけではなくLambdaの呼び出しも可能です。

どのデータのどのバージョンに対してオペレーションを実行するかは、マニフェストファイルに記載し、それをジョブで読み込んで実行します。 ざっくりとしたイメージは以下です。
f:id:live-your-life-dd18:20191223004318p:plain

もう少し詳細に書くと以下のようになります。
ジョブには実行するオペレーションと読み込むマニフェストファイルのパスが設定されており、ジョブを実行すると、ジョブを実行している間1つのオブジェクトに対して1つのタスクが作成され、LambdaまたはS3のAPIオペレーションが実行されます。
f:id:live-your-life-dd18:20191223095709p:plain

実施内容

  • テストデータ作成
  • マニフェストファイル作成・アップロード
  • S3バッチジョブ作成

実施作業

テストデータ作成

今回復元するテストデータを作成し、S3の特定バケットに格納します。
f:id:live-your-life-dd18:20191223004631p:plain

マニフェストファイル作成・アップロード

以下の通りマニフェストファイルを作成します。
マニフェストファイルはバケット名、オブジェクトキー、バージョンID(省略可)の順で記載する必要があります。
※バージョニングを有効化している場合は、バージョンIDを設定する必要があります。
f:id:live-your-life-dd18:20191223004733p:plain

作成できたら、マニフェスト用のS3のバケットにアップロードします。
f:id:live-your-life-dd18:20191223005423p:plain

S3バッチジョブ作成

S3のダッシュボードからバッチオペレーションを選択して、実際にジョブの作成を行っていきます。
f:id:live-your-life-dd18:20191223005107p:plain

ジョブの作成を押下します。
f:id:live-your-life-dd18:20191223005139p:plain

マニフェストの形式をCSVマニフェストオブジェクトへのパスにマニフェストファイルのパスを指定して次へを押下します。
f:id:live-your-life-dd18:20191223005329p:plain

次にマニフェストファイルで指定したオブジェクトに対して、どのようなオペレーションを実行するか指定します。
今回はGlacierからの復元なので、「復元」を選択して復元期間と復元方法を選択して次へを押下します。
f:id:live-your-life-dd18:20191223005746p:plain

レポートは今回はテストのため、出力しないように設定します。
対象オペレーションを実行するのに必要なIAMロールを指定して、次へを押下します。
f:id:live-your-life-dd18:20191223011930p:plain

最後に設定項目を確認して、ジョブの作成ボタンを押下します。
f:id:live-your-life-dd18:20191223010537p:plain
f:id:live-your-life-dd18:20191223010556p:plain

ジョブは作成と同時に実行されます。
何故か失敗したので、原因を確認します。
f:id:live-your-life-dd18:20191223011003p:plain

調べてみると、どうやら指定したIAMロールの信頼関係が足りていないのが原因でした。
そのため信頼関係を追加し、再度ジョブを実行します。
f:id:live-your-life-dd18:20191223012041p:plain

失敗したジョブはコンソール上から再実行できなかったので、ジョブのクローンから同様の設定でジョブを作成しなおしました。
作成後、マニフェストファイルで指定した対象のオブジェクト数を計算し、ステータスが確認待ちに変わります。
f:id:live-your-life-dd18:20191223012228p:plain

確認するジョブにチェックを付けて、「確認して実行」ボタンを押下します。
f:id:live-your-life-dd18:20191223012427p:plain

ジョブの内容やオブジェクト数等を確認して、問題内容であれば「ジョブの実行」ボタンを押下します。
f:id:live-your-life-dd18:20191223012545p:plain
f:id:live-your-life-dd18:20191223012611p:plain
f:id:live-your-life-dd18:20191223012630p:plain

ジョブが完了していることがわかります。(失敗していますが)
f:id:live-your-life-dd18:20191223012915p:plain

原因を確認した結果、マニフェストファイルで指定したオブジェクトキーがファイル単位になっていなかったことが原因っぽかったので、そこを修正して再度実行してみます。

修正後マニフェストファイル
f:id:live-your-life-dd18:20191223092023p:plain

今度は合計失敗率の項目が0%になっていることが確認できました。
f:id:live-your-life-dd18:20191223092714p:plain

対象ファイルがGlacierから復元中になっていることが確認できました。
f:id:live-your-life-dd18:20191223092932p:plain
f:id:live-your-life-dd18:20191223092843p:plain

感想及び所感

敢えてテストした流れのまま書いてみました。
最初はS3のオブジェクト単位ではなく、フォルダ単位で実行できるかと思っていましたが、よくよくドキュメントを読むとオブジェクト単位で指定する必要があることに気づきました。
大規模なS3上のデータに対して同様のオペレーションを実行するためのバッチオペレーション機能ですが、オブジェクト単位で指定する必要があるのは、ちょっと手間ですね。

ジョブを作成するときにS3のインベントリレポートを指定することもできるようですが、そのためにインベントリレポートを作成する必要があるので、さっと特定のオブジェクトに対してやりたいときはかなり手間のように感じます。
できれば特定のフォルダを指定して、まとめて処理できるようになって欲しいですね。

S3インベントリについて
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/storage-inventory.html