4月 8, 2020AWS,S3
概要
はじめに
- 今回はS3 のバージョニングが有効なバケットにおいて、オブジェクトのDelete Markerを削除する方法をご紹介します。簡単に言えば、間違って削除しちゃったファイルを元に戻す方法です。
S3 バージョニングとは
- バージョニングとは、同じバケット内でオブジェクトの複数のバリエーションを保持する機能です。(デフォルトは無効)
- バージョニングを使用して、Amazon S3 バケットに格納されたあらゆるオブジェクトのバージョンを、取得・復元することができます。バージョニングを使用すれば、ユーザーの誤操作やアプリケーション障害からも、復旧可能です。
- バージョニングが有効なバケット内にあるオブジェクトを削除(上書き)しても、そのオブジェクトは削除されません。S3 では、Delete Marker(削除マーカー)を挿入し、オブジェクトを削除したものとして動作します。今回は、Delete Markerを削除して、オブジェクトを復旧する方法を記載しています。
Delete Markerを削除する方法(オブジェクトの復旧)
テスト用オブジェクトの格納
- 前提条件として、S3 バケットのバージョニングを有効とします。
- テスト用のオブジェクトとして、「20200407-1.txt」をアップロードします。オブジェクトの内容は、下記となっています。
12345
- コンソールのバージョンを[非表示]から[表示]に切り替えます。先ほどアップロードしたオブジェクトが"最新バージョン"であり、バージョン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:~$
- 最後に念のため、「20200407-1.txt」のオブジェクトをダウンロードして、元の内容が復元されたことを確認します。
12345
参考資料