3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AWS S3 で削除したファイルを復旧させる方法 (削除マーカーを削除する方法)

Last updated at Posted at 2020-06-17

AWS S3 バケットでファイルを削除しても、バージョン機能をオンにしていれば、削除キーが追加された状態で、S3 バケットに残り続けます。

今回、削除した S3 バケット内のファイルを一斉に復旧させる必要があったので、クラメソさんブログのサンプルシェルをちょっと改造して実行しました。

クラスメソッドさんのブログはいつもお世話になっております。

しかし、このブログ記事はバケット全体で、特定のフォルダだけを復旧させたい場合には対応していなかったので、シェルスクリプト化してパラメーターを入れて特定フォルダ (prefix) 対応な復旧をできるようにしました。

また、ググったら別の良いシェルスクリプトのサンプルを見つけたので、2番目に追記します。

ファイルの復旧には1オブジェクト1秒ぐらいの時間がかかるので、オブジェクト数が多い Bucket の復旧をする際は、時間がかかるということを覚悟しておいてください。

CLI で一発で行う方法 (クラメソさんの方法)

手順

1. AWS CLI で、IAM User 設定、もしくは EC2 インスタンスに IAM Role を割り当てる

2. 下記のシェルスクリプトをサーバー or ローカルに作成する。

s3-restore.sh
# /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 のシェルが実行されます。

以上

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?