kakakakakku blog

Weekly Tech Blog: Keep on Learning!

フォルダオブジェクトの有無によって aws s3api list-objects-v2 コマンドの結果が異なる

AWS CLI で Amazon S3 の aws s3api list-objects-v2 コマンドを使ってオブジェクト数をカウントしてたときに少しハマったことがあって簡単にメモしておこうと思う👌

awscli.amazonaws.com

起きたこと

例えば 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 のオブジェクトがあるとマネジメントコンソールではフォルダとして表示してくれるという前提がある👌以下のドキュメントに詳しく載っている.

docs.aws.amazon.com

検証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
}