💬

Amazon S3 バージョニングをAWS CLIで検証

2024/08/18に公開

はじめに

本ページは個人の勉強で使用することを目的に作成しておりますが、記載の誤り等が含まれる場合がございます。
最新の情報についてはAWS公式ドキュメントをご参照ください。

やること

  • バージョニング無効・有効・停止状態のS3バケットにAWS CLIで挙動を検証する。
種別 設定値
S3バケット mori-s3-versioning-test
実行環境 AWS CloudShell
AWS CLI aws-cli/2.17.26


  • S3バケットのバージョニングについては下記を参照。

https://zenn.dev/smori/articles/37506a6ce2a147

バージョニング無効

オブジェクトのアップロード

  1. sample.txtを用意してバケットにアップロード
$ cat sample.txt 
version_1

# オブジェクトをアップロード
$ aws s3 cp sample.txt s3://mori-s3-versioning-test/
upload: ./sample.txt to s3://mori-s3-versioning-test/sample.txt
  1. オブジェクトのバージョンIDを確認
  • バージョンID:nullが付与されます。
# オブジェクトの一覧を取得
$ aws s3api list-object-versions --bucket mori-s3-versioning-test
{
    "Versions": [
        {
            "ETag": "\"ad493b7e55b6efc3e7be8e1a2ed7f579\"",
            "Size": 10,
            "StorageClass": "STANDARD",
            "Key": "sample.txt",
            "VersionId": "null",
            "IsLatest": true,
            "LastModified": "2024-08-17T15:05:12+00:00",
            "Owner": {
                "DisplayName": "${所有者の表示名称}",
                "ID": "${所有者のID}"
            }
        }
    ],
    "RequestCharged": null
}

※S3コンソール上からバージョンIDは確認できない。

オブジェクトの更新

  1. sample.txtの内容を更新してバケットにアップロード
$ cat sample.txt 
version_2

$ aws s3 cp sample.txt s3://mori-s3-versioning-test/
upload: ./sample.txt to s3://mori-s3-versioning-test/sample.txt
  1. オブジェクトの読み取り
  • オブジェクトの内容を読み取る。
$ aws s3 cp s3://mori-s3-versioning-test/sample.txt -
version_2

5.オブジェクトのバージョンIDを確認

  • バージョンID:nullのオブジェクトを1つのみ保持している。
# オブジェクトの一覧を取得
$ aws s3api list-object-versions --bucket mori-s3-versioning-test
{
    "Versions": [
        {
            "ETag": "\"43130fb6bee07968d2e81121256dc2d6\"",
            "Size": 10,
            "StorageClass": "STANDARD",
            "Key": "sample.txt",
            "VersionId": "null",
            "IsLatest": true,
            "LastModified": "2024-08-18T01:26:26+00:00",
            "Owner": {
                "DisplayName": "${所有者の表示名称}",
                "ID": "${所有者のID}"
            }
        }
    ],
    "RequestCharged": null
}

オブジェクトの削除

  1. オブジェクトを削除
$ aws s3 rm s3://mori-s3-versioning-test/sample.txt
delete: s3://mori-s3-versioning-test/sample.txt
  1. オブジェクトが完全に削除された事を確認
$ aws s3api list-object-versions --bucket mori-s3-versioning-test
{
    "RequestCharged": null
}

バージョニング有効

オブジェクトのアップロード

  1. バケットのバージョニングを有効化
# バージョニングを有効化
$ aws s3api put-bucket-versioning --bucket mori-s3-versioning-test --versioning-configuration Status=Enabled

# バージョニング設定を取得
$ aws s3api get-bucket-versioning --bucket mori-s3-versioning-test
{
    "Status": "Enabled"
}
  1. sample.txtを用意してバケットにアップロード
$ cat sample.txt 
version_1

$ aws s3 cp sample.txt s3://mori-s3-versioning-test/
upload: ./sample.txt to s3://mori-s3-versioning-test/sample.txt
  1. オブジェクトのバージョンIDを確認
  • バージョンIDが付与されている
$ aws s3api list-object-versions --bucket mori-s3-versioning-test
{
    "Versions": [
        {
            "ETag": "\"ad493b7e55b6efc3e7be8e1a2ed7f579\"",
            "Size": 10,
            "StorageClass": "STANDARD",
            "Key": "sample.txt",
            "VersionId": "r9i1RnKE0a16V5dIJjOUWWxhodGk7Jyh",
            "IsLatest": true,
            "LastModified": "2024-08-18T01:47:11+00:00",
            "Owner": {
                "DisplayName": "${所有者の表示名称}",
                "ID": "${所有者のID}"
            }
        }
    ],
    "RequestCharged": null
}

オブジェクトの更新

  1. sample.txtの内容を更新してバケットにアップロード
$ cat sample.txt 
version_2

# オブジェクトをアップロード
$ aws s3 cp sample.txt s3://mori-s3-versioning-test/
upload: ./sample.txt to s3://mori-s3-versioning-test/sample.txt
  1. オブジェクトIDを確認
  • 上書きされず、複数のバージョンを保持している。
# オブジェクトの一覧を取得
$ aws s3api list-object-versions --bucket mori-s3-versioning-test
{
    "Versions": [
        {
            "ETag": "\"43130fb6bee07968d2e81121256dc2d6\"",
            "Size": 10,
            "StorageClass": "STANDARD",
            "Key": "sample.txt",
            "VersionId": "wEOThRs4I.dDlIzZnDokqCX1wMeFSqAT",
            "IsLatest": true,
            "LastModified": "2024-08-18T01:53:04+00:00",
            "Owner": {
                "DisplayName": "${所有者の表示名称}",
                "ID": "${所有者のID}"
            }
        },
        {
            "ETag": "\"ad493b7e55b6efc3e7be8e1a2ed7f579\"",
            "Size": 10,
            "StorageClass": "STANDARD",
            "Key": "sample.txt",
            "VersionId": "r9i1RnKE0a16V5dIJjOUWWxhodGk7Jyh",
            "IsLatest": false,
            "LastModified": "2024-08-18T01:47:11+00:00",
            "Owner": {
                "DisplayName": "${所有者の表示名称}",
                "ID": "${所有者のID}"
            }
        }
    ],
    "RequestCharged": null
}

※S3コンソールでの表示

オブジェクトの読み取り

  1. オブジェクトの内容を読み取り
  • バージョンIDを指定しない場合、現行バージョンを読み取る。
# オブジェクトの読み取り
$ aws s3 cp s3://mori-s3-versioning-test/sample.txt -
version_2
  1. オブジェクトを削除後、オブジェクトのバージョンIDを取得
  • "DeleteMarkers"(削除マーカー) が挿入される。
# オブジェクトの削除
$ aws s3 rm s3://mori-s3-versioning-test/sample.txt
delete: s3://mori-s3-versioning-test/sample.txt

# オブジェクトの一覧を取得
$ aws s3api list-object-versions --bucket mori-s3-versioning-test
{
    "Versions": [
        {
            "ETag": "\"43130fb6bee07968d2e81121256dc2d6\"",
            "Size": 10,
            "StorageClass": "STANDARD",
            "Key": "sample.txt",
            "VersionId": "wEOThRs4I.dDlIzZnDokqCX1wMeFSqAT",
            "IsLatest": false,
            "LastModified": "2024-08-18T01:53:04+00:00",
            "Owner": {
                "DisplayName": "${所有者の表示名称}",
                "ID": "${所有者のID}"
            }
        },
        {
            "ETag": "\"ad493b7e55b6efc3e7be8e1a2ed7f579\"",
            "Size": 10,
            "StorageClass": "STANDARD",
            "Key": "sample.txt",
            "VersionId": "r9i1RnKE0a16V5dIJjOUWWxhodGk7Jyh",
            "IsLatest": false,
            "LastModified": "2024-08-18T01:47:11+00:00",
            "Owner": {
                "DisplayName": "${所有者の表示名称}",
                "ID": "${所有者のID}"
            }
        }
    ],
    "DeleteMarkers": [
        {
            "Owner": {
                "DisplayName": "${所有者の表示名称}",
                "ID": "${所有者のID}"
            },
            "Key": "sample.txt",
            "VersionId": "KqqxMWSE1IpO2e2IBTrXjYpLQeJ9J.Cm",
            "IsLatest": true,
            "LastModified": "2024-08-18T02:00:10+00:00"
        }
    ],
    "RequestCharged": null
}
  1. オブジェクトの読み取り
  • 削除マーカーが挿入されている場合、404エラーを返して読み取りに失敗します。
$ aws s3 cp s3://mori-s3-versioning-test/sample.txt -
download failed: s3://mori-s3-versioning-test/sample.txt to - An error occurred (404) when calling the HeadObject operation: Not Found

オブジェクトの復元

  1. 削除マーカーを削除してオブジェクトを復元
# 削除マーカーの削除
$ aws s3api delete-object --bucket mori-s3-versioning-test --version-id "KqqxMWSE1IpO2e2IBTrXjYpLQeJ9J.Cm" --key "sample.txt"
{
    "DeleteMarker": true,
    "VersionId": "KqqxMWSE1IpO2e2IBTrXjYpLQeJ9J.Cm"
}

# オブジェクトの読み取り
$ aws s3 cp s3://mori-s3-versioning-test/sample.txt -
version_2

バージョニング停止

  1. バケットのバージョニングを停止
# バージョニングを停止
$ aws s3api put-bucket-versioning --bucket mori-s3-versioning-test --versioning-configuration Status=Suspended

# バージョニング設定を取得
$ aws s3api get-bucket-versioning --bucket mori-s3-versioning-test
{
    "Status": "Suspended"
}
  1. sample.txtの内容を更新してバケットにアップロード
$ cat sample.txt 
version_3

$ aws s3 cp sample.txt s3://mori-s3-versioning-test/
upload: ./sample.txt to s3://mori-s3-versioning-test/sample.txt
  1. オブジェクトのバージョンIDを取得
  • バージョニング有効時に付与されたバージョンIDは保持。
  • バージョニング停止後にアップロードしたオブジェクトにはバージョンID:nullを付与している。
# オブジェクトの一覧を取得
$ aws s3api list-object-versions --bucket mori-s3-versioning-test
{
    "Versions": [
        {
            "ETag": "\"8858dc8cb84c5bfd9e7e68d31fd4ee87\"",
            "Size": 10,
            "StorageClass": "STANDARD",
            "Key": "sample.txt",
            "VersionId": "null",
            "IsLatest": true,
            "LastModified": "2024-08-18T02:36:21+00:00",
            "Owner": {
                "DisplayName": "${所有者の表示名称}",
                "ID": "${所有者のID}"
            }
        },
        {
            "ETag": "\"43130fb6bee07968d2e81121256dc2d6\"",
            "Size": 10,
            "StorageClass": "STANDARD",
            "Key": "sample.txt",
            "VersionId": "wEOThRs4I.dDlIzZnDokqCX1wMeFSqAT",
            "IsLatest": false,
            "LastModified": "2024-08-18T01:53:04+00:00",
            "Owner": {
                "DisplayName": "${所有者の表示名称}",
                "ID": "${所有者のID}"
            }
        },
        {
            "ETag": "\"ad493b7e55b6efc3e7be8e1a2ed7f579\"",
            "Size": 10,
            "StorageClass": "STANDARD",
            "Key": "sample.txt",
            "VersionId": "r9i1RnKE0a16V5dIJjOUWWxhodGk7Jyh",
            "IsLatest": false,
            "LastModified": "2024-08-18T01:47:11+00:00",
            "Owner": {
                "DisplayName": "${所有者の表示名称}",
                "ID": "${所有者のID}"
            }
        }
    ],
    "RequestCharged": null
}

※マネジメントコンソールでの表示


  1. オブジェクトの内容を読み取り
  • バージョンID:nullが現行バージョンとして扱われる。
  • 同名ファイルをアップロードすると、バージョンID:nullのオブジェクトは上書きされる。
$ aws s3 cp s3://mori-s3-versioning-test/sample.txt -
version_3
  1. バージョンID:null以外のオブジェクトを全て削除
# バージョンIDを指定して削除
$ aws s3api delete-object --bucket mori-s3-versioning-test --key "sample.txt" --version-id "r9i1RnKE0a16V5dIJjOUWWxhodGk7Jyh"
{
    "VersionId": "r9i1RnKE0a16V5dIJjOUWWxhodGk7Jyh"
}

# バージョンIDを指定して削除
$ aws s3api delete-object --bucket mori-s3-versioning-test --key "sample.txt" --version-id "wEOThRs4I.dDlIzZnDokqCX1wMeFSqAT"
{
    "VersionId": "wEOThRs4I.dDlIzZnDokqCX1wMeFSqAT"
}

# バージョンIDを取得(バージョンID:nullのオブジェクトのみ保持)
$ aws s3api list-object-versions --bucket mori-s3-versioning-test{
    "Versions": [
        {
            "ETag": "\"8858dc8cb84c5bfd9e7e68d31fd4ee87\"",
            "Size": 10,
            "StorageClass": "STANDARD",
            "Key": "sample.txt",
            "VersionId": "null",
            "IsLatest": true,
            "LastModified": "2024-08-18T02:36:21+00:00",
            "Owner": {
                "DisplayName": "${所有者の表示名称}",
                "ID": "${所有者のID}"
            }
        }
    ],
    "RequestCharged": null
}
  1. オブジェクトを削除後、バケット内のオブジェクト一覧を取得
  • バージョンID:nullのオブジェクトは削除されるが、削除マーカーは挿入される。
  • 所謂、期限切れ削除マーカーが発生する状態となる。
# オブジェクトを削除
$ aws s3 rm s3://mori-s3-versioning-test/sample.txt
delete: s3://mori-s3-versioning-test/sample.txt

# 
$ aws s3api list-object-versions --bucket mori-s3-versioning-test
{
    "DeleteMarkers": [
        {
            "Owner": {
                "DisplayName": "${所有者の表示名称}",
                "ID": "${所有者のID}"
            },
            "Key": "sample.txt",
            "VersionId": "null",
            "IsLatest": true,
            "LastModified": "2024-08-18T02:53:03+00:00"
        }
    ],
    "RequestCharged": null
}
  1. バケットの削除
  • 削除マーカー自身もオブジェクトのため、バケットが空ではないと怒られます。
# バケットの削除
$ aws s3 rb s3://mori-s3-versioning-test 
remove_bucket failed: s3://mori-s3-versioning-test An error occurred (BucketNotEmpty) when calling the DeleteBucket operation: The bucket you tried to delete is not empty. You must delete all versions in the bucket.
  1. 削除マーカーを削除してバケットの削除
# 削除マーカーの削除
$ aws s3api delete-object --bucket mori-s3-versioning-test --key "sample.txt" --version-id "null"
{
    "DeleteMarker": true,
    "VersionId": "null"
}

# バケットの削除
$ aws s3 rb s3://mori-s3-versioning-test 
remove_bucket: mori-s3-versioning-test

おわりに

  • 小ネタとしてaws s3 cpコマンドのコピー先に「-(ハイフン)」を指定するとオブジェクトの内容を出力できる。
$ aws s3 cp s3://mori-s3-versioning-test/sample.txt -
version_1

参考

https://docs.aws.amazon.com/cli/latest/reference/s3api/

Discussion