CLIを使用してS3のバージョニングを設定し削除したファイルを戻してみる

2020.10.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、S3のバージョニングって便利だなと思っているDA部の下地です。

そんなS3のバージョニングをAWS CLIを使用して実装してみましたのでまとめたいと思います。

全体像

aws s3apiaws s3を使用し以下の手順で実装します(CLIコマンドが使用できるという前提で進めさせてもらいます)。

  1. バケット作成とバージョニングの設定
  2. ファイルのアップロードと削除
  3. objectのバージョンを確認
  4. ファイルを戻す

1. バケット作成とバージョニングの設定

まずはじめに、2010-test-bucketという名前でS3バケットを作成します。作成時に、--create-bucket-configuration LocationConstraintの指定が必要になるのでap-northeast-1を指定します。

$ aws s3api create-bucket --profile プロファイル名 \
--bucket 2010-test-bucket \
--create-bucket-configuration LocationConstraint=ap-northeast-1

{
    "Location": "http://2010-test-bucket.s3.amazonaws.com/"
}

バケットが作成されました。作成したバケットのversioningを有効化するためにs3api put-bucket-versioningを使用します。

$ aws s3api put-bucket-versioning --profile プロファイル名 \
--bucket 2010-test-bucket \
--versioning-configuration Status=Enabled

バケットのバージョニングが有効化されたか確認します。

$ aws s3api get-bucket-versioning --profile プロファイル名 \
--bucket 2010-test-bucket

{
    "Status": "Enabled"
}

有効化されていることを確認しました。

2. ファイルのアップロードと削除

次にバージョニングを有効化したS3バケットに、s3 cpを使用してファイルをアップロードします。

$ aws s3 cp test.txt s3://2010-test-bucket/ --profile プロファイル名
 
upload: ./test.txt to s3://2010-test-bucket/test.txt

s3 lsを使用してバケット内を確認します。

$ aws s3 ls s3://2010-test-bucket/ --profile プロファイル名

2020-10-14 17:22:56         15 test.txt

アップロードしたファイルがあることが確認できました。では、このファイルを削除します。

$ aws s3 rm s3://2010-test-bucket/test.txt --profile プロファイル名

delete: s3://2010-test-bucket/test.txt

バケット内にファイルがないことを確認できました。

$ aws s3 ls s3://2010-test-bucket/ --profile プロファイル名

3. ファイルのバージョンを確認

text.txtはファイルは削除されていますがバージョニングを有効にしているのでファイルのバージョンをs3api list-object-versionsを使用して確認します。

$ aws s3api list-object-versions --profile プロファイル名 \
--bucket 2010-test-bucket \
--prefix test.txt

{
    "Versions": [
        {
            "ETag": "\"ebc92aad19b71192647c7663ecf25f18\"",
            "Size": 15,
            "StorageClass": "STANDARD",
            "Key": "test.txt",
            "VersionId": "VoHF9j08Yp.zys8frvWszurCmYjqAD5l",
            "IsLatest": false,
            "LastModified": "2020-10-14T08:22:56+00:00",
            "Owner": {
                "DisplayName": "spare-0340",
                "ID": "768f6050502b8ce1417048ad447ef58a7357f088ff070255f1041259028d393d"
            }
        }
    ],
    "DeleteMarkers": [
        {
            "Owner": {
                "DisplayName": "spare-0340",
                "ID": "768f6050502b8ce1417048ad447ef58a7357f088ff070255f1041259028d393d"
            },
            "Key": "test.txt",
            "VersionId": "N3a0VLfBZRMXDAand3KSErfLFwFuOcOF",
            "IsLatest": true,
            "LastModified": "2020-10-14T08:26:17+00:00"
        }
    ]
}

VersionsとDeleteMarkerの2つがあります。

4. ファイルを戻す

先ほど確認したDeleteMarkerを削除するとファイルが削除される前の状態に戻りますので、DeleteMarkerのVersionIdを指定し削除します。削除する際にはs3api delete-objectを使用します。

aws s3api delete-object --profile プロファイル名 \
--bucket 2010-test-bucket \
--key 2010_versioning/test.txt \
--version-id N3a0VLfBZRMXDAand3KSErfLFwFuOcOF

{
    "DeleteMarker": true,
    "VersionId": "N3a0VLfBZRMXDAand3KSErfLFwFuOcOF"
}

ではdeleteマーカーを削除しましたので、ファイルがあるか確認します。

aws s3 ls s3://2010-test-bucket/ --profile プロファイル名

2020-10-14 17:22:56         15 test.txt

削除したファイルが戻ったことが確認できました!

まとめ

S3のバージョニングはとても便利だなと実感したのでCLIを使用して実装しました。この記事がどなたかの助けになれば幸いです。

参考リンク