AWS CLI で Amazon S3 の aws s3api list-objects-v2
コマンドを使ってオブジェクト数をカウントしてたときに少しハマったことがあって簡単にメモしておこうと思う👌
起きたこと
例えば Amazon S3 バケットに folder/file.txt
というオブジェクトが保存されているときに aws s3api list-objects-v2
コマンドを実行すると「オブジェクト数1」の場合と「オブジェクト数2」の場合があって,オブジェクト数をカウントするコードが期待通りに動かなかったという場面があった👀(検証用の Amazon S3 バケットは削除済)
オブジェクト数1
Key: folder/file.txt
オブジェクト数2
Key: folder/ Key: folder/file.txt
結論
結論としては「フォルダオブジェクト」の有無によって結果が異なっていた.よって,aws s3api list-objects-v2
コマンドを使ってオブジェクト数をカウントするときはフォルダオブジェクトの有無を考慮すると良さそう.アプリケーション実装によっても異なると思う.
ちなみに Amazon S3 には厳密には「フォルダ」という概念はなく,キーの末尾が /
となる 0 Byte のオブジェクトがあるとマネジメントコンソールではフォルダとして表示してくれるという前提がある👌以下のドキュメントに詳しく載っている.
検証1: オブジェクト数1
オブジェクト数: 0
$ aws s3api list-objects-v2 \ --bucket kakakakakku-sandbox-list-objects-v2 { "RequestCharged": null }
オブジェクト folder/file.txt
を追加する.
$ aws s3api put-object \ --bucket kakakakakku-sandbox-list-objects-v2 \ --key folder/file.txt \ --body file.txt
オブジェクト数: 1(LastModified
の値は修正している)
$ aws s3api list-objects-v2 \ --bucket kakakakakku-sandbox-list-objects-v2 \ --prefix folder/ { "Contents": [ { "Key": "folder/file.txt", "LastModified": "2024-07-30T00:00:00+00:00", "ETag": "\"4c21212908803d3bf45f5a162bed13f1\"", "Size": 27, "StorageClass": "STANDARD" } ], "RequestCharged": null }
検証2: オブジェクト数2
オブジェクト数: 0
$ aws s3api list-objects-v2 \ --bucket kakakakakku-sandbox-list-objects-v2 { "RequestCharged": null }
フォルダオブジェクト folder/
を追加する.
$ aws s3api put-object \ --bucket kakakakakku-sandbox-list-objects-v2 \ --key folder/
オブジェクト数: 1(LastModified
の値は修正している)
$ aws s3api list-objects-v2 \ --bucket kakakakakku-sandbox-list-objects-v2 \ --prefix folder/ { "Contents": [ { "Key": "folder/", "LastModified": "2024-07-30T00:00:00+00:00", "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"", "Size": 0, "StorageClass": "STANDARD" } ], "RequestCharged": null }
オブジェクト folder/file.txt
を追加する.
$ aws s3api put-object \ --bucket kakakakakku-sandbox-list-objects-v2 \ --key folder/file.txt \ --body file.txt
オブジェクト数: 2(LastModified
の値は修正している)
$ aws s3api list-objects-v2 \ --bucket kakakakakku-sandbox-list-objects-v2 \ --prefix folder/ { "Contents": [ { "Key": "folder/", "LastModified": "2024-07-30T00:00:00+00:00", "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"", "Size": 0, "StorageClass": "STANDARD" }, { "Key": "folder/file.txt", "LastModified": "2024-07-30T00:00:00+00:00", "ETag": "\"4c21212908803d3bf45f5a162bed13f1\"", "Size": 27, "StorageClass": "STANDARD" } ], "RequestCharged": null }