AWS BillExplained
← トピック

冷たいストレージは安いストレージではない

  • 時間課金されない
  • GB課金される
  • 個数課金される

ひとことで言うと

ストレージクラスは5つの値段を同時に決める。GB 単価は、冷たくすれば必ず下がる唯一の値段だ。

なぜそうなるのか

みんながやる比較は幅が1列しかない。us-east-1 の S3 標準は $0.023/GB-月、S3 Glacier Flexible Retrieval は $0.0036。6分の1だから全部 Glacier に移そう、という比較だ。この GB-月単価は、冷たいクラスにすれば必ず下がる唯一の数字であり、そして現実のワークロードでは請求額を決めている数字ではないことのほうが多い。

ストレージクラスは値段ではない。5つの値段の束であって、クラスを1つ選ぶと5つ全部が同時に決まる。

  • ストレージ単価 (GB-月)
  • 取り出し料金 (読み戻した GB あたり)
  • リクエスト単価 (1,000 リクエストあたり。冷たいクラスほど高い)
  • 課金対象の最小オブジェクトサイズ (自分のオブジェクトより大きいことがある)
  • 最小ストレージ期間 (自分のデータの寿命より長いことがある)

冷たいクラスは、1つ目を残り4つと引き換えにしている。これが設計そのものであり、AWS は S3 の料金ページに全部書いている。ただし、資料に載るのはいつも1つ目だけだ。

以下はすべて us-east-1。

ストレージクラス ストレージ /GB-月 取り出し /GB PUT, COPY, POST, LIST /1,000 GET /1,000 課金最小サイズ 最小期間
S3 Standard $0.023 なし $0.005 $0.0004 なし なし
S3 Standard-IA $0.0125 $0.01 $0.01 $0.001 128 KB 30 日
S3 One Zone-IA $0.01 $0.01 $0.01 $0.001 128 KB 30 日
S3 Glacier Instant Retrieval $0.004 $0.03 $0.02 $0.01 128 KB 90 日
S3 Glacier Flexible Retrieval $0.0036 取り出し方式別 $0.03 $0.0004 +40 KB/オブジェクト 90 日

S3 Standard のストレージ単価は最初の 50 TB のレート。この表は行ではなく列で読む。Standard から Standard-IA へ移すと、ストレージは 46% 安くなり、書き込みは 2 倍、読み込みは 2.5 倍になり、なかったはずの取り出し料金が発生する。Glacier Instant Retrieval なら、ストレージは 83% 安く、書き込みは 4 倍、読み込みは 25 倍。どの冷たいクラスも、安くなるのはちょうど1行で、高くなるのは最低3行ある。

5つのうち2つはそもそも単価ではない。そして刺さるのはその2つのほうだ。課金対象の最小オブジェクトサイズがあるので、Standard-IA は実際に何バイト置いたかに関係なく 128 KB 分を請求する。最小ストレージ期間があるので、Standard-IA は実際に何日置いたかに関係なく 30 日分を請求する。どちらも GB 単価の比較には出てこない。単価ではなく下限だからだ。下限は、自分がその下にいるときだけ効いてくる。

Glacier Flexible Retrieval と Glacier Deep Archive はサイズの下限の代わりに別の仕掛けを持っている。アーカイブしたオブジェクト 1 個につき 40 KB のメタデータが加算され、うち 8 KB は S3 標準の単価、32 KB はアーカイブ側の単価で課金される。128 KB の最小サイズはないが、オブジェクト単位の税金はある。100 万個の小さいオブジェクトはこれを確実に見つける。

内側から外側への境界:

  1. S3 Standard。ここを越えると: $0.00。無料。 下限なし・最小期間なし
  2. S3 Standard-IA。ここを越えると: $0.01 / 1,000。 最小 30 日・128 KB 下限
  3. S3 Glacier Instant Retrieval。ここを越えると: $0.02 / 1,000。 最小 90 日・128 KB 下限
  4. S3 Glacier Flexible Retrieval。ここを越えると: $0.03 / 1,000。 最小 90 日・+40 KB/オブジェクト
  5. S3 Glacier Deep Archive。ここを越えると: $0.05 / 1,000。 最小 180 日・+40 KB/オブジェクト

一番内側だけが無料。リングを1枚越えて外に出るたびに関所がある。

各リングがストレージクラス。通行料はそこへオブジェクトを移す S3 Lifecycle の transition リクエスト単価 (us-east-1)。注記は、そのクラスに付いてくる2つの下限。

で、いくらなの

冷たくするのにリクエスト代がかかる。 S3 Lifecycle の transition は動かしたオブジェクト単位の課金で、単価は冷たさに比例して上がる。Standard-IA / One Zone-IA / Intelligent-Tiering へは 1,000 件 $0.01、Glacier Instant Retrieval へは $0.02、Glacier Flexible Retrieval へは $0.03、Glacier Deep Archive へは $0.05。100 万オブジェクトを Deep Archive に落とすと、ルールが発火した日に $50。安いストレージのバイトはまだ1つも課金されていない段階で、だ。1,000 万オブジェクトなら $500。

温め直すときは2つのメーターが同時に回る。 Glacier Flexible Retrieval からの復元はリクエスト単位とGB単位の両方で課金され、その組み合わせを自分で選ぶ。

  • Expedited: 1 リクエスト $0.01、1 GB $0.03。100 万オブジェクトならリクエストだけで $10,000。
  • Standard: 1,000 リクエスト $0.05、1 GB $0.01。
  • Bulk: 両方とも無料。

Deep Archive には Expedited がなく、バイト側の値段が変わる。Standard で $0.02/GB、Bulk で $0.0025/GB。どちらにしても、復元すると同じキーで読める一時コピーができ、指定した保持日数のあいだ S3 標準のストレージ単価で課金される。そのコピーを読むための GET も別途かかる。

アプリケーション, S3 Standard, Glacier Flexible のやりとり。1ステップずつ:

  1. アプリケーション から S3 Standard: PUT × 1,000,000。個数メーターで課金、$0.005/1k = $5.00。
  2. S3 Standard から Glacier Flexible: Lifecycle transition × 1,000,000。個数メーターで課金、$0.03/1k = $30.00。
  3. アプリケーション から Glacier Flexible: RestoreObject × 1,000,000 (Standard)。個数メーターで課金、$0.05/1k = $50.00。
  4. Glacier Flexible から S3 Standard: 取り出したバイト → 一時コピー。GBメーターで課金、976.6 GiB × $0.01 = $9.77。
  5. S3 Standard から アプリケーション: GET × 1,000,000。個数メーターで課金、$0.0004/1k = $0.40。 (応答)
1 MiB のオブジェクト 100 万個 (976.6 GiB) をアーカイブして往復させたときの us-east-1 の請求。移行の動機だったストレージ単価は、この図に1行も出てこない。

Intelligent-Tiering は「見張り賃」を取る。 monitoring and automation の料金は 1,000 オブジェクトあたり月 $0.0025、つまり 100 万オブジェクトで月 $2.50。オブジェクトの大きさにも、実際にティアが動いたかどうかにも関係なく取られる。128 KB 未満のオブジェクトは対象外で、auto-tiering の対象にならず、常に Frequent Access の単価で課金され、監視料も取られない。Intelligent-Tiering には取り出し料金がなく、2021 年以降はどのオブジェクトにも最小ストレージ期間がない。ここに挙げたなかで唯一、ストレージ単価を他の4つと引き換えにしていないクラスであり、代わりにオブジェクト単位の固定費を取る。

EBS スナップショットは、同じ発想の別の形だ。 スナップショットは増分で、前回から変更のあったブロックだけが保存され、保存されたブロックに対して $0.05/GB-月 が課金される。削除したときに何が起きるかは、AWS 自身の例が一番わかりやすい。10 GiB のボリュームをスナップショットし、4 GiB を変更してもう1回スナップショットすると、課金は 14 GiB。ここで最初のスナップショットを削除しても、課金は 10 GiB のままだ。2 番目が参照している 6 GiB は保持され、2 番目のスナップショットに付け替えられるからだ。削除で解放されるのは、そのスナップショットだけが参照していたブロックに限られる。チェーンの一番古い1本を消しても、たいていほとんど減らない。

例外と罠

早期削除は「タダ」ではなく「残り」を請求する。 Glacier Flexible Retrieval に落として 40 日後に expire する Lifecycle ルールは、90 日分を払う。残りの 50 日は免除されず、日割りの独立した usage type として現れる。Standard-IA なら EarlyDelete-SIA が $0.0125/GB-月、One Zone-IA は EarlyDelete-ZIA が $0.01、Glacier Instant Retrieval は EarlyDelete-GIR が $0.004、Glacier Flexible Retrieval は EarlyDelete-ByteHrs が $0.0036。上書きも削除に数えられる。別のクラスへの transition も削除に数えられる。 毎月クラスを整理し直すお掃除ジョブは、触ったクラスすべての最小期間を払うことになる。

下限より小さいと、冷たいほうが実バイトあたり高くなる。 Standard-IA は 1 オブジェクトにつき最低 128 KB を課金するので、そのサイズより下ではオブジェクト単位の月額が 128 × $0.0125 で固定される。一方 S3 標準は実サイズ × $0.023 で下がり続ける。2本の線が交わるのは 約 69.6 KiB。それより小さいオブジェクトでは、同じバイト数に対して Standard-IA のストレージのほうが S3 標準より高い。One Zone-IA の交点は約 55.7 KiB、Glacier Instant Retrieval は約 22.3 KiB。ついでに言うと、2024 年 9 月以降に作成された 128 KB 未満のオブジェクトは、明示的にサイズフィルタを足さない限り S3 Lifecycle が transition してくれない。AWS はデフォルトを安全側に倒した。

具体例。 平均 64 KiB のサムネイル 500 万個を、最初から Standard-IA に PUT して 45 日で削除する。実データは 305.2 GiB。Standard-IA では 1 オブジェクト 128 KiB で課金されるので 610.4 GiB。

明細 S3 Standard S3 Standard-IA
課金対象バイト 305.2 GiB 610.4 GiB
ストレージ 1.5 か月分 $10.53 $11.44
PUT リクエスト 500 万 $25.00 $50.00
合計 $35.53 $61.44

冷たいほうが 73% 高い。差額 $25.91 の内訳は、ストレージが $0.92、リクエストが $25.00。唯一比較されたはずのストレージ行は、差額の4%しか説明していない。 ここに1オブジェクト1回の読み込みを足すと、Standard-IA には GET が $5.00、取り出し料金が $3.05 乗る。S3 標準側は GET の $2.00 だけだ。

「安いアーカイブ」の往復ぶんを全部足す。 図の 1 MiB × 100 万オブジェクトを最小期間の 90 日置き、Standard retrieval で全件復元して一時コピーを7日保持する。transition が $30.00、40 KB のオブジェクト単位メタデータを含む Glacier ストレージ3か月分が $11.40、復元リクエストが $50.00、取り出したバイトが $9.77、一時コピーの S3 標準ストレージが $5.24、GET が $0.40。合計 $106.81。同じ3か月を S3 標準に置いて同じ1回を読むと $67.78。Glacier のほうが 58% 高く、そして移行の動機だったストレージ行は $106.81 のうち $11.40。全体の 11% にすぎない。復元したデータが AWS の外へ出るなら、この上にさらにデータ転送 (out) が乗る。

GB 単価だけでクラスを比べるのが、この記事が止めようとしている唯一の間違いだ。 比較に使ったその単価は、比較で勝つように最適化された単価でもある。何かを移す前に、オブジェクトの個数を数え、サイズの中央値を測り、データが実際に何日生きるかを書き出すこと。請求額を決めるのはその3つで、GB 単価は同点のときの決め手にすぎない。

出典