のぴぴのメモ

自分用のLinuxとかの技術メモ

Amazon S3のバケットのバージョニング設定とオブジェクトのバージョンの遷移を確認してみた

はじめに

バケットのバージョニング設定により、オブジェクトのバージョンがどのように遷移するのかがいまいちわかっていなかったので、実際に動かして整理してみました。

まとめ

  • バケットのバージョニング未設定の場合、オブジェクトのVersionIdはnullになる
  • バージョニングを有効化した後は
    • 既存オブジェクトのVersionIdはnullのまま
    • バージョニング有効化後にPUTしたオブジェクトには、VersionIdに一意のIDが付与
  • バージョニングをサスペンドした後は
    • サスペンド後にPUTしたオブジェクトのVersionIdは、nullになる
    • 既存でVersionIdがnullのオブジェクトが存在する場合、そのオブジェクトが更新される
    • 既存にVersionIdがnullのオブジェクトが存在しない場合は、新規にVersionIdがnullのオブジェクトが作成される

バージョニング有効化前から存在するオブジェクトのバージョン遷移

f:id:nopipi:20200601164859p:plain:w600

バージョニング有効化後に新規にPUTしたオブジェクトのバージョン遷移

f:id:nopipi:20200601165631p:plain:w600

確認手順と結果

事前準備

#プロファイル指定
PROFILE=default #他のプロファイルを利用する場合はここを変更

#検証用バケットの設定用パラメータ
BUCKET_NAME="versioning-test-bucket-$( od -vAn -to1 </dev/urandom  | tr -d " " | fold -w 10 | head -n 1)"
REGION=$(aws --profile ${PROFILE} configure get region)

#テストデータ生成
dd if=/dev/urandom of=test-data-1.dat bs=4096 count=1
dd if=/dev/urandom of=test-data-2.dat bs=4096 count=2
dd if=/dev/urandom of=test-data-3.dat bs=4096 count=3

ls -l test*

バケットの作成

#バケット作成
aws --profile ${PROFILE} \
    s3api create-bucket \
        --bucket ${BUCKET_NAME} \
        --create-bucket-configuration LocationConstraint=${REGION};

#バージョン設定の確認
#未設定なので何もレスポンスが無いはずです。
aws --profile ${PROFILE} s3api get-bucket-versioning --bucket "${BUCKET_NAME}"

#データが空であることを確認
aws --profile ${PROFILE} s3 ls "s3://${BUCKET_NAME}"

バージョニング未設定時のオブジェクト確認

オブジェクトをPUTする
#バージョニングを設定していない状態でS3にデータを確認
aws --profile ${PROFILE} s3 cp test-data-1.dat s3://${BUCKET_NAME}/userdata01.dat
aws --profile ${PROFILE} s3 cp test-data-1.dat s3://${BUCKET_NAME}/userdata02.dat
状態を確認する

(1) オブジェクトの一覧表示
PUTした2つのオブジェクトが表示されます。

aws --profile ${PROFILE} s3 ls "s3://${BUCKET_NAME}"
2020-05-31 18:49:51       4096 userdata01.dat
2020-05-31 18:49:52       4096 userdata02.dat

(2) オブジェクトのバージョン確認
バケットに対してバージョニングが未設定の状態でオブジェクトをPUTしているため、userdata01.dat、userdata02.datともVersionIdは"null"になります。

Object 投入タイミング 更新時間 VersionID IsLatest
userdata01.dat Versioning設定前 09:49:51 null true
userdata02.dat Versioning設定前 09:49:52 null true
aws --profile ${PROFILE} s3api list-object-versions --bucket ${BUCKET_NAME}
{
    "Versions": [
        {
            "ETag": "\"dadc49ab6df3592cca0ce5edd9e03886\"",
            "Size": 4096,
            "StorageClass": "STANDARD",
            "Key": "userdata01.dat",
            "VersionId": "null",
            "IsLatest": true,
            "LastModified": "2020-05-31T09:49:51.000Z",
            "Owner": {
                "DisplayName": "nobuyuf",
                "ID": "135708a85354d2fa2c74a4f52b3a2256c9ce912005f4677f36fd73af25be2793"
            }
        },
        {
            "ETag": "\"dadc49ab6df3592cca0ce5edd9e03886\"",
            "Size": 4096,
            "StorageClass": "STANDARD",
            "Key": "userdata02.dat",
            "VersionId": "null",
            "IsLatest": true,
            "LastModified": "2020-05-31T09:49:52.000Z",
            "Owner": {
                "DisplayName": "nobuyuf",
                "ID": "135708a85354d2fa2c74a4f52b3a2256c9ce912005f4677f36fd73af25be2793"
            }
        }
    ]
}

バージョニング有効化

バケットに対してバージョニングを有効にします。

バージョニング有効化設定
aws --profile ${PROFILE} s3api \
    put-bucket-versioning \
        --bucket "${BUCKET_NAME}" --versioning-configuration Status=Enabled;
設定の確認
aws --profile ${PROFILE} s3api get-bucket-versioning --bucket "${BUCKET_NAME}"
{
    "Status": "Enabled"
}

バージョニング有効後にPUTしたオブジェクト確認

  • 既存のuserdata02.datに新たなファイルをPUTします
  • 新規にuserdata03.datをPUTします
データの投入
aws --profile ${PROFILE} s3 cp test-data-2.dat s3://${BUCKET_NAME}/userdata02.dat
aws --profile ${PROFILE} s3 cp test-data-2.dat s3://${BUCKET_NAME}/userdata03.dat
状態を確認する

(1) オブジェクトの一覧表示
userdata02.datが更新され、新規にuserdata03.datが追加され、合計3つのオブジェクトが表示されます。

aws --profile ${PROFILE} s3 ls "s3://${BUCKET_NAME}"
2020-05-31 18:49:51       4096 userdata01.dat
2020-06-01 14:52:14       8192 userdata02.dat
2020-06-01 14:52:16       8192 userdata03.dat

(2) オブジェクトのバージョン確認

  • バージョニング設定前のオブジェクトは、VersionIDがnullのまま
  • userdata02.datは、既存のオブジェクトIsLatestがfalseに変更
Object 投入タイミング 更新時間 VersionID IsLatest メモ
userdata01.dat Versioning設定前 09:49:51 null true 更新なし
userdata02.dat Versioning設定後(1) 05:52:14 0qDa.... true 新規追加
userdata02.dat Versioning設定前 09:49:52 null false LsLatestがfalseに変更
userdata03.dat Versioning設定後(1) 05:52:16 TX.M.... true 新規追加
aws --profile ${PROFILE} s3api list-object-versions --bucket ${BUCKET_NAME}
{
    "Versions": [
        {
            "ETag": "\"dadc49ab6df3592cca0ce5edd9e03886\"",
            "Size": 4096,
            "StorageClass": "STANDARD",
            "Key": "userdata01.dat",
            "VersionId": "null",
            "IsLatest": true,
            "LastModified": "2020-05-31T09:49:51.000Z",
            "Owner": {
                "DisplayName": "nobuyuf",
                "ID": "135708a85354d2fa2c74a4f52b3a2256c9ce912005f4677f36fd73af25be2793"
            }
        },
        {
            "ETag": "\"a41d74143fff00d45a6b9997e400a32a\"",
            "Size": 8192,
            "StorageClass": "STANDARD",
            "Key": "userdata02.dat",
            "VersionId": "0qDa2pi27gEqqGOdQhK5UVJVcBj_drRr",
            "IsLatest": true,
            "LastModified": "2020-06-01T05:52:14.000Z",
            "Owner": {
                "DisplayName": "nobuyuf",
                "ID": "135708a85354d2fa2c74a4f52b3a2256c9ce912005f4677f36fd73af25be2793"
            }
        },
        {
            "ETag": "\"dadc49ab6df3592cca0ce5edd9e03886\"",
            "Size": 4096,
            "StorageClass": "STANDARD",
            "Key": "userdata02.dat",
            "VersionId": "null",
            "IsLatest": false,
            "LastModified": "2020-05-31T09:49:52.000Z",
            "Owner": {
                "DisplayName": "nobuyuf",
                "ID": "135708a85354d2fa2c74a4f52b3a2256c9ce912005f4677f36fd73af25be2793"
            }
        },
        {
            "ETag": "\"a41d74143fff00d45a6b9997e400a32a\"",
            "Size": 8192,
            "StorageClass": "STANDARD",
            "Key": "userdata03.dat",
            "VersionId": "TX.MGfR96qMJ4mrIFBT61d8.Bs5McjzB",
            "IsLatest": true,
            "LastModified": "2020-06-01T05:52:16.000Z",
            "Owner": {
                "DisplayName": "nobuyuf",
                "ID": "135708a85354d2fa2c74a4f52b3a2256c9ce912005f4677f36fd73af25be2793"
            }
        }
    ]
}

もう一度オブジェクトをPUTし確認

データを投入
aws --profile ${PROFILE} s3 cp test-data-3.dat s3://${BUCKET_NAME}/userdata02.dat
aws --profile ${PROFILE} s3 cp test-data-3.dat s3://${BUCKET_NAME}/userdata03.dat
状態を確認する

(1) オブジェクトの一覧表示
userdata02.datとuserdata03.datが更新され、同じく3つのオブジェクトが表示されます。

aws --profile ${PROFILE} s3 ls "s3://${BUCKET_NAME}"
2020-05-31 18:49:51       4096 userdata01.dat
2020-06-01 15:27:39      12288 userdata02.dat
2020-06-01 15:27:41      12288 userdata03.dat

(2) オブジェクトのバージョン確認

  • userdata02.datとuserdata03.datで、IsLatestがtrueのオブジェクトが追加され、既存オブジェクトはLsLatestがfalseに変更
Object 投入タイミング 更新時間 VersionID IsLatest メモ
userdata01.dat Versioning設定前 09:49:51 null true 更新なし
userdata02.dat Versioning設定後(2) 06:27:39 Um.k.... true 新規追加
userdata02.dat Versioning設定後(1) 05:52:14 0qDa.... false LsLatestがfalseに変更
userdata02.dat Versioning設定前 09:49:52 null false 更新なし
userdata03.dat Versioning設定後(2) 06:27:41 WZ8d.... true 新規追加
userdata03.dat Versioning設定後(1) 05:52:16 TX.M.... false LsLatestがfalseに変更
aws --profile ${PROFILE} s3api list-object-versions --bucket ${BUCKET_NAME}
{
    "Versions": [
        {
            "ETag": "\"dadc49ab6df3592cca0ce5edd9e03886\"",
            "Size": 4096,
            "StorageClass": "STANDARD",
            "Key": "userdata01.dat",
            "VersionId": "null",
            "IsLatest": true,
            "LastModified": "2020-05-31T09:49:51.000Z",
            "Owner": {
                "DisplayName": "nobuyuf",
                "ID": "135708a85354d2fa2c74a4f52b3a2256c9ce912005f4677f36fd73af25be2793"
            }
        },
        {
            "ETag": "\"c3cfd43243650a7c2095f744d1ad796e\"",
            "Size": 12288,
            "StorageClass": "STANDARD",
            "Key": "userdata02.dat",
            "VersionId": "Um.kAFeAkaayk3botsDRJmyvLQp6dUZr",
            "IsLatest": true,
            "LastModified": "2020-06-01T06:27:39.000Z",
            "Owner": {
                "DisplayName": "nobuyuf",
                "ID": "135708a85354d2fa2c74a4f52b3a2256c9ce912005f4677f36fd73af25be2793"
            }
        },
        {
            "ETag": "\"a41d74143fff00d45a6b9997e400a32a\"",
            "Size": 8192,
            "StorageClass": "STANDARD",
            "Key": "userdata02.dat",
            "VersionId": "0qDa2pi27gEqqGOdQhK5UVJVcBj_drRr",
            "IsLatest": false,
            "LastModified": "2020-06-01T05:52:14.000Z",
            "Owner": {
                "DisplayName": "nobuyuf",
                "ID": "135708a85354d2fa2c74a4f52b3a2256c9ce912005f4677f36fd73af25be2793"
            }
        },
        {
            "ETag": "\"dadc49ab6df3592cca0ce5edd9e03886\"",
            "Size": 4096,
            "StorageClass": "STANDARD",
            "Key": "userdata02.dat",
            "VersionId": "null",
            "IsLatest": false,
            "LastModified": "2020-05-31T09:49:52.000Z",
            "Owner": {
                "DisplayName": "nobuyuf",
                "ID": "135708a85354d2fa2c74a4f52b3a2256c9ce912005f4677f36fd73af25be2793"
            }
        },
        {
            "ETag": "\"c3cfd43243650a7c2095f744d1ad796e\"",
            "Size": 12288,
            "StorageClass": "STANDARD",
            "Key": "userdata03.dat",
            "VersionId": "WZ8dIE4sY1OzI1h6lCzESy_.W33I4xtt",
            "IsLatest": true,
            "LastModified": "2020-06-01T06:27:41.000Z",
            "Owner": {
                "DisplayName": "nobuyuf",
                "ID": "135708a85354d2fa2c74a4f52b3a2256c9ce912005f4677f36fd73af25be2793"
            }
        },
        {
            "ETag": "\"a41d74143fff00d45a6b9997e400a32a\"",
            "Size": 8192,
            "StorageClass": "STANDARD",
            "Key": "userdata03.dat",
            "VersionId": "TX.MGfR96qMJ4mrIFBT61d8.Bs5McjzB",
            "IsLatest": false,
            "LastModified": "2020-06-01T05:52:16.000Z",
            "Owner": {
                "DisplayName": "nobuyuf",
                "ID": "135708a85354d2fa2c74a4f52b3a2256c9ce912005f4677f36fd73af25be2793"
            }
        }
    ]
}

バージョニング をsuspend

バケットのバージョニングをsuspendします。

バージョニングのsuspend設定
aws --profile ${PROFILE} s3api \
    put-bucket-versioning \
        --bucket "${BUCKET_NAME}" --versioning-configuration Status=Suspended;
設定の確認
aws --profile ${PROFILE} s3api get-bucket-versioning --bucket "${BUCKET_NAME}"
{
    "Status": "Suspended"
}

Suspended状態でオブジェクトをPUTし確認

データを投入
aws --profile ${PROFILE} s3 cp test-data-3.dat s3://${BUCKET_NAME}/userdata02.dat
aws --profile ${PROFILE} s3 cp test-data-3.dat s3://${BUCKET_NAME}/userdata03.dat
状態を確認する

(1) オブジェクトの一覧表示
userdata02.datとuserdata03.datが更新され、同じく3つのオブジェクトが表示されます。

aws --profile ${PROFILE} s3 ls "s3://${BUCKET_NAME}"
2020-05-31 18:49:51       4096 userdata01.dat
2020-06-01 15:46:08      12288 userdata02.dat
2020-06-01 15:46:10      12288 userdata03.dat

(2) オブジェクトのバージョン確認

Object 投入タイミング 更新時間 VersionID IsLatest メモ
userdata01.dat Versioning設定前 09:49:51 null true 更新なし
userdata02.dat Suspended状態 06:46:08 null true 既存のnullバージョンのものを更新
userdata02.dat Versioning設定後(2) 06:27:39 Um.k.... false LsLatestがfalseに変更
userdata02.dat Versioning設定後(1) 05:52:14 0qDa.... false 更新なし
userdata02.dat Versioning設定前 - - - 上書き更新され消滅
userdata03.dat Suspended状態 T06:46:10 null true 新規追加
userdata03.dat Versioning設定後(2) 06:27:41 WZ8d.... false LsLatestがfalseに変更
userdata03.dat Versioning設定後(1) 05:52:16 TX.M.... false 更新なし
aws --profile ${PROFILE} s3api list-object-versions --bucket ${BUCKET_NAME}
{
    "Versions": [
        {
            "ETag": "\"dadc49ab6df3592cca0ce5edd9e03886\"",
            "Size": 4096,
            "StorageClass": "STANDARD",
            "Key": "userdata01.dat",
            "VersionId": "null",
            "IsLatest": true,
            "LastModified": "2020-05-31T09:49:51.000Z",
            "Owner": {
                "DisplayName": "nobuyuf",
                "ID": "135708a85354d2fa2c74a4f52b3a2256c9ce912005f4677f36fd73af25be2793"
            }
        },
        {
            "ETag": "\"c3cfd43243650a7c2095f744d1ad796e\"",
            "Size": 12288,
            "StorageClass": "STANDARD",
            "Key": "userdata02.dat",
            "VersionId": "null",
            "IsLatest": true,
            "LastModified": "2020-06-01T06:46:08.000Z",
            "Owner": {
                "DisplayName": "nobuyuf",
                "ID": "135708a85354d2fa2c74a4f52b3a2256c9ce912005f4677f36fd73af25be2793"
            }
        },
        {
            "ETag": "\"c3cfd43243650a7c2095f744d1ad796e\"",
            "Size": 12288,
            "StorageClass": "STANDARD",
            "Key": "userdata02.dat",
            "VersionId": "Um.kAFeAkaayk3botsDRJmyvLQp6dUZr",
            "IsLatest": false,
            "LastModified": "2020-06-01T06:27:39.000Z",
            "Owner": {
                "DisplayName": "nobuyuf",
                "ID": "135708a85354d2fa2c74a4f52b3a2256c9ce912005f4677f36fd73af25be2793"
            }
        },
        {
            "ETag": "\"a41d74143fff00d45a6b9997e400a32a\"",
            "Size": 8192,
            "StorageClass": "STANDARD",
            "Key": "userdata02.dat",
            "VersionId": "0qDa2pi27gEqqGOdQhK5UVJVcBj_drRr",
            "IsLatest": false,
            "LastModified": "2020-06-01T05:52:14.000Z",
            "Owner": {
                "DisplayName": "nobuyuf",
                "ID": "135708a85354d2fa2c74a4f52b3a2256c9ce912005f4677f36fd73af25be2793"
            }
        },
        {
            "ETag": "\"c3cfd43243650a7c2095f744d1ad796e\"",
            "Size": 12288,
            "StorageClass": "STANDARD",
            "Key": "userdata03.dat",
            "VersionId": "null",
            "IsLatest": true,
            "LastModified": "2020-06-01T06:46:10.000Z",
            "Owner": {
                "DisplayName": "nobuyuf",
                "ID": "135708a85354d2fa2c74a4f52b3a2256c9ce912005f4677f36fd73af25be2793"
            }
        },
        {
            "ETag": "\"c3cfd43243650a7c2095f744d1ad796e\"",
            "Size": 12288,
            "StorageClass": "STANDARD",
            "Key": "userdata03.dat",
            "VersionId": "WZ8dIE4sY1OzI1h6lCzESy_.W33I4xtt",
            "IsLatest": false,
            "LastModified": "2020-06-01T06:27:41.000Z",
            "Owner": {
                "DisplayName": "nobuyuf",
                "ID": "135708a85354d2fa2c74a4f52b3a2256c9ce912005f4677f36fd73af25be2793"
            }
        },
        {
            "ETag": "\"a41d74143fff00d45a6b9997e400a32a\"",
            "Size": 8192,
            "StorageClass": "STANDARD",
            "Key": "userdata03.dat",
            "VersionId": "TX.MGfR96qMJ4mrIFBT61d8.Bs5McjzB",
            "IsLatest": false,
            "LastModified": "2020-06-01T05:52:16.000Z",
            "Owner": {
                "DisplayName": "nobuyuf",
                "ID": "135708a85354d2fa2c74a4f52b3a2256c9ce912005f4677f36fd73af25be2793"
            }
        }
    ]
}

検証データのクリーンナップ

オブジェクトの削除
# 削除マーカーがついているオブジェクトの削除
aws --profile ${PROFILE} --output text \
      s3api list-object-versions \
        --bucket ${BUCKET_NAME} \
    --query 'DeleteMarkers[].{Key:Key,VersionId:VersionId}' | while read key versionid
do
    aws --profile ${PROFILE} \
        s3api delete-object \
            --bucket ${BUCKET_NAME} \
            --key ${key} \
            --version-id ${versionid}
done 

# それ以外のオブジェクトの削除
aws --profile ${PROFILE} --output text \
      s3api list-object-versions \
        --bucket ${BUCKET_NAME} \
    --query 'Versions[].{Key:Key,VersionId:VersionId}' | while read key versionid
do
    aws --profile ${PROFILE} \
        s3api delete-object \
            --bucket ${BUCKET_NAME} \
            --key ${key} \
            --version-id ${versionid}
done 
バケットの削除
aws --profile ${PROFILE} \
    s3api delete-bucket \
        --bucket "${BUCKET_NAME}"