概要

はじめに

  • 今回は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

参考資料

同じバケット内でオブジェクトの複数のバリアントを保持するには、バージョニングを使用します。
バージョニングされたオブジェクトをバージョン ID を指定せずに削除すると、プレースホルダー (マーカー) が作成され、オブジェクトがまだ存在するにもかかわらず削除されたかのように表示されます。

元記事はこちら

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