AWS CLIでS3上のファイルを確認したり、ローカルにコピーしたりといった作業をすることはよくあるのですが、たまにS3上のファイルのストレージクラスを確認したいときがあります。
今回は以下のドキュメントを参考に、ファイルのストレージクラスの情報を取得してみようと思います。
docs.aws.amazon.com
環境
- OS:Windows 10
- Tool: PowerShell
- CLI:AWS CLI v2
実施作業
準備
ストレージクラスを取得できるように、適当なS3バケットにサンプルファイルをアップロードします。
ちょっと試してみたいことがあったので、1つフォルダも作成しています。
実際に作業に進む前に一応説明しておくと、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標準ストレージクラスオブジェクトを除くすべてのオブジェクトに対してこのヘッダーを返します。
ファイルのストレージクラスを変更してみます。
再度コマンドを実行してみると無事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に以下のようなフォルダとファイルを準備します。
先ほどと同じようにコマンドを実行してみます。
今回は--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の方が多く情報が取得できるので、その場合はこちらを使いたいですね。