カピバラ好きなエンジニアブログ

興味ある技術とか検証した内容を赴くままに書いていきます。カピバラの可愛さこそ至高。

AWS CLIでS3にあるファイルのストレージクラスを確認する

AWS CLIでS3上のファイルを確認したり、ローカルにコピーしたりといった作業をすることはよくあるのですが、たまにS3上のファイルのストレージクラスを確認したいときがあります。


今回は以下のドキュメントを参考に、ファイルのストレージクラスの情報を取得してみようと思います。
docs.aws.amazon.com


環境


実施作業

準備

ストレージクラスを取得できるように、適当なS3バケットにサンプルファイルをアップロードします。
ちょっと試してみたいことがあったので、1つフォルダも作成しています。
f:id:live-your-life-dd18:20210519103048p:plain


実際に作業に進む前に一応説明しておくと、AWS CLIからS3を操作するコマンドは複数あります。

s3コマンドとs3apiコマンドの2種類があり、以下のドキュメントにも書いてますが、s3は基本的な操作のみ、s3apiはS3のAPIレベルで操作が可能になっているので、より細かい作業をCLIでしたい場合はs3apiを使用することになります。
docs.aws.amazon.com


今回のようなストレージクラスの取得をしたい等の場合はs3apiコマンドを使用します。

これは知らなかったのですが、s3コマンドは高レベルコマンド、s3apiコマンドは低レベルコマンドと呼称しているようです。
OSでいうところの高レイヤー、低レイヤーみたいな使い分けでしょうか。

メタデータ取得

まずはコマンドでS3上のファイルが確認してみます。

PS C:\work> aws s3 ls s3://test-temp-2021
                           PRE テスト フォルダ/
2021-05-19 01:20:09          0 test1.txt



今回実行するs3apiのhead-objectのオプションについてhelpコマンドで見てみます。

SYNOPSIS
            head-object
          --bucket <value>
          [--if-match <value>]
          [--if-modified-since <value>]
          [--if-none-match <value>]
          [--if-unmodified-since <value>]
          --key <value>
          [--range <value>]
          [--version-id <value>]
          [--sse-customer-algorithm <value>]
          [--sse-customer-key <value>]
          [--sse-customer-key-md5 <value>]
          [--request-payer <value>]
          [--part-number <value>]
          [--expected-bucket-owner <value>]
          [--cli-input-json | --cli-input-yaml]
          [--generate-cli-skeleton <value>]
          [--cli-auto-prompt <value>]



必須のオプションは--bucketと--keyのみなので、シンプルに実行するだけならバケット名とプレフィックスがわかっていれば良さそうです。


実際に実行してみた結果はこちらです。

PS C:\work> aws s3api head-object --bucket test-temp-2021 --key test1.txt
{
    "AcceptRanges": "bytes",
    "LastModified": "2021-05-19T01:20:09+00:00",
    "ContentLength": 0,
    "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
    "ContentType": "text/plain",
    "Metadata": {}
}



レスポンスの説明はこちらです。
てっきりここにストレージクラスが入っているものと思ってましたが、入ってませんでした。

パラメータ名 説明
AcceptRanges バイト範囲が指定
LastModified オブジェクトの作成日
ContentLength 本体のサイズ(バイト単位)
ETag URLで見つかったリソースの特定のバージョンにWebサーバーによって割り当てられた不透明な識別子
ContentType オブジェクトデータの形式を説明する標準のMIMEタイプ
Metadata S3のオブジェクトとともに保存するメタデータのマップ



ドキュメントをよく確認してみると以下のように書いてました。
標準ストレージクラスの場合、そもそもストレージクラスがレスポンスに含まれないようです。

オブジェクトのストレージクラス情報を提供します。Amazon S3は、S3標準ストレージクラスオブジェクトを除くすべてのオブジェクトに対してこのヘッダーを返します。

f:id:live-your-life-dd18:20210519105557p:plain


ファイルのストレージクラスを変更してみます。
f:id:live-your-life-dd18:20210519105800p:plain


再度コマンドを実行してみると無事StorageClassパラメータが表示されていました。
もしバッチなどでS3上のファイルのストレージクラスを操作する場合は少し注意が必要です。

PS C:\work> aws s3api head-object --bucket test-temp-2021 --key test1.txt
{
    "AcceptRanges": "bytes",
    "LastModified": "2021-05-19T01:57:36+00:00",
    "ContentLength": 0,
    "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
    "ContentType": "text/plain",
    "Metadata": {},
    "StorageClass": "GLACIER"
}


試してみたいこと

冒頭の準備のところで"試してみたいことがある"と書きましたが、それは「全角スペースのあるフォルダ配下のファイルも同じようにストレージクラスが取得できるか」ということでした。


S3に以下のようなフォルダとファイルを準備します。
f:id:live-your-life-dd18:20210519110631p:plain


先ほどと同じようにコマンドを実行してみます。
今回は--keyに空白が含まれることになるので、""でパスを囲います。

PS C:\work> aws s3api head-object --bucket test-temp-2021 --key "テスト フォルダ/test2.txt"



問題なく取得できました。

{
    "AcceptRanges": "bytes",
    "LastModified": "2021-05-19T02:06:14+00:00",
    "ContentLength": 0,
    "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
    "ContentType": "text/plain",
    "Metadata": {},
    "StorageClass": "GLACIER"
}


追記

list-objects-v2でもできるようでしたので試してみました。

$ aws s3api list-objects-v2 --bucket test-temp-2021 --prefix "テスト フォルダ/test2.txt"



表示に若干の際はあるものの、こちらでもストレージクラスが確認できました。
こちらはサイズも表示されるので、知りたい情報によって使い分けするのが良さそうです。

PS C:\work> aws s3api list-objects-v2 --bucket test-temp-2021 --prefix "テスト フォルダ/test2.txt"
{
    "Contents": [
        {
            "Key": "<E3><83><86><E3><82><B9><E3><83><88><E3><80><80><E3><83><95><E3><82><A9><E3><83><AB><E3><83><80>/test2.txt",
            "LastModified": "2021-05-19T02:06:14+00:00",
            "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
            "Size": 0,
            "StorageClass": "GLACIER"
        }
    ]
}



list-objects-v2だとストレージクラスがスタンダードのものでもパラメータに含まれるようです。

PS C:\work> aws s3api list-objects-v2 --bucket test-temp-2021 --prefix "test3.txt"
{
    "Contents": [
        {
            "Key": "test3.txt",
            "LastModified": "2021-05-19T01:51:21+00:00",
            "ETag": "\"098f6bcd4621d373cade4e832627b4f6\"",
            "Size": 4,
            "StorageClass": "STANDARD"
        }
    ]
}


感想及び所感

バッチを作ろうと思ったときに調べてみたので備忘目的で書いてみました。
手軽なのでs3コマンドをよく使ってましたが、バッチを作るとかになるとs3apiの方が多く情報が取得できるので、その場合はこちらを使いたいですね。