S3 バージョニングでDelete Markerを削除する方法

9月 14, 2020AWS,S3

概要

はじめに

  • 今回はS3 のバージョニングが有効なバケットにおいて、オブジェクトのDelete Markerを削除する方法をご紹介します。簡単に言えば、間違って削除しちゃったファイルを元に戻す方法です。
 

S3 バージョニングとは

  • バージョニングとは、同じバケット内でオブジェクトの複数のバリエーションを保持する機能です。(デフォルトは無効)
  • バージョニングを使用して、Amazon S3 バケットに格納されたあらゆるオブジェクトのバージョンを、取得・復元することができます。バージョニングを使用すれば、ユーザーの誤操作やアプリケーション障害からも、復旧可能です。
  • バージョニングが有効なバケット内にあるオブジェクトを削除(上書き)しても、そのオブジェクトは削除されません。S3 では、Delete Marker(削除マーカー)を挿入し、オブジェクトを削除したものとして動作します。今回は、Delete Markerを削除して、オブジェクトを復旧する方法を記載しています。
 

Delete Markerを削除する方法(オブジェクトの復旧)

テスト用オブジェクトの格納

  • 前提条件として、S3 バケットのバージョニングを有効とします。
  • テスト用のオブジェクトとして、「20200407-1.txt」をアップロードします。オブジェクトの内容は、下記となっています。

12345
 
  • S3のコンソールで確認すると、下記となります。
 
  • コンソールのバージョンを[非表示]から[表示]に切り替えます。先ほどアップロードしたオブジェクトが"最新バージョン"であり、バージョンIDが"TcbgI4ALWwxSHWqGnLsJw8tYOFJN3fGz"となっていますね。
 
  • aws cli で確認すると、下記となります。aws s3api list-object-versionsコマンドの結果、"IsLatest": trueのオブジェクトが最新バージョンであり、"VersionId"が"TcbgI4ALWwxSHWqGnLsJw8tYOFJN3fGz"となっています。

niikawa@niikawa1:~$ BUCKET=niikawa-bucket1
niikawa@niikawa1:~$ aws s3 ls s3://${BUCKET}
2020-04-07 22:13:06          5 20200407-1.txt
niikawa@niikawa1:~$ aws s3api list-object-versions --bucket ${BUCKET}
{
    "Versions": [
        {
            "ETag": "\"11111111111111111111111111111111\"",
            "Size": 5,
            "StorageClass": "STANDARD",
            "Key": "20200407-1.txt",
            "VersionId": "TcbgI4ALWwxSHWqGnLsJw8tYOFJN3fGz",
            "IsLatest": true,
            "LastModified": "2020-04-07T13:13:06.000Z",
            "Owner": {
                "DisplayName": "acount-xyz",
                "ID": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
            }
        }
    ]
}
 

テスト用オブジェクトを上書き

  • Delete Markerのテストを行うため、テスト用オブジェクトを上書きします。オブジェクトの内容は、下記となっています。

12345
ABCDE
 
  • S3のコンソールで確認すると、先ほどのオブジェクト(バージョンIDが"TcbgI4ALWwxSHWqGnLsJw8tYOFJN3fGz")から"最新バージョン"の表記が外れました。代わりに、上書きしたオブジェクトが"最新バージョン"となり、バージョンIDが"29_pl1PHluGVq.GGSZ2t0LQMxclQXXDs"となっていることが分かります。
 
  • aws cli で確認すると、下記となります。aws s3api list-object-versionsの結果、"VersionId"が"29_pl1PHluGVq.GGSZ2t0LQMxclQXXDs"のオブジェクトが “IsLatest": true に変わりました。

niikawa@niikawa1:~$ aws s3 ls s3://${BUCKET}
2020-04-07 22:15:48         12 20200407-1.txt
niikawa@niikawa1:~$ aws s3api list-object-versions --bucket ${BUCKET}
{
    "Versions": [
        {
            "ETag": "\"22222222222222222222222222222222\"",
            "Size": 12,
            "StorageClass": "STANDARD",
            "Key": "20200407-1.txt",
            "VersionId": "29_pl1PHluGVq.GGSZ2t0LQMxclQXXDs",
            "IsLatest": true,
            "LastModified": "2020-04-07T13:15:48.000Z",
            "Owner": {
                "DisplayName": "acount-xyz",
                "ID": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
            }
        },
        {
            "ETag": "\"11111111111111111111111111111111\"",
            "Size": 5,
            "StorageClass": "STANDARD",
            "Key": "20200407-1.txt",
            "VersionId": "TcbgI4ALWwxSHWqGnLsJw8tYOFJN3fGz",
            "IsLatest": false,
            "LastModified": "2020-04-07T13:13:06.000Z",
            "Owner": {
                "DisplayName": "acount-xyz",
                "ID": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
            }
        }
    ]
}
 

Delete Markerを削除する

  • ここでようやく本題です。Delete Markerを削除して、上書きする前のオブジェクトを復旧します。
  • aws s3api delete-object –bucketコマンドを使用し、現在 “IsLatest": true となっている"VersionId"が"29_pl1PHluGVq.GGSZ2t0LQMxclQXXDs"のオブジェクトを削除します。
  • 下記の通り、元のオブジェクトである"VersionId"が"TcbgI4ALWwxSHWqGnLsJw8tYOFJN3fGz"のオブジェクトが残り、"IsLatest": true に戻っていることが分かります。

niikawa@niikawa1:~$ KEY=20200407-1.txt
niikawa@niikawa1:~$ aws s3api delete-object --bucket ${BUCKET} --version-id "29_pl1PHluGVq.GGSZ2t0LQMxclQXXDs" --key ${KEY}
{
    "VersionId": "29_pl1PHluGVq.GGSZ2t0LQMxclQXXDs"
}
niikawa@niikawa1:~$ aws s3api list-object-versions --bucket ${BUCKET}
{
    "Versions": [
        {
            "ETag": "\"11111111111111111111111111111111\"",
            "Size": 5,
            "StorageClass": "STANDARD",
            "Key": "20200407-1.txt",
            "VersionId": "TcbgI4ALWwxSHWqGnLsJw8tYOFJN3fGz",
            "IsLatest": true,
            "LastModified": "2020-04-07T13:13:06.000Z",
            "Owner": {
                "DisplayName": "acount-xyz",
                "ID": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
            }
        }
    ]
}
niikawa@niikawa1:~$
 
  • S3のコンソールで確認すると、下記となります。
 
  • 最後に念のため、「20200407-1.txt」のオブジェクトをダウンロードして、元の内容が復元されたことを確認します。

12345
   

参考資料

AWS,S3

Posted by takaaki