🌳
S3で誤ってフォルダごと削除してしまった時の復旧方法
S3を操作していて、うっかりフォルダ(プレフィックス)ごと削除してしまった場合に一括で復旧させる方法。
シェルスクリプトを使います。
前提条件
対象のバケットにて、バージョニングが有効になっていること
こちらが、大前提条件となります。
バージョニングが有効になっていなかった場合は、、今回は諦めましょう。。
(これを機に重要度の高いファイルについては、バージョニングを有効にしておくとよいです。)
バージョニングを有効にする方法については、コチラをご参照ください。
復旧方法
以下のシェルスクリプトを作成の上、実行します。
#!/bin/bash
# 現在時刻から1時間前の時刻をISO 8601フォーマットで取得
one_hour_ago=$(date -u -d '1 hour ago' +'%Y-%m-%dT%H:%M:%SZ')
# 最新の削除マーカーを全てリストアップ
delete_markers=$(aws s3api list-object-versions --bucket hogefuga --prefix piyo/ --query 'DeleteMarkers[?IsLatest==`true`].[Key, VersionId, LastModified]' --output text)
# 取得した削除マーカーから1時間以内に設定されたものだけを抽出して削除
while IFS=$'\t' read -r key version_id last_modified; do
if [[ "$last_modified" > "$one_hour_ago" ]]; then
echo "Deleting delete marker for $key with version ID $version_id, set at $last_modified"
aws s3api delete-object --bucket hogefuga --key "$key" --version-id "$version_id"
fi
done <<< "$delete_markers"
ファイル名をdelete_deletemarker_of_s3.sh とした場合、実行コマンドは以下
bash delete_deletemarker_of_s3.sh
ざっくり内容を説明すると、最新の削除マーカーを削除するという内容になっています。
削除マーカーの削除によって、削除が取り消され、復旧する感じですね。
過去に意図的に削除したものまで復活してしまわないよう、過去1時間に削除されたもののみを対象とする条件分岐も入れました。
AWS CLIが必要となるので、ローカルから実行する場合はインストールしてください。
AWSコンソールからAmazon CloudShellを起動し、作成したシェルファイルをアップロードして使ってもOK(後者のほうが断然ラクではあります)
上記は、
- バケット名: hogefuga
- フォルダ名(プレフィックス): piyo/
の場合。
対象のバケット名およびフォルダ名(プレフィックス)に書き換えて使ってください。
参考
※今回、スクリプトの実装自体は、ChatGPTにかなりお世話になりました。
Discussion