冷たいストレージは安いストレージではない
- 時間課金されない
- 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 万個の小さいオブジェクトはこれを確実に見つける。
内側から外側への境界:
- S3 Standard。ここを越えると: $0.00。無料。 下限なし・最小期間なし
- S3 Standard-IA。ここを越えると: $0.01 / 1,000。 最小 30 日・128 KB 下限
- S3 Glacier Instant Retrieval。ここを越えると: $0.02 / 1,000。 最小 90 日・128 KB 下限
- S3 Glacier Flexible Retrieval。ここを越えると: $0.03 / 1,000。 最小 90 日・+40 KB/オブジェクト
- S3 Glacier Deep Archive。ここを越えると: $0.05 / 1,000。 最小 180 日・+40 KB/オブジェクト
一番内側だけが無料。リングを1枚越えて外に出るたびに関所がある。
で、いくらなの
冷たくするのにリクエスト代がかかる。 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ステップずつ:
- アプリケーション から S3 Standard: PUT × 1,000,000。個数メーターで課金、$0.005/1k = $5.00。
- S3 Standard から Glacier Flexible: Lifecycle transition × 1,000,000。個数メーターで課金、$0.03/1k = $30.00。
- アプリケーション から Glacier Flexible: RestoreObject × 1,000,000 (Standard)。個数メーターで課金、$0.05/1k = $50.00。
- Glacier Flexible から S3 Standard: 取り出したバイト → 一時コピー。GBメーターで課金、976.6 GiB × $0.01 = $9.77。
- S3 Standard から アプリケーション: GET × 1,000,000。個数メーターで課金、$0.0004/1k = $0.40。 (応答)
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 単価は同点のときの決め手にすぎない。
出典
- aws.amazon.com/s3/pricing/
- aws.amazon.com/s3/storage-classes/
- docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html
- docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-transition-general-considerations.html
- docs.aws.amazon.com/AmazonS3/latest/userguide/restoring-objects.html
- docs.aws.amazon.com/AmazonS3/latest/userguide/restoring-objects-retrieval-options.html
- docs.aws.amazon.com/AmazonS3/latest/userguide/intelligent-tiering-overview.html
- docs.aws.amazon.com/AmazonS3/latest/userguide/aws-usage-report-understand.html
- aws.amazon.com/ebs/pricing/
- docs.aws.amazon.com/ebs/latest/userguide/how_snapshots_work.html
- docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/checklistforunwantedcharges.html