🌳

S3で誤ってフォルダごと削除してしまった時の復旧方法

2024/05/13に公開

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