EC2購入オプション完全ガイド:On-Demand、Reserved、Savings Plans、Spot

Shunku

EC2のコストを最適化するには、ワークロードの特性に応じた購入オプションの選択が重要です。AWSは4つの主要な購入オプションを提供しており、適切に組み合わせることで大幅なコスト削減が可能です。

購入オプションの概要

flowchart TB
    subgraph Options["EC2購入オプション"]
        OnDemand["On-Demand<br/>従量課金"]
        Reserved["Reserved Instances<br/>予約"]
        Savings["Savings Plans<br/>コミットメント"]
        Spot["Spot Instances<br/>余剰キャパシティ"]
    end

    OnDemand --> |"柔軟性最大"| Flex["柔軟なワークロード"]
    Reserved --> |"最大72%割引"| Steady["安定したワークロード"]
    Savings --> |"最大72%割引"| Commit["コミット可能"]
    Spot --> |"最大90%割引"| Fault["中断耐性あり"]

    style OnDemand fill:#3b82f6,color:#fff
    style Reserved fill:#22c55e,color:#fff
    style Savings fill:#f59e0b,color:#000
    style Spot fill:#8b5cf6,color:#fff

比較表

項目 On-Demand Reserved Savings Plans Spot
割引率 0% 最大72% 最大72% 最大90%
コミットメント なし 1年/3年 1年/3年 なし
柔軟性 最高 低 中〜高 中断あり
用途 不定期利用 安定利用 コミット可能 中断耐性

On-Demand Instances

特徴

flowchart LR
    subgraph OnDemand["On-Demand"]
        O1["秒単位課金"]
        O2["コミットメントなし"]
        O3["即座に起動"]
        O4["いつでも停止"]
    end

    style OnDemand fill:#3b82f6,color:#fff

適したユースケース

ユースケース 理由
開発/テスト 予測困難、短期利用
突発的な負荷 Auto Scalingでの追加
新規ワークロード 使用量が未知
短期プロジェクト コミット不要

Reserved Instances (RI)

タイプと支払いオプション

flowchart TB
    subgraph RI["Reserved Instances"]
        subgraph Types["タイプ"]
            Standard["Standard RI<br/>変更制限あり"]
            Convertible["Convertible RI<br/>変更可能"]
        end

        subgraph Payment["支払いオプション"]
            AllUpfront["全額前払い<br/>最大割引"]
            PartialUpfront["一部前払い<br/>中程度割引"]
            NoUpfront["前払いなし<br/>最小割引"]
        end
    end

    style Standard fill:#22c55e,color:#fff
    style Convertible fill:#3b82f6,color:#fff

割引率(3年、Linux)

タイプ 全額前払い 一部前払い 前払いなし
Standard 〜62% 〜60% 〜56%
Convertible 〜54% 〜52% 〜48%

Standard vs Convertible

項目 Standard Convertible
インスタンスファミリー変更 ❌ ✅
OS変更 ❌ ✅
テナンシー変更 ❌ ✅
マーケットプレイス売却 ✅ ❌
割引率 高い 低い

リージョナル vs ゾーン

項目 リージョナルRI ゾーンRI
キャパシティ予約 なし あり
AZの柔軟性 あり 特定AZのみ
インスタンスサイズ 柔軟(同ファミリー内) 固定

Savings Plans

タイプ

flowchart TB
    subgraph SavingsPlans["Savings Plans"]
        Compute["Compute Savings Plans<br/>最大66%割引"]
        EC2["EC2 Instance Savings Plans<br/>最大72%割引"]
        SageMaker["SageMaker Savings Plans"]
    end

    Compute --> |"EC2, Fargate, Lambda"| Flexible["最も柔軟"]
    EC2 --> |"特定ファミリー"| Discount["最大割引"]

    style Compute fill:#f59e0b,color:#000
    style EC2 fill:#22c55e,color:#fff

Compute vs EC2 Instance Savings Plans

項目 Compute SP EC2 Instance SP
リージョン変更 ✅ ❌
ファミリー変更 ✅ ❌
OS変更 ✅ ✅
テナンシー変更 ✅ ✅
対象サービス EC2, Fargate, Lambda EC2のみ
割引率 中程度 最大

RI vs Savings Plans

flowchart TD
    Q1{"柔軟性を重視?"}
    Q2{"サービス横断?"}
    Q3{"最大割引を重視?"}

    Q1 -->|Yes| Q2
    Q1 -->|No| RI["Reserved Instances"]

    Q2 -->|Yes| ComputeSP["Compute Savings Plans"]
    Q2 -->|No| Q3

    Q3 -->|Yes| EC2SP["EC2 Instance SP"]
    Q3 -->|No| ComputeSP

    style RI fill:#22c55e,color:#fff
    style ComputeSP fill:#f59e0b,color:#000
    style EC2SP fill:#3b82f6,color:#fff

Spot Instances

概要

AWSの余剰キャパシティを最大90%割引で利用できます。ただし、2分前の通知で中断される可能性があります。

flowchart TB
    subgraph Spot["Spot Instances"]
        Request["Spotリクエスト"]
        Pool["Spotプール"]
        Interrupt["中断通知"]
    end

    Request --> |"入札価格"| Pool
    Pool --> |"キャパシティ不足時"| Interrupt
    Interrupt --> |"2分前通知"| Terminate["終了"]

    style Interrupt fill:#ef4444,color:#fff

中断対策

戦略 説明
複数AZ/ファミリー キャパシティプールの分散
Spot Fleet 複数プールから調達
中断ハンドリング 通知を検知して処理
チェックポイント 進捗を定期保存

中断通知の検知

# EC2メタデータから中断通知を確認
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" \
    -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")

curl -H "X-aws-ec2-metadata-token: $TOKEN" \
    http://169.254.169.254/latest/meta-data/spot/instance-action

Spot Fleet

{
  "SpotFleetRequestConfig": {
    "IamFleetRole": "arn:aws:iam::xxx:role/SpotFleetRole",
    "TargetCapacity": 10,
    "SpotPrice": "0.05",
    "AllocationStrategy": "capacityOptimized",
    "LaunchTemplateConfigs": [
      {
        "LaunchTemplateSpecification": {
          "LaunchTemplateId": "lt-xxx",
          "Version": "1"
        },
        "Overrides": [
          {"InstanceType": "m5.large", "AvailabilityZone": "ap-northeast-1a"},
          {"InstanceType": "m5.xlarge", "AvailabilityZone": "ap-northeast-1a"},
          {"InstanceType": "m4.large", "AvailabilityZone": "ap-northeast-1c"}
        ]
      }
    ]
  }
}

適したユースケース

flowchart TB
    subgraph SpotUseCases["Spotに適したワークロード"]
        Batch["バッチ処理"]
        CI["CI/CDパイプライン"]
        ML["機械学習トレーニング"]
        HPC["HPCクラスター"]
        Analytics["ビッグデータ分析"]
    end

    style SpotUseCases fill:#8b5cf6,color:#fff

購入オプションの組み合わせ

ベースライン + 変動対応

flowchart TB
    subgraph Baseline["ベースライン(予測可能)"]
        RI["Reserved / Savings Plans"]
    end

    subgraph Variable["変動部分"]
        Spot["Spot<br/>(中断耐性あり)"]
        OnDemand["On-Demand<br/>(中断耐性なし)"]
    end

    subgraph Total["総キャパシティ"]
        Mix["RI/SP 60% + Spot 30% + OD 10%"]
    end

    Baseline --> Mix
    Variable --> Mix

    style Baseline fill:#22c55e,color:#fff
    style Variable fill:#f59e0b,color:#000

Auto Scaling Groupでの混合

{
  "MixedInstancesPolicy": {
    "InstancesDistribution": {
      "OnDemandBaseCapacity": 2,
      "OnDemandPercentageAboveBaseCapacity": 20,
      "SpotAllocationStrategy": "capacity-optimized"
    },
    "LaunchTemplate": {
      "LaunchTemplateSpecification": {
        "LaunchTemplateId": "lt-xxx",
        "Version": "$Latest"
      },
      "Overrides": [
        {"InstanceType": "m5.large"},
        {"InstanceType": "m5.xlarge"},
        {"InstanceType": "m4.large"}
      ]
    }
  }
}

コスト最適化のフレームワーク

選択フローチャート

flowchart TD
    Start["ワークロードの特性は?"]
    Q1{"24/7稼働<br/>安定利用?"}
    Q2{"中断に<br/>耐えられる?"}
    Q3{"サービス横断<br/>の柔軟性?"}

    Start --> Q1
    Q1 -->|Yes| Q3
    Q1 -->|No| Q2

    Q2 -->|Yes| Spot["Spot Instances"]
    Q2 -->|No| OnDemand["On-Demand"]

    Q3 -->|Yes| ComputeSP["Compute SP"]
    Q3 -->|No| EC2SP["EC2 Instance SP / RI"]

    style Spot fill:#8b5cf6,color:#fff
    style OnDemand fill:#3b82f6,color:#fff
    style ComputeSP fill:#f59e0b,color:#000
    style EC2SP fill:#22c55e,color:#fff

推奨割合

ワークロードタイプ RI/SP Spot On-Demand
本番Webサーバー 70% 0% 30%
バッチ処理 20% 70% 10%
開発/テスト 0% 50% 50%
CI/CD 0% 80% 20%

まとめ

flowchart TB
    subgraph Options["購入オプション"]
        OD["On-Demand"]
        RI["Reserved Instances"]
        SP["Savings Plans"]
        Spot["Spot"]
    end

    OD --> |"柔軟性"| Flexible["不定期利用"]
    RI --> |"最大割引"| Stable["安定利用"]
    SP --> |"バランス"| Commitment["コミット可能"]
    Spot --> |"最安"| Interruptible["中断耐性"]

    style Options fill:#3b82f6,color:#fff
オプション 主なユースケース 割引率
On-Demand 不定期/テスト 0%
Reserved 安定した本番 〜72%
Savings Plans 柔軟なコミット 〜72%
Spot バッチ/CI/CD 〜90%

適切な購入オプションの組み合わせにより、パフォーマンスを維持しながらEC2コストを大幅に削減できます。

参考資料