はじめに
バケットのバージョニング設定により、オブジェクトのバージョンがどのように遷移するのかがいまいちわかっていなかったので、実際に動かして整理してみました。
まとめ
- バケットのバージョニング未設定の場合、オブジェクトのVersionIdは
null
になる - バージョニングを有効化した後は
- 既存オブジェクトのVersionIdは
null
のまま - バージョニング有効化後にPUTしたオブジェクトには、VersionIdに一意のIDが付与
- 既存オブジェクトのVersionIdは
- バージョニングをサスペンドした後は
- サスペンド後にPUTしたオブジェクトのVersionIdは、
null
になる - 既存でVersionIdが
null
のオブジェクトが存在する場合、そのオブジェクトが更新される - 既存にVersionIdが
null
のオブジェクトが存在しない場合は、新規にVersionIdがnull
のオブジェクトが作成される
- サスペンド後にPUTしたオブジェクトのVersionIdは、
バージョニング有効化前から存在するオブジェクトのバージョン遷移
バージョニング有効化後に新規にPUTしたオブジェクトのバージョン遷移
確認手順と結果
事前準備
#プロファイル指定 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}"