AWS CLIからS3ストレージクラスを操作する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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 コマンドを利用し、バケット(--bucket)とプリフィックス(--prefix)を指定します。

レスポンスの ContentsStorageClass からストレージクラスを確認出来ます。

$ 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 を参考にして下さい。

参考