AWS CLI の s3api put-object コマンドで S3 に永続的なフォルダを作成する

AWS CLI の s3api put-object コマンドで S3 に永続的なフォルダを作成する

2026.01.23

はじめに

以下の記事では、S3 バケットのフォルダ配下にあるオブジェクトをすべて削除した時にフォルダも消えてしまう、という事象について解説されています。

https://dev.classmethod.jp/articles/s3-delete-console-cli/

記事を読むとわかるように、aws s3 cp などのコマンドではフォルダを永続化することができません。
ですが、実は AWS CLI の API レベルコマンドである s3api を使うことで永続的なフォルダを作成することは可能です。
この記事ではその方法を紹介します。

なお、高レベルコマンドと API レベルコマンドの違いについては、以下の記事もご参照ください。

https://dev.classmethod.jp/articles/cli-command-s3-s3-and-s3api-i-tried-to-find-out-what-i-can-do/

マネジメントコンソールからフォルダを作成

おさらいとして、まず、マネジメントコンソールから「test1」というフォルダを作成してみました。

S3 マネジメントコンソール

aws s3api list-objects でオブジェクトの詳細を取得してみると、以下のように 0 サイズのオブジェクトであることがわかります。

{
    "Key": "test1/",
    "LastModified": "2026-01-23T01:51:06+00:00",
    "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
    "ChecksumAlgorithm": [
        "CRC64NVME"
    ],
    "ChecksumType": "FULL_OBJECT",
    "Size": 0,
    "StorageClass": "STANDARD",
    "Owner": {
        "ID": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    }
}

このフォルダの配下にファイルを設置して、オブジェクトのリストを取得してみましょう。
フォルダオブジェクトとファイルオブジェクトの 2 つが配列として返却されるはずです。

{
    "Key": "test1/",
    "LastModified": "2026-01-23T01:51:06+00:00",
    "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
    "ChecksumAlgorithm": [
        "CRC64NVME"
    ],
    "ChecksumType": "FULL_OBJECT",
    "Size": 0,
    "StorageClass": "STANDARD",
    "Owner": {
        "ID": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    }
},
{
    "Key": "test1/test.txt",
    "LastModified": "2026-01-23T01:56:36+00:00",
    "ETag": "\"d8e8fca2dc0f896fd7cb4cb0031ba249\"",
    "ChecksumAlgorithm": [
        "CRC64NVME"
    ],
    "ChecksumType": "FULL_OBJECT",
    "Size": 5,
    "StorageClass": "STANDARD",
    "Owner": {
        "ID": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    }
}

想定通りですね。

AWS の公式ドキュメントにも記載されているように、マネジメントコンソールから「フォルダを作成」すると、0 サイズのオブジェクトとなります。
そのため、配下のファイルを削除しても、別オブジェクトであるフォルダは削除されないということです。

Amazon S3 コンソールでフォルダを作成すると、S3 は 0 バイトのオブジェクトを作成します。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/using-folders.html

高レベルコマンドでオブジェクトを作成

続いて、高レベルコマンドでオブジェクトを設置してみました。

$ aws s3 cp test.txt s3://bucket-name/test2/   
upload: ./test.txt to s3://bucket-name/test2/test.txt

同様に、オブジェクトの詳細を取得してみると、以下のように 1 つのオブジェクトしか返却されません。

{
    "Key": "test2/test.txt",
    "LastModified": "2026-01-23T01:54:46+00:00",
    "ETag": "\"d8e8fca2dc0f896fd7cb4cb0031ba249\"",
    "ChecksumAlgorithm": [
        "CRC64NVME"
    ],
    "ChecksumType": "FULL_OBJECT",
    "Size": 5,
    "StorageClass": "STANDARD",
    "Owner": {
        "ID": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    }
}

ですので、この test.txt を削除するとフォルダも削除されてしまいます。

API レベルコマンドでフォルダオブジェクトを作成

となると、0 サイズのフォルダオブジェクトを作成することができれば、永続的なフォルダを作成できそうです。
よく使う高レベルコマンドでは作成できないので、s3api コマンドでを使いましょう。

% aws s3api put-object --bucket bucket-name --key test3/
{
    "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
    "ChecksumCRC64NVME": "AAAAAAAAAAA=",
    "ChecksumType": "FULL_OBJECT",
    "ServerSideEncryption": "AES256"
}

作成できたので、オブジェクトの詳細を確認してみましょう。

{
    "Key": "test3/",
    "LastModified": "2026-01-23T02:02:34+00:00",
    "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
    "ChecksumAlgorithm": [
        "CRC64NVME"
    ],
    "ChecksumType": "FULL_OBJECT",
    "Size": 0,
    "StorageClass": "STANDARD",
    "Owner": {
        "ID": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    }
}

完璧です!

おわりに

ファイルシステムに慣れ親しんでいる私たちには、オブジェクトストレージの概念は少しとっつきづらいところもありますが、原理を理解すれば難しいものではありません。
S3 における永続的なフォルダの作成にお困りの方がいらっしゃいましたら、この記事が少しでもお役に立てれば幸いです。

この記事をシェアする

FacebookHatena blogX

関連記事