概要
ストレージ単価の安さだけで判断しない
Archiveはストレージ単価が最安な代わりに取得単価が最も高い。ストレージ費と取得費を必ずセットで試算しないと「安くするための移行」が実質値上げになる。
最低保存期間は「安さ」の裏にある制約
Nearline30日・Coldline90日・Archive365日という最低保存期間を無視して新しいデータを移すと、早期削除・変更時にペナルティが発生する。
一度きりの手動移行ではなく自動階層化
GCS Object Lifecycle Managementは経過日数条件でオブジェクトを自動的に遷移させる仕組み。増え続けるデータに継続対応できる設計が要る。
法定保存とアクセス頻度は別軸
「長期保存が必要」と「頻繁にアクセスされる」は別の話。年1回未満アクセスかつ保存確定のデータにのみArchiveを限定適用する。
問題
ECサイト MOps チームのシニアエンジニアとして、キャンペーンクリエイティブ・注文/イベントログを保管している GCS バケット(合計42TB、全データ Standard クラス)のストレージコストレビューを任された。後輩エンジニアが「全データを Archive クラスへ一括移行すれば大幅にコスト削減できる」という Bad コスト比較メモを作成し、来週のインフラ定例でこのまま提案する予定だという。以下の Bad メモから 設計・試算上の問題(7点)を洗い出し、Good案へ再設計してください。
制約・前提条件
- 単価前提(東京リージョン想定、月額/GB): Standard 3.45円 / Nearline 2.40円(取得1.5円/GB、最低保存30日)/ Coldline 0.90円(取得3.0円/GB、最低保存90日)/ Archive 0.375円(取得7.5円/GB、最低保存365日)/ クラス変更操作 1.5円/1,000件
- キャンペーンクリエイティブ 8,192GB: 0-30日(1,536GB)はCDN配信・日次バッチ参照 / 31-90日(3,072GB)は月1回程度の再利用 / 91日超(3,584GB)は年1回の棚卸しのみ
- 注文/イベントログ 30,720GB(日次追加・法定保存7年): 0-90日(6,144GB)は週次BQ外部テーブル集計 / 91-180日(6,144GB)は月次リコンサイル / 181-365日(12,288GB)は四半期1回の監査 / 366日超(6,144GB)は年1回未満アクセス
- バックアップ 4,096GB: ほぼアクセスなし(年数回の復元テストのみ)
- データ増加: 月あたり約2TB増。推定オブジェクト数: 平均1MB/オブジェクト仮定で約4,404万個
- エンジニア単価: 80万円/月(20営業日=4万円/人日)。移行工数見積もり: Terraformでのlifecycle_rule定義・検証・監視設定で3人日
悪いコスト比較メモ (Before)
件名: GCSストレージコスト削減のご提案
現状: 全データ(42TB)を Standard クラスで保管
43,008GB × 3.45円/GB・月 = 148,377.6円/月
改善案: 全データを即座に Archive クラスへ一括移行
43,008GB × 0.375円/GB・月 = 16,128円/月
削減額: 148,377.6円 − 16,128円 = 132,249.6円/月
(削減率89.1%)
← 問題①②③: アクセスパターン無視 / 最低保存期間無視 / 取得費未計算
よって全データをArchiveへ一括移行することを提案します。
← 問題④⑤⑥⑦: 操作コスト見落とし・自動化なし
頻度別粒度なし・法定保存要件の整理なし
ヒント(段階的開示)
ヒント1 — 方向性
ヒント2 — アプローチ
- 問題①: クリエイティブの直近30日分はCDN配信・日次バッチが参照するデータであり、Archiveの取得(分〜時間オーダーの遅延)では配信要件を満たせない → アクセス頻度の高いデータはStandardに留める
- 問題②: 注文ログは日次で新規追加され続けるが、追加直後の新しいログ(0〜90日)まで即座に最低保存期間365日のArchiveへ移すと、再処理・訂正等で削除・上書きが発生した場合に早期削除ペナルティ(残存期間分を課金)が発生するリスクがある
- 問題③: 週次でBigQuery外部テーブル集計対象になっている0〜90日ログをArchiveに置くと、アクセスのたびに取得費(7.5円/GB)が発生し、月4回アクセスすると取得費だけでストレージ削減効果を上回る
- 問題④: 約4,404万オブジェクトを一括でSetStorageClassすると、クラス変更操作費(Class A operation)が一時金として発生する。オペレーションの規模・リスクを見積もっていない
- 問題⑤: 「一括移行」という一度きりの手動オペレーションであり、月2TB増え続けるデータに対する継続的な自動階層化の仕組み(ライフサイクルルール)が設計されていない
- 問題⑥: アクセス頻度が「四半期に1回」「月1回」「年1回」と多段階であるにもかかわらず、Archive一択で粒度がない。中間頻度のデータにはNearline/Coldlineが適している
- 問題⑦: 法定保存要件(7年)を踏まえた設計になっていない。Archiveは「年1回未満のアクセスかつ長期保存が確定しているデータ」にのみ限定すべきで、それ以外(181〜365日の四半期監査対象等)まで含めるのは過剰最適化
ヒント3 — 誘導
【Good ライフサイクルルール設計の骨格】
データ種別 × 経過日数 → クラス → 遷移理由
クリエイティブ 0-30日 → Standard → CDN配信・日次バッチ参照
クリエイティブ 31-90日 → Nearline → 月1回程度の再利用
クリエイティブ 91日- → Coldline → 年1回棚卸しのみ
ログ 0-90日 → Standard → 週次BQ外部テーブル集計
ログ 91-180日 → Nearline → 月次リコンサイル
ログ 181-365日 → Coldline → 四半期監査のみ
ログ 366日- → Archive → 法定保存のみ(年1回未満アクセス)
バックアップ 全期間 → Nearline → 年数回の復元テストのみ
月次コスト = Σ(クラス別GB × クラス単価) + Σ(想定アクセス頻度 × GB × 取得単価)
問題点分析(7点)
| # | 問題点 | 分類 | 改善方法 |
|---|---|---|---|
| 1 | アクセスパターンを無視した一律Archive化 | アクセス設計 | CDN配信・日次参照分はStandardに留める |
| 2 | 最低保存期間(365日)を無視した新規ログの即時移行 | 最低保存期間 | 再処理・訂正リスクを踏まえたクラス選定 |
| 3 | 取得コスト(Retrieval Cost)未計上 | コスト試算 | ストレージ費+取得費を合算して試算 |
| 4 | 一括移行のオペレーションコスト見落とし | 操作コスト | 4,404万オブジェクトの操作費用を見積もり |
| 5 | ライフサイクルルール(自動階層化)未設計 | 運用設計 | lifecycle_ruleで経過日数条件の自動遷移 |
| 6 | アクセス頻度別のクラス粒度がない | 粒度設計 | Nearline/Coldlineで中間頻度に対応 |
| 7 | 法定保存要件を踏まえたクラス限定設計がない | 要件整理 | Archiveは366日超・年1回未満アクセスに限定 |
4層ライフサイクル設計と取得コストトラップ
模範解答
修正①②⑥⑦: データ種別×経過日数別 ストレージクラス設計表
| データ種別 | 経過日数 | 容量(GB) | クラス | 遷移理由 |
|---|---|---|---|---|
| クリエイティブ | 0-30日 | 1,536 | Standard | CDN配信・日次画像最適化バッチ参照 |
| クリエイティブ | 31-90日 | 3,072 | Nearline | フォローアップ施策で月1回程度再利用 |
| クリエイティブ | 91日- | 3,584 | Coldline | 年1回のクリエイティブ棚卸しのみ |
| 注文/イベントログ | 0-90日 | 6,144 | Standard | 週次BigQuery外部テーブル集計 |
| 注文/イベントログ | 91-180日 | 6,144 | Nearline | 月次リコンサイル処理 |
| 注文/イベントログ | 181-365日 | 12,288 | Coldline | 四半期1回のコンプライアンス監査 |
| 注文/イベントログ | 366日- | 6,144 | Archive | 法定保存(7年)のみ、年1回未満アクセス |
| バックアップ | 全期間 | 4,096 | Nearline | 年数回の復元テストのみ |
クラス別ストレージ費集計
| クラス | 容量(GB) | 単価(円/GB) | 月額 |
|---|---|---|---|
| Standard | 7,680 | 3.45 | 26,496円 |
| Nearline | 13,312 | 2.40 | 31,948.8円 |
| Coldline | 15,872 | 0.90 | 14,284.8円 |
| Archive | 6,144 | 0.375 | 2,304円 |
| 合計 | 43,008 | - | 75,033.6円 |
修正③: 想定アクセス頻度ベースの取得費内訳
| 対象 | 容量(GB) | 頻度 | 単価(円/GB) | 月額換算 |
|---|---|---|---|---|
| クリエイティブ Nearline(31-90日) | 3,072 | 月1回 | 1.5 | 4,608円 |
| クリエイティブ Coldline(91日-) | 3,584 | 年1回 | 3.0 | 896円 |
| ログ Nearline(91-180日) | 6,144 | 月1回 | 1.5 | 9,216円 |
| ログ Coldline(181-365日) | 12,288 | 四半期1回 | 3.0 | 12,288円 |
| ログ Archive(366日-) | 6,144 | 年1回未満 | 7.5 | ≒0円(監査時のみ別途計上) |
| 合計 | - | - | - | 27,008円 |
現状・Bad案・Good案の3案比較
| 案 | ストレージ費/月 | 取得費/月 | 合計/月 | 現状比 |
|---|---|---|---|---|
| 現状(全Standard) | 148,377.6円 | 0円 | 148,377.6円 | - |
| Bad(全Archive一括移行) | 16,128円 | 184,320円 | 200,448円 | +35.1%(悪化) |
| Good(4層ライフサイクル) | 75,033.6円 | 27,008円 | 102,041.6円 | -31.2% |
移行工数とROI・インフラ定例への推奨文
- 移行作業(Terraformでの
lifecycle_rule定義、既存データの初期分類検証、監視設定): 3人日 × 4万円/人日 = 12万円 - 月次削減効果(Good案 vs 現状): 148,377.6円 − 102,041.6円 = 46,336円/月
- ペイバック期間 = 120,000円 ÷ 46,336円/月 ≒ 2.6ヶ月
【インフラ定例への推奨文】
全データを即座にArchiveへ一括移行するBad案は、表面上の
ストレージ削減率(89.1%)のみを見た試算であり、取得コスト
を合算すると現状より約35%コストが増加します(月+52,070.4円)。
代わりに、データ種別×経過日数に応じた4層ライフサイクルルール
(Standard/Nearline/Coldline/Archive)をTerraformで設定する
ことを推奨します。この設計により月次コストを31.2%
(46,336円/月)削減でき、移行工数12万円は約2.6ヶ月で回収
可能です。また一度設定すれば、月2TBずつ増加するデータに
対しても自動的に階層化され続けるため、継続的な運用負荷も
かかりません。
ポイント解説
実務への応用
MOpsチームのようにキャンペーンクリエイティブと注文/イベントログを大量に保持するチームでは、「ストレージが増えてきたのでとりあえず安いクラスへ」という発想に陥りやすい。しかし実務では、BigQuery外部テーブルとしての定期集計、CDN配信、コンプライアンス監査、法定保存義務など、データ種別ごとに全く異なるアクセス要件が存在する。lifecycle_ruleをTerraformでコード化しておけば、経過日数条件による自動階層化がインフラ変更の一部としてレビュー・バージョン管理でき、「気づいたら取得コストで逆に高くなっていた」という事故を防げる。
今日のまとめ
次のステップ
- 発展問題: Good案のライフサイクルルール運用開始から3ヶ月後、監査担当から「181-365日のログへのアクセス頻度が想定(四半期1回)よりも実際には月2回に増えている」という報告を受けた。この場合、Coldlineに置いたままアクセス頻度増加分の取得費を許容すべきか、Nearlineへクラスを再設計すべきかを、損益分岐アクセス頻度(何回/月を超えたらNearlineの方が安くなるか)を計算した上で判断せよ。
- 参考: GCS Object Lifecycle Management / Storage Class(Standard/Nearline/Coldline/Archive)/ Minimum Storage Duration / Retrieval Cost / Class A・B Operations / BigQuery外部テーブル