SJ blog
backend
A

信頼度ランク

S 公式ソース確認済み
A 成功実績多数・失敗例少数
B 賛否両論
C 動作未確認・セキュリティリスク高
Z 個人所感

EC2料金モデル完全比較 — On-Demand/Reserved/Spot/Savings Plans

EC2の4つの料金モデル(On-Demand、Reserved Instance、Spot Instance、Savings Plans)の詳細比較、コスト削減率、Spot中断への対策、Savings PlansとRIの使い分けを解説。

一言結論

コスト最適化の基本戦略は常時稼働のベースラインにSavings PlansまたはRIを適用し、変動スケーリングとバッチ処理はSpot Instanceで賄うことであり、Compute Savings PlansはEC2に加えFargateとLambdaにも適用できるため最も柔軟性が高い。

EC2の4つの料金モデル

モデル割引率コミット中断リスク適用先
On-Demandなし(定価)なしなし短期・予測不能なワークロード
Reserved Instance最大72%割引1〜3年なし常時稼働の安定したワークロード
Savings Plans最大66%割引1〜3年なし柔軟なコミット(EC2/Fargate/Lambda対応)
Spot Instance最大90%割引なしあり(2分前通知)中断耐性のあるワークロード

On-Demand

最もシンプルな料金体系。使った分だけ秒単位で課金される。

用途:
- 短期または不規則なワークロード
- 新しいアプリケーションの開発・テスト
- コミット量を判断できない段階での運用

Reserved Instance (RI)

特定のインスタンスタイプ・リージョン・テナンシーをコミットして割引を受ける。

タイプの選択:
Standard RI:   最大72%割引、変更不可(インスタンスタイプ等)
Convertible RI: 最大54%割引、条件を変更可能(タイプ変更等)

支払いオプション:
All Upfront:   全額前払い(最大割引)
Partial Upfront: 一部前払い
No Upfront:    前払いなし(割引率は低い)

スコープ:
Regional RI: リージョン内のAZ間で柔軟に適用
Zonal RI:   特定AZに固定(インスタンスキャパシティを予約できる)

RIはEC2以外のサービス(RDS, ElastiCache等)にも存在する。

Savings Plans

柔軟性が高いRIの後継。特定の時間あたり使用量($/時間)をコミットする。

Compute Savings Plans:
  - EC2(全タイプ・全リージョン・全OS・全テナンシー)
  - Fargate
  - Lambda
  - 最大66%割引(最も柔軟)

EC2 Instance Savings Plans:
  - 特定リージョン・インスタンスファミリーのEC2のみ
  - 最大72%割引(RIと同等)
  - OS・サイズ・AZは変更可能

SageMaker Savings Plans:
  - SageMaker専用

RIとSavings Plansの使い分け

Reserved Instance が優れる点:
  - Zonal RIでキャパシティ予約が可能
  - 既存のRI購入システムとの互換性

Savings Plans が優れる点:
  - インスタンスタイプ変更が自由(Compute SP)
  - FargateやLambdaにも適用
  - 管理が容易

Spot Instance

未使用EC2キャパシティを利用するため最大90%割引だが、AWSがキャパシティを必要とした場合に2分前通知で中断される。

# Spot Instanceのリクエスト
aws ec2 request-spot-instances \
  --instance-count 5 \
  --type one-time \
  --launch-specification '{
    "ImageId": "ami-xxx",
    "InstanceType": "m5.xlarge",
    "KeyName": "my-key",
    "SpotPrice": "0.2"
  }'

# Spot Fleet(複数タイプから最安値を選択)
aws ec2 request-spot-fleet \
  --spot-fleet-request-config '{
    "SpotPrice": "0.5",
    "TargetCapacity": 10,
    "LaunchSpecifications": [
      {"InstanceType": "m5.xlarge", "SpotPrice": "0.2"},
      {"InstanceType": "m4.xlarge", "SpotPrice": "0.19"},
      {"InstanceType": "r5.large", "SpotPrice": "0.15"}
    ],
    "AllocationStrategy": "lowestPrice"
  }'

Spot中断への対策

中断耐性のあるワークロード:
- バッチ処理(途中から再開可能)
- 機械学習訓練(チェックポイント保存)
- Webクローリング
- CIパイプライン
- 画像・動画処理

中断への対応策:
1. Spot中断通知(2分前)をポーリング or EventBridgeで検知
2. チェックポイントをS3に保存
3. Auto ScalingグループでOn-Demandとのミックス設定
# Spot中断通知の検知
import requests

token = requests.put(
    'http://169.254.169.254/latest/api/token',
    headers={'X-aws-ec2-metadata-token-ttl-seconds': '21600'}
).text

response = requests.get(
    'http://169.254.169.254/latest/meta-data/spot/termination-time',
    headers={'X-aws-ec2-metadata-token': token}
)

if response.status_code == 200:
    print(f"Spot中断予告: {response.text}")
    # チェックポイント保存・クリーンアップ処理

Auto Scalingとの組み合わせ

# Auto Scaling混合インスタンス設定(On-Demand + Spot)
MixedInstancesPolicy:
  LaunchTemplate:
    LaunchTemplateSpecification:
      LaunchTemplateId: lt-xxx
    Overrides:
      - InstanceType: m5.xlarge
      - InstanceType: m4.xlarge
      - InstanceType: m5a.xlarge
  InstancesDistribution:
    OnDemandBaseCapacity: 2        # 最低2台はOn-Demand
    OnDemandPercentageAboveBaseCapacity: 20  # 追加分の20%はOn-Demand
    SpotAllocationStrategy: capacity-optimized  # 中断確率が低いプールを優先

コスト最適化の推奨戦略

ベースライン(常時稼働分): Savings Plans or RI
変動分(スケーリング):     Spot Instance(中断耐性あり)or On-Demand
バッチ処理:               Spot Instance
開発環境:                 Spot Instance or スケジュールRDS停止

試験頻出ポイント

シナリオ回答
中断してはいけないワークロードでコスト削減Reserved InstanceまたはSavings Plans
バッチ処理でコスト最小化Spot Instance
キャパシティを予約したいZonal Reserved Instance
FargateとEC2に同じコミットを適用Compute Savings Plans
Spot中断通知のタイミング2分前

まとめ

EC2のコスト最適化はOn-DemandとSpotの組み合わせが基本だ。安定したベースラインにSavings PlanまたはRI、変動部分とバッチにSpotを使うことで最大70〜80%のコスト削減が可能だ。