経緯
Glacierからの復元方法として、S3バッチオペレーションがあると聞いたので試してみます。
バッチオペレーションについての公式のドキュメントはこちら
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/batch-ops.html
どのような機能かというと、S3上の大規模なデータに対しての特定のアクション(コピーやタグ付け)を行う場合に、LambdaやAWS CLIでコマンドやコードを作りこまなくても、フルマネージドのバッチとして実行可能な機能です。
※S3だけではなくLambdaの呼び出しも可能です。
どのデータのどのバージョンに対してオペレーションを実行するかは、マニフェストファイルに記載し、それをジョブで読み込んで実行します。
ざっくりとしたイメージは以下です。
もう少し詳細に書くと以下のようになります。
ジョブには実行するオペレーションと読み込むマニフェストファイルのパスが設定されており、ジョブを実行すると、ジョブを実行している間1つのオブジェクトに対して1つのタスクが作成され、LambdaまたはS3のAPIオペレーションが実行されます。
実施内容
- テストデータ作成
- マニフェストファイル作成・アップロード
- S3バッチジョブ作成
実施作業
テストデータ作成
今回復元するテストデータを作成し、S3の特定バケットに格納します。
マニフェストファイル作成・アップロード
以下の通りマニフェストファイルを作成します。
マニフェストファイルはバケット名、オブジェクトキー、バージョンID(省略可)の順で記載する必要があります。
※バージョニングを有効化している場合は、バージョンIDを設定する必要があります。
作成できたら、マニフェスト用のS3のバケットにアップロードします。
S3バッチジョブ作成
S3のダッシュボードからバッチオペレーションを選択して、実際にジョブの作成を行っていきます。
ジョブの作成を押下します。
マニフェストの形式をCSV、マニフェストオブジェクトへのパスにマニフェストファイルのパスを指定して次へを押下します。
次にマニフェストファイルで指定したオブジェクトに対して、どのようなオペレーションを実行するか指定します。
今回はGlacierからの復元なので、「復元」を選択して復元期間と復元方法を選択して次へを押下します。
レポートは今回はテストのため、出力しないように設定します。
対象オペレーションを実行するのに必要なIAMロールを指定して、次へを押下します。
最後に設定項目を確認して、ジョブの作成ボタンを押下します。
ジョブは作成と同時に実行されます。
何故か失敗したので、原因を確認します。
調べてみると、どうやら指定したIAMロールの信頼関係が足りていないのが原因でした。
そのため信頼関係を追加し、再度ジョブを実行します。
失敗したジョブはコンソール上から再実行できなかったので、ジョブのクローンから同様の設定でジョブを作成しなおしました。
作成後、マニフェストファイルで指定した対象のオブジェクト数を計算し、ステータスが確認待ちに変わります。
確認するジョブにチェックを付けて、「確認して実行」ボタンを押下します。
ジョブの内容やオブジェクト数等を確認して、問題内容であれば「ジョブの実行」ボタンを押下します。
ジョブが完了していることがわかります。(失敗していますが)
原因を確認した結果、マニフェストファイルで指定したオブジェクトキーがファイル単位になっていなかったことが原因っぽかったので、そこを修正して再度実行してみます。
修正後マニフェストファイル
今度は合計失敗率の項目が0%になっていることが確認できました。
対象ファイルがGlacierから復元中になっていることが確認できました。
感想及び所感
敢えてテストした流れのまま書いてみました。
最初はS3のオブジェクト単位ではなく、フォルダ単位で実行できるかと思っていましたが、よくよくドキュメントを読むとオブジェクト単位で指定する必要があることに気づきました。
大規模なS3上のデータに対して同様のオペレーションを実行するためのバッチオペレーション機能ですが、オブジェクト単位で指定する必要があるのは、ちょっと手間ですね。
ジョブを作成するときにS3のインベントリレポートを指定することもできるようですが、そのためにインベントリレポートを作成する必要があるので、さっと特定のオブジェクトに対してやりたいときはかなり手間のように感じます。
できれば特定のフォルダを指定して、まとめて処理できるようになって欲しいですね。
S3インベントリについて
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/storage-inventory.html