LESSON 30分

「オンデマンドだけでクラウドを使うのは定価でしか買い物をしないのと同じだ」と佐藤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分