💬
Amazon S3 バージョニングをAWS CLIで検証
はじめに
本ページは個人の勉強で使用することを目的に作成しておりますが、記載の誤り等が含まれる場合がございます。
最新の情報についてはAWS公式ドキュメントをご参照ください。
やること
- バージョニング無効・有効・停止状態のS3バケットにAWS CLIで挙動を検証する。
種別 | 設定値 |
---|---|
S3バケット | mori-s3-versioning-test |
実行環境 | AWS CloudShell |
AWS CLI | aws-cli/2.17.26 |
- S3バケットのバージョニングについては下記を参照。
バージョニング無効
オブジェクトのアップロード
-
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
- オブジェクトのバージョン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は確認できない。
オブジェクトの更新
-
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
- オブジェクトの読み取り
- オブジェクトの内容を読み取る。
$ 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
}
オブジェクトの削除
- オブジェクトを削除
$ 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
{
"RequestCharged": null
}
バージョニング有効
オブジェクトのアップロード
- バケットのバージョニングを有効化
# バージョニングを有効化
$ 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"
}
-
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
- オブジェクトのバージョン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
}
オブジェクトの更新
-
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
- オブジェクト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コンソールでの表示
オブジェクトの読み取り
- オブジェクトの内容を読み取り
- バージョンIDを指定しない場合、現行バージョンを読み取る。
# オブジェクトの読み取り
$ aws s3 cp s3://mori-s3-versioning-test/sample.txt -
version_2
- オブジェクトを削除後、オブジェクトのバージョン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
}
- オブジェクトの読み取り
- 削除マーカーが挿入されている場合、
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
オブジェクトの復元
- 削除マーカーを削除してオブジェクトを復元
# 削除マーカーの削除
$ 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
バージョニング停止
- バケットのバージョニングを停止
# バージョニングを停止
$ 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"
}
-
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
- オブジェクトのバージョン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
}
※マネジメントコンソールでの表示
- オブジェクトの内容を読み取り
- バージョンID:nullが現行バージョンとして扱われる。
- 同名ファイルをアップロードすると、バージョンID:nullのオブジェクトは上書きされる。
$ aws s3 cp s3://mori-s3-versioning-test/sample.txt -
version_3
- バージョン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
}
- オブジェクトを削除後、バケット内のオブジェクト一覧を取得
- バージョン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
}
- バケットの削除
- 削除マーカー自身もオブジェクトのため、バケットが空ではないと怒られます。
# バケットの削除
$ 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.
- 削除マーカーを削除してバケットの削除
# 削除マーカーの削除
$ 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
参考
Discussion