AWS CLIからS3ストレージクラスを操作する
Amazon S3 は用途に応じて、様々なストレージクラスが提供されています。 今回は AWS CLI からストレージクラス系操作を行う方法を紹介します。
ストレージクラス概要
まずは S3 のストレージクラスを軽くおさらいします。
ストレージクラスの特徴
ストレージクラス | 用途 | 耐久性 | 可用性 | 保存コスト | 取得コスト |
---|---|---|---|---|---|
STANDARD | デフォルトのストレージクラス。アクセス頻度の高いデータ | 99.999999999% | 0.9999 | △ | ◯ |
STANDARD_IA | アクセスが頻繁ではないデータ | 99.999999999% | 0.999 | ◯ | △ |
ONEZONE_IA | アクセスが頻繁ではないデータ 1 つのアベイラビリティーゾーンでのみ保存するため、可用性と回復性が劣る。 | 99.999999999% | 0.995 | ◯ | △ |
GLACIER | アクセスが頻繁ではないデータのアーカイブ。リアルタイムアクセスできない。データ取得のコストが高い。 | 99.999999999% | 0.9999 | ◎ | ☓ |
RRS | 非推奨 | 99.99% | 0.9999 | △ | ◯ |
大きく
- STANDARD
- IA(Infrequent Access)
- GLACIER
の3種類があることを覚えておきましょう。
適切なストレージクラスの選択
適切なストレージクラスを選択するために、ストレージクラスを分析分析することも出来ます。 詳細は次のドキュメントを参照下さい。
AWS ドキュメント » Amazon Simple Storage Service (S3) » 開発者ガイド » Amazon S3 分析 – ストレージクラス分析
RRS(Reduced Redundancy Storage)は現在では非推奨です。
耐久性が他のクラスに比べて大きく劣るにも関わらず、現在では他のクラスより保存コストが高くかかり、デメリットしかありません。 現在、RSSをご利用の場合は、他のクラスへの切り替えを検討下さい。
ストレージクラスの歴史
- 2006/03 : Amazon S3 発表(Standard ストレージクラスのみ)
- 2010/05 : Reduced Redundancy ストレージクラス開始
- 2012/08 : Glacier ストレージクラス開始
- 2015/09 : Infrequent Access ストレージ開始
- 2018/04 : One Zone-Infrequent Acces開始
というように、数年ごとに新しいストレージクラスが追加されています。
AWS CLI から S3 ストレージクラスを操作
AWS CLI から S3 を操作する場合、2種類のコマンドが用意されています。
- aws s3 : S3 の頻出操作向け高レベルコマンド
- aws s3api : REST API に対応する低レベルコマンド
この記事では、できるかぎり両方のコマンドで操作方法を紹介します。
ストレージクラスの指定
S3 オブジェクトの PUT/COPY 時にはストレージクラスを指定します。 以下のストレージクラスの物理名を利用します。
- STANDARD
- STANDARD_IA
- ONEZONE_IA
- GLACIER
- RRS
ストレージクラスを指定して S3 に PUT
新規に S3 にオブジェクトを保存する際に、ストレージクラスを指定する方法を紹介します。
aws s3
単一オブジェクトの場合 cp コマンドを利用します。
--storage-class
でストレージクラスを指定します。
$ aws s3 cp ONEZONE_IA s3://YOUR-BUCKET/storage-class/bar --storage-class STANDARD upload: ./ONEZONE_IA to s3://YOUR-BUCKET/storage-class/bar
sync
, mv
コマンドでも同様に --storage-class
を指定します。
aws s3api
put-object コマンドを利用します。
--storage-class
でストレージクラスを指定します。
$ aws s3api put-object \ --bucket YOUR-BUCKET \ --key storage-class/foo \ --body ONEZONE_IA \ --storage-class ONEZONE_IA { "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"" }
ストレージクラスを変更
S3 に保存済みオブジェクトのストレージクラスを変更する方法を紹介します。
aws s3
cp コマンドを利用します。
ストレージクラスだけを変更する API は存在せず source と destination を同じにして --storage-class
を指定します。
$ aws s3 cp \ s3://YOUR-BUCKET/storage-class/foo \ s3://YOUR-BUCKET/storage-class/foo \ --storage-class STANDARD_IA copy: s3://YOUR-BUCKET/storage-class/foo to s3://YOUR-BUCKET/storage-class/foo
オブジェクト個別ではなく、特定のプリフィックス以下、あるいは、バケット全体でまとめて変更したい場合は --recursive
オプションを渡します。
$ aws s3 cp \ s3://YOUR-BUCKET/ \ s3://YOUR-BUCKET/ \ --recursive \ --storage-class STANDARD_IA
aws s3api
copy-object コマンドを利用します。
source と destination を同じにして --storage-class
を指定します。
$ aws s3api copy-object \ --copy-source YOUR-BUCKET/storage-class/STANDARD \ --bucket YOUR-BUCKET --key storage-class/STANDARD \ --storage-class STANDARD_IA { "CopyObjectResult": { "LastModified": "2018-05-03T10:56:09.000Z", "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"" } }
オブジェクトのストレージクラスを確認
S3 オブジェクトのストレージクラスを確認します。
aws s3
対応するコマンドは存在しません。
s3api 系コマンドをご利用下さい。
aws s3api
- 一覧の場合は list-objects-v2 コマンド
- オブジェクト個別の場合は head-object コマンド
を利用します。
一覧表示の場合
list-objects-v2 コマンドを利用し、バケット(--bucket
)とプリフィックス(--prefix
)を指定します。
レスポンスの Contents
の StorageClass
からストレージクラスを確認出来ます。
$ aws s3api list-objects-v2 --bucket YOUR-BUCKET --prefix storage-class { "Contents": [ { "LastModified": "2018-05-03T10:36:59.000Z", "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"", "StorageClass": "ONEZONE_IA", "Key": "storage-class/ONEZONE_IA", "Size": 0 }, … { "LastModified": "2018-05-03T10:37:01.000Z", "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"", "StorageClass": "STANDARD_IA", "Key": "storage-class/STANDARD_IA", "Size": 0 } ] }
オブジェクト個別の場合
head-object コマンドを利用します。
レスポンスの StorageClass
からストレージクラスを確認出来ます。
ストレージクラスがデフォルトの STANDARD
の場合、この属性はレスポンスに含まれません。
Provides storage class information of the object. Amazon S3 returns this header for all objects except for Standard storage class objects.
https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectHEAD.html
# STANDARD クラスの場合 $ aws s3api head-object --bucket YOUR-BUCKET --key storage-class/STANDARD { "AcceptRanges": "bytes", "ContentType": "binary/octet-stream", "LastModified": "Thu, 03 May 2018 10:37:01 GMT", "ContentLength": 0, "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"", "Metadata": {} } # STANDARD_IA クラスの場合 $ aws s3api head-object --bucket YOUR-BUCKET --key storage-class/STANDARD_IA { "AcceptRanges": "bytes", "ContentType": "binary/octet-stream", "LastModified": "Thu, 03 May 2018 10:37:01 GMT", "ContentLength": 0, "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"", "StorageClass": "STANDARD_IA", "Metadata": {} }
まとめ
Amazon S3 ストレージクラスに関連する AWS CLI の操作方法を紹介しました。
各種 SDK に読み替える場合は、 REST API がベースになっている s3api を参考にして下さい。