「オンデマンドだけでクラウドを使うのは定価でしか買い物をしないのと同じだ」と佐藤CTOは笑った。「予約、Savings Plans、Spotを組み合わせれば、50-70%のコスト削減が可能だ。」
1. 料金プランの比較
| プラン | 割引率 | 柔軟性 | コミットメント | 適用場面 |
|---|---|---|---|---|
| オンデマンド | 0% | 最高 | なし | 一時的ワークロード |
| Savings Plans | 最大72% | 高い | 1年/3年 | ベースライン負荷 |
| Reserved Instances | 最大72% | 低い | 1年/3年 | 固定ワークロード |
| Spot Instances | 最大90% | 中断あり | なし | 耐障害性あるワークロード |
2. Savings Plans
// Savings Plans のカバレッジ設計
interface SavingsPlanDesign {
computePlan: {
hourlyCommitment: number; // $/hour
term: '1year' | '3year';
paymentOption: 'all_upfront' | 'partial_upfront' | 'no_upfront';
coverage: number; // カバレッジ率(%)
};
}
// ベースライン負荷の70-80%をSavings Plansでカバー
// 残りの20-30%はオンデマンド + Spot
const plan: SavingsPlanDesign = {
computePlan: {
hourlyCommitment: 15.0, // $15/hour = 月$10,800
term: '3year',
paymentOption: 'partial_upfront', // 前払い一部 → 最大割引
coverage: 75, // ベースラインの75%をカバー
},
};
// オンデマンド月$20,000 → Savings Plans適用で月$8,000 (60%削減)
3. Spot Instances
// Spot Fleet 戦略
interface SpotStrategy {
allocationStrategy: 'capacity-optimized' | 'lowest-price' | 'diversified';
instanceTypes: string[]; // 複数タイプで可用性向上
interruptionHandling: {
gracefulShutdownSec: number;
drainBeforeTermination: boolean;
fallbackToOnDemand: boolean;
};
}
const spotConfig: SpotStrategy = {
allocationStrategy: 'capacity-optimized', // 中断リスクが最も低いプールから
instanceTypes: [
'c5.xlarge', 'c5a.xlarge', 'c5d.xlarge', // 同等スペックの複数タイプ
'c6i.xlarge', 'c6a.xlarge', // 世代違いも含める
'm5.xlarge', 'm5a.xlarge', // ファミリー違いも
],
interruptionHandling: {
gracefulShutdownSec: 120,
drainBeforeTermination: true, // ELBからドレインしてから終了
fallbackToOnDemand: true, // Spot が取れない場合はオンデマンド
},
};
Spot 中断ハンドリング
// EC2 メタデータで2分前の中断通知を検知
async function checkSpotInterruption(): Promise<boolean> {
try {
const res = await fetch(
'http://169.254.169.254/latest/meta-data/spot/instance-action',
{ signal: AbortSignal.timeout(1000) }
);
if (res.ok) {
const action = await res.json();
console.log(`Spot interruption: ${action.action} at ${action.time}`);
// グレースフルシャットダウン開始
await drainConnections();
await saveCheckpoint();
return true;
}
} catch {
// 中断通知なし(正常)
}
return false;
}
4. 最適な組み合わせ
graph TD
subgraph strategy["コスト最適化の組み合わせ戦略"]
PEAK["ピーク (10%)<br/>Spot + オンデマンド<br/>中断耐性あるワーカー"]:::peak
VARIABLE["変動分 (20%)<br/>オンデマンド<br/>柔軟にスケール"]:::variable
BASE["ベースライン (70%)<br/>Savings Plans<br/>長期コミットで安価"]:::base
end
PEAK --- VARIABLE --- BASE
classDef peak fill:#E74C3C,stroke:#A93226,color:#FFFFFF
classDef variable fill:#F39C12,stroke:#B7770D,color:#FFFFFF
classDef base fill:#27AE60,stroke:#1E8449,color:#FFFFFF
| ワークロード | 推奨プラン | 理由 |
|---|---|---|
| 本番Webサーバー | Savings Plans + オンデマンド | 安定稼働必須 |
| バッチ処理 | Spot | 中断してもリトライ可能 |
| 開発環境 | Spot + オンデマンド | コスト最小化 |
| DB (RDS) | Reserved Instances | インスタンス固定 |
まとめ
| トピック | 要点 |
|---|---|
| Savings Plans | ベースライン70-80%をカバー、最大72%割引 |
| Spot | バッチ/ワーカーに最適、最大90%割引、中断ハンドリング必須 |
| 組み合わせ | 70% SP + 20% オンデマンド + 10% Spot が典型パターン |
チェックリスト
- 料金プランの種類と割引率を説明できる
- Savings Plansのカバレッジ設計ができる
- Spot Instancesの中断ハンドリングを実装できる
- ワークロードに応じた最適な組み合わせを提案できる
次のステップへ
予約・Spot戦略を学んだ。次は FinOpsプラクティス で、組織全体でのコスト最適化文化を構築しよう。
推定読了時間: 30分