Amazon S3のオブジェクトのストレージクラスを知りたかっただけなのに、、、

Amazon S3オブジェクトのストレージクラスがSTANDARDの場合、"s3api head-object"ではストレージクラスが表示されません。

 
AWS CLI 公式リファレンスより

{
    "AcceptRanges": "bytes",
    "LastModified": "2026-01-10T03:18:23+00:00",
    "ContentLength": 0,
    "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
    "ContentType": "text/plain",
    "ServerSideEncryption": "AES256",
    "Metadata": {}
}

 

今回の記事では、ストレージクラスがSTANDARDでもawscliでストレージクラスを知るコマンドを紹介します。

 

 

S3オブジェクトのストレージクラスが知りたい

■s3api head-objectではダメ?

awscliにはS3のオブジェクトのストレージクラスを知るコマンドが複数用意されています。単一オブジェクトの属性を知りたいだけなら"aws s3api head-object"を利用するのですが、オブジェクトのストレージクラスがSTANDARDの場合出力されません。

 

【コマンド結果】

C:\Users\csnp0001>aws s3api head-object --bucket saito-awsclitest-bucket --key test-folder/test-file.txt
{
    "AcceptRanges": "bytes",
    "LastModified": "2026-01-10T03:18:23+00:00",
    "ContentLength": 0,
    "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
    "ContentType": "text/plain",
    "ServerSideEncryption": "AES256",
    "Metadata": {}
}

 

ためしにクエリしてみても、"null"と返ってきます。
aws s3api head-object --bucket <バケット名> --key <キー> --query StorageClass

 

【コマンド結果】

C:\Users\csnp0001>aws s3api head-object --bucket saito-awsclitest-bucket --key test-folder/test-file.txt --query StorageClass
null

 

しかし、他のストレージクラスの場合は、"s3api head-object"でも出力されます。例えば、"S3 Glacier Deep Archive"の場合です。

 

ストレージクラスを変更して、
aws s3api copy-object --bucket <バケット名> --key <キー> --copy-source <バケット名/キー> --storage-class DEEP_ARCHIVE

 

【コマンド結果】

C:\Users\csnp0001>aws s3api copy-object --bucket saito-awsclitest-bucket --key test-folder/test-file.txt --copy-source saito-awsclitest-bucket/test-folder/test-file.txt --storage-class DEEP_ARCHIVE
{
    "Expiration": "expiry-date=\"Thu, 12 Feb 2026 00:00:00 GMT\", rule-id=\"CPI-Default-LC-Policy\"",
    "ServerSideEncryption": "AES256",
    "CopyObjectResult": {
        "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
        "LastModified": "2026-01-11T02:41:42+00:00",
        "ChecksumCRC64NVME": "AAAAAAAAAAA="
    }

 

head-objectを実行すると、先ほどまでなかった"StorageClass"が出力されています。
aws s3api head-object --bucket <バケット名> --key <キー>

 

【コマンド結果】

C:\Users\csnp0001>aws s3api head-object --bucket saito-awsclitest-bucket --key test-folder/test-file.txt
{
    "AcceptRanges": "bytes",
    "Expiration": "expiry-date=\"Thu, 12 Feb 2026 00:00:00 GMT\", rule-id=\"CPI-Default-LC-Policy\"",
    "LastModified": "2026-01-11T02:41:42+00:00",
    "ContentLength": 0,
    "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
    "ContentType": "text/plain",
    "ServerSideEncryption": "AES256",
    "Metadata": {},
    "StorageClass": "DEEP_ARCHIVE"
}

 

クエリすると、次のように出力させることができます。
aws s3api head-object --bucket <バケット名> --key <キー> --query StorageClass

 

【コマンド結果】

C:\Users\csnp0001>aws s3api head-object --bucket saito-awsclitest-bucket --key test-folder/test-file.txt --query StorageClass
"DEEP_ARCHIVE"

 

ストレージクラスが"STANDARD"の場合でも、明示的に知りたい場合はどうすればいいのでしょうか?

 

 

■STANDARD の場合でもストレージクラスを知りたいとき

答えは、"list-objects-v2"を使うです。

 

"list-objects-v2"は、バケット内のオブジェクトの一部またはすべて(最大1,000個)を返すコマンドのため、個別オブジェクトの情報を取得する場合には不向きではあります。

 

ですので、"query"オプションで絞って出力させましょう。

 

実際に実行してみると、
aws s3api list-objects-v2 --bucket <バケット名> --query "Contents[?Key=='<キー>'].StorageClass"

 

【コマンド結果】出力例(STANDARDの場合)

C:\Users\csnp0001>aws s3api list-objects-v2 --bucket saito-awsclitest-bucket --query "Contents[?Key=='test-folder/test-file.txt'].StorageClass"
[
    "STANDARD"
]

 

【コマンド結果】出力例(DEEP_ARCHIVEの場合)

C:\Users\csnp0001>aws s3api list-objects-v2 --bucket saito-awsclitest-bucket --query "Contents[?Key=='test-folder/test-file.txt'].StorageClass"
[
    "DEEP_ARCHIVE"
]

 

 

まとめ

awscliでS3を操作するコマンドには、s3s3apiがあり、さらにその中でも似たようなコマンドが複数あります。

 

そして、返ってくる値が微妙に違うため、状況に応じて使い分ける必要があります。リファレンスを読んで対応していきましょう。

 

 

参考リンク:AWS CLI コマンドリファレンス

 

 

↓ほかの協栄情報メンバーのAmazon S3についての記事を公開しています。ぜひ参考にしてみてください。
 

 
KMSキー暗号化バケットでのS3レプリケーション設定の解決方法(齊藤弘樹)

 

 

Last modified: 2026-01-11

Author