AWS S3 バケットでファイルを削除しても、バージョン機能をオンにしていれば、削除キーが追加された状態で、S3 バケットに残り続けます。
今回、削除した S3 バケット内のファイルを一斉に復旧させる必要があったので、クラメソさんブログのサンプルシェルをちょっと改造して実行しました。
クラスメソッドさんのブログはいつもお世話になっております。
しかし、このブログ記事はバケット全体で、特定のフォルダだけを復旧させたい場合には対応していなかったので、シェルスクリプト化してパラメーターを入れて特定フォルダ (prefix) 対応な復旧をできるようにしました。
また、ググったら別の良いシェルスクリプトのサンプルを見つけたので、2番目に追記します。
ファイルの復旧には1オブジェクト1秒ぐらいの時間がかかるので、オブジェクト数が多い Bucket の復旧をする際は、時間がかかるということを覚悟しておいてください。
CLI で一発で行う方法 (クラメソさんの方法)
手順
1. AWS CLI で、IAM User 設定、もしくは EC2 インスタンスに IAM Role を割り当てる
2. 下記のシェルスクリプトをサーバー or ローカルに作成する。
# /bin/bash
BUCKET=$1
PREFIX=$2
aws s3api list-object-versions --bucket $BUCKET\
--bucket ${BUCKET}\
--prefix ${PREFIX}\
--query "DeleteMarkers[?IsLatest==\`true\`].[Key,VersionId]" \
--output text | while read line
do
array=($line)
KEY=${array[0]}
VERID=${array[1]}
aws s3api delete-object\
--bucket ${BUCKET}\
--version-id ${VERID}\
--key ${KEY}
done
3. シェルを実行する。
実行フォーマットはこんな感じです。
$ sh s3-restore.sh [バケット名] [復旧対象パス]
例「katzcurry」 S3 バケットの中の「/curry/images/」フォルダの中の削除マーカーがついたファイルを全部復旧させる場合
$ sh s3-restore.sh katzcurry curry/images/
最初のスラッシュは不要です。
注意
t3.medium なインスタンスで実行したんですが、1秒/ファイルぐらい時間がかかりました。
たくさんファイルがあると時間がかかるようです。
aws-s3-mass-undelete: 順番に作業ファイルを作って行う方法 (ググって見つけた)
ググって見つけたこのシェルスクリプトサンプル、使えます。
指定した日付以降に削除マーカーが付いたファイルのみを復旧させます。
Gist
https://gist.github.com/crazycodr/ef1b6b65cf03350fafbde9d1b56bd637
設定方法
-
gist のファイルを
aws-s3-mass-undelete.sh
というファイル名で任意の場所に保存します -
aws configure
で対象の S3 バケットに権限があるIAMを紐付けます。 -
aws-s3-mass-undelete.sh
のパラメータを変更- BUCKET_NAME に対象のバケットの名をいれます。
- DATE_LIMIT に日時の指定を入れます。おそらく UTC だと思います。(未検証。どなたか確認をお願いします)
-
sh aws-s3-mass-undelete.sh
で実行されます。 -
objects.json
に対象のバケットすべてのファイル (key) 一覧が出力されます。 -
objects.json
をベースに、markers-to-delete.json
に削除キーが最新になっている、削除された状態になっていて、かつ、指定した日時以降のオブジェクトリストだけが抽出されます。 -
markers-to-delete.json
から、undelete.sh
とという、実際にファイルを復元するためのシェルスクリプトが生成されます。 -
undelete.sh
のシェルが実行されます。
以上