はじめに
Amazon ECSでコンテナを実行する際、最初に直面する重要な選択が「起動タイプ」の決定です。ECSには主に2つの起動タイプがあります。サーバーレスでインフラ管理が不要なFargateと、EC2インスタンス上でコンテナを実行するEC2起動タイプです。
どちらを選ぶべきかは、プロジェクトの要件、チームのスキルセット、コスト最適化の優先度によって異なります。本記事では、両者の特徴を詳しく比較し、ワークロードに応じた最適な選択ができるよう解説します。
この記事を読むことで、以下のことが理解できるようになります。
- FargateとEC2起動タイプのアーキテクチャの違い
- 管理負荷、セキュリティ、スケーラビリティの観点からの比較
- 料金体系の違いとコスト試算の考え方
- ワークロード別の最適な起動タイプの選び方
ECSの起動タイプとは
ECSの起動タイプは、コンテナを「どこで」実行するかを決定する設定です。起動タイプによって、インフラの管理責任、料金体系、利用可能な機能が異なります。
flowchart TB
subgraph ECS["Amazon ECS"]
TaskDef["タスク定義"]
Service["サービス"]
end
subgraph LaunchTypes["起動タイプの選択"]
Fargate["Fargate<br/>サーバーレス"]
EC2["EC2起動タイプ<br/>仮想サーバー"]
end
subgraph FargateInfra["Fargate インフラ"]
FTask1["タスク"]
FTask2["タスク"]
FTask3["タスク"]
end
subgraph EC2Infra["EC2 インフラ"]
Instance1["EC2インスタンス"]
Instance2["EC2インスタンス"]
ETask1["タスク"]
ETask2["タスク"]
ETask3["タスク"]
ETask4["タスク"]
end
TaskDef --> Service
Service --> Fargate
Service --> EC2
Fargate --> FTask1
Fargate --> FTask2
Fargate --> FTask3
EC2 --> Instance1
EC2 --> Instance2
Instance1 --> ETask1
Instance1 --> ETask2
Instance2 --> ETask3
Instance2 --> ETask4管理責任の違い
起動タイプによって、AWSとユーザーの管理責任範囲が大きく異なります。
| 管理項目 | Fargate | EC2起動タイプ |
|---|---|---|
| コンテナランタイム | AWS | AWS |
| OSパッチ適用 | AWS | ユーザー |
| インスタンスのプロビジョニング | AWS | ユーザー |
| キャパシティ管理 | AWS | ユーザー |
| セキュリティパッチ | AWS | ユーザー |
| ECSエージェント更新 | 不要 | ユーザー |
Fargateの特徴とメリット
AWS Fargateは、サーバーレスでコンテナを実行するコンピューティングエンジンです。EC2インスタンスの管理なしに、タスク定義で指定したリソース(vCPU、メモリ)を持つコンテナを起動できます。
Fargateのアーキテクチャ
Fargateでは、各タスクが独自の分離された環境で実行されます。
flowchart TB
subgraph FargateArch["Fargate アーキテクチャ"]
subgraph Task1["タスク1"]
Container1A["コンテナA"]
Container1B["コンテナB"]
Kernel1["専用カーネル"]
end
subgraph Task2["タスク2"]
Container2A["コンテナA"]
Kernel2["専用カーネル"]
end
subgraph Task3["タスク3"]
Container3A["コンテナA"]
Container3B["コンテナB"]
Kernel3["専用カーネル"]
end
end
ENI1["ENI"] --- Task1
ENI2["ENI"] --- Task2
ENI3["ENI"] --- Task3Fargateのメリット
インフラ管理からの解放
Fargateを使用する最大のメリットは、EC2インスタンスの管理が完全に不要になることです。OSのパッチ適用、セキュリティアップデート、キャパシティプランニングといった運用タスクから解放され、アプリケーション開発に集中できます。
タスクレベルの分離
各Fargateタスクは、独自のカーネルで実行されるため、マルチテナント環境でのセキュリティが強化されます。他のタスクとカーネルを共有しないため、コンテナエスケープのリスクが軽減されます。
迅速なスケーリング
EC2インスタンスの起動を待つ必要がないため、需要に応じて素早くスケールアウトできます。Auto Scalingの設定も簡単で、CPU使用率やリクエスト数に基づいて自動的にタスク数を調整できます。
細かなリソース指定
タスクごとにvCPUとメモリを細かく指定でき、無駄なリソースを排除できます。
| vCPU | メモリ(GB) |
|---|---|
| 0.25 | 0.5、1、2 |
| 0.5 | 1〜4(1GB単位) |
| 1 | 2〜8(1GB単位) |
| 2 | 4〜16(1GB単位) |
| 4 | 8〜30(1GB単位) |
| 8 | 16〜60(4GB単位) |
| 16 | 32〜120(8GB単位) |
Fargateのデメリット
GPUサポートなし
Fargateでは、GPUを使用するワークロードを実行できません。機械学習の推論やグラフィックス処理にはEC2起動タイプが必要です。
インスタンスタイプの選択不可
特定のCPUアーキテクチャやインスタンスファミリーを指定できません。ただし、Graviton2(ARM)ベースのFargateは選択可能です。
永続的なローカルストレージなし
Fargateのエフェメラルストレージは、タスク終了時に削除されます。永続的なストレージが必要な場合は、EFSをマウントする必要があります。
EC2起動タイプの特徴
EC2起動タイプでは、ECSクラスターにEC2インスタンスを登録し、そのインスタンス上でコンテナを実行します。インフラの管理責任がユーザーにありますが、より細かな制御が可能です。
EC2起動タイプのアーキテクチャ
EC2起動タイプでは、複数のタスクが同じインスタンス上で実行されます。
flowchart TB
subgraph EC2Arch["EC2起動タイプ アーキテクチャ"]
subgraph Instance1["EC2インスタンス1"]
Agent1["ECSエージェント"]
Docker1["Dockerランタイム"]
Task1A["タスクA"]
Task1B["タスクB"]
end
subgraph Instance2["EC2インスタンス2"]
Agent2["ECSエージェント"]
Docker2["Dockerランタイム"]
Task2A["タスクA"]
Task2B["タスクC"]
end
end
ASG["Auto Scaling Group"] --> Instance1
ASG --> Instance2EC2起動タイプのメリット
GPUワークロードのサポート
P3、P4、G4などのGPUインスタンスを使用でき、機械学習の推論や動画処理などのGPUを必要とするワークロードに対応できます。
インスタンスタイプの自由な選択
コンピューティング最適化(C系)、メモリ最適化(R系)、汎用(M系)など、ワークロードに最適なインスタンスタイプを選択できます。
コスト最適化の余地
リザーブドインスタンスやSavings Plansを活用して、長期的なコスト削減が可能です。また、インスタンスの稼働率を高めることで、リソースを効率的に利用できます。
ホストレベルのカスタマイズ
カスタムAMIの使用、カーネルパラメータの調整、追加のモニタリングエージェントのインストールなど、ホストレベルでの細かなカスタマイズが可能です。
EC2起動タイプのデメリット
運用負荷の増加
EC2インスタンスのパッチ適用、セキュリティ更新、ECSエージェントの更新など、継続的な運用タスクが発生します。
キャパシティ管理の複雑さ
タスクの需要に応じてインスタンス数を適切に管理する必要があります。キャパシティプロバイダーを使用することで自動化できますが、設定と理解に時間がかかります。
スケーリングの遅延
新しいインスタンスの起動には数分かかるため、急激な負荷増加への対応がFargateより遅くなる可能性があります。
料金比較と選択基準
Fargateの料金体系
Fargateは、タスクが使用するvCPU、メモリ、ストレージに対して秒単位(最低1分)で課金されます。
| リソース | 料金(東京リージョン、Linux/x86) |
|---|---|
| vCPU | 約0.05056 USD/vCPU/時間 |
| メモリ | 約0.00553 USD/GB/時間 |
| エフェメラルストレージ | 0.000111 USD/GB/時間(20GBを超える分) |
Fargate料金計算例:1 vCPU / 2 GB メモリ
vCPU: 0.05056 USD × 1 = 0.05056 USD/時間
メモリ: 0.00553 USD × 2 = 0.01106 USD/時間
合計: 約0.062 USD/時間
月間(720時間): 約44.64 USD/タスク
EC2起動タイプの料金体系
EC2起動タイプでは、ECS自体の追加料金はなく、EC2インスタンスの料金のみが発生します。
| インスタンスタイプ | vCPU | メモリ | オンデマンド料金(東京) |
|---|---|---|---|
| t3.micro | 2 | 1 GB | 約0.0136 USD/時間 |
| t3.small | 2 | 2 GB | 約0.0272 USD/時間 |
| t3.medium | 2 | 4 GB | 約0.0544 USD/時間 |
| m5.large | 2 | 8 GB | 約0.124 USD/時間 |
| c5.xlarge | 4 | 8 GB | 約0.216 USD/時間 |
コスト比較シミュレーション
同等のリソースを使用した場合の月額コストを比較します。
シナリオ:2 vCPU / 4 GB メモリのタスクを常時3つ実行
| 起動タイプ | 構成 | 月額概算 |
|---|---|---|
| Fargate | 2 vCPU × 4 GB × 3タスク | 約267 USD |
| EC2(オンデマンド) | m5.large × 2台 | 約179 USD |
| EC2(リザーブド1年) | m5.large × 2台 | 約113 USD |
この例では、EC2起動タイプの方がコスト効率が良く見えます。しかし、EC2の場合は以下の隠れたコストも考慮が必要です。
- インスタンス管理の人的コスト
- キャパシティの余剰(バッファ)
- パッチ適用時のダウンタイムまたは追加インスタンス
コスト削減オプション
Fargate Spot
割り込み耐性のあるワークロードでは、Fargate Spotを使用することで最大70%のコスト削減が可能です。
Compute Savings Plans
Fargateの使用量が一定している場合、1年または3年のSavings Plansを購入することで最大50%の割引を受けられます。
EC2 Spot Instances
EC2起動タイプでSpotインスタンスを使用することで、最大90%のコスト削減が可能です。ただし、中断のリスクがあります。
ユースケース別の選択ガイド
Fargateが適しているケース
flowchart LR
subgraph FargateUseCase["Fargateが適しているユースケース"]
A["運用負荷を<br/>最小化したい"]
B["変動する<br/>ワークロード"]
C["セキュリティ要件が<br/>厳しい"]
D["小〜中規模の<br/>マイクロサービス"]
end
A --> Fargate["Fargate"]
B --> Fargate
C --> Fargate
D --> FargateWebアプリケーションのバックエンド
トラフィックの変動に応じて自動スケーリングし、運用負荷を最小限に抑えたい場合に最適です。
マイクロサービスアーキテクチャ
各サービスを独立してスケーリングでき、タスクレベルのセキュリティ分離が実現できます。
バッチ処理(短時間)
Fargate Spotと組み合わせることで、コスト効率の良いバッチ処理が実現できます。
開発・テスト環境
迅速な環境構築と破棄が可能で、使用していない時間の課金を最小化できます。
EC2起動タイプが適しているケース
flowchart LR
subgraph EC2UseCase["EC2起動タイプが適しているユースケース"]
A["GPUが必要"]
B["大規模で<br/>予測可能な負荷"]
C["コスト最適化が<br/>最優先"]
D["特定のインスタンス<br/>要件がある"]
end
A --> EC2["EC2起動タイプ"]
B --> EC2
C --> EC2
D --> EC2機械学習の推論
GPUインスタンスが必要な場合は、EC2起動タイプが唯一の選択肢です。
大規模で安定したワークロード
24時間365日稼働する大規模システムでは、リザーブドインスタンスとの組み合わせでコストを最適化できます。
高度なカスタマイズが必要
カスタムカーネルパラメータ、特殊なストレージ構成、ホストレベルのモニタリングが必要な場合に適しています。
コンプライアンス要件
特定のインスタンスタイプやハードウェア分離が必要なコンプライアンス要件がある場合に選択します。
起動タイプの選択フローチャート
以下のフローチャートを参考に、ワークロードに適した起動タイプを選択してください。
flowchart TB
Start["起動タイプを選択"] --> Q1{"GPUが必要?"}
Q1 -->|Yes| EC2["EC2起動タイプ"]
Q1 -->|No| Q2{"運用負荷を<br/>最小化したい?"}
Q2 -->|Yes| Fargate["Fargate"]
Q2 -->|No| Q3{"大規模で予測可能な<br/>ワークロード?"}
Q3 -->|Yes| Q4{"コスト最適化が<br/>最優先?"}
Q3 -->|No| Fargate
Q4 -->|Yes| EC2
Q4 -->|No| Q5{"インスタンスの<br/>カスタマイズが必要?"}
Q5 -->|Yes| EC2
Q5 -->|No| Fargate
EC2 --> EC2Note["リザーブド/Savings Plans<br/>Spotの活用を検討"]
Fargate --> FargateNote["Fargate Spot<br/>Savings Plansの活用を検討"]ハイブリッドアプローチ
実際のプロダクション環境では、FargateとEC2起動タイプを組み合わせたハイブリッドアプローチも有効です。
キャパシティプロバイダー戦略
ECSのキャパシティプロバイダー機能を使用すると、同一クラスター内でFargateとEC2を併用できます。
flowchart TB
subgraph Cluster["ECSクラスター"]
Service["ECSサービス"]
subgraph CapacityProviders["キャパシティプロバイダー"]
Fargate["Fargate<br/>ベース: 80%"]
FargateSpot["Fargate Spot<br/>ウェイト: 20%"]
EC2Provider["EC2<br/>GPUワークロード用"]
end
end
Service --> Fargate
Service --> FargateSpot
Service --> EC2Provider構成例:コスト最適化されたWebサービス
|
|
この設定では、最低2つのタスクをFargateで実行し、追加のタスクは75%の確率でFargate Spotで起動します。
まとめ
ECSの起動タイプ選択は、単純な「どちらが良いか」という問題ではなく、プロジェクトの要件に基づいた総合的な判断が必要です。
| 観点 | Fargate | EC2起動タイプ |
|---|---|---|
| 運用負荷 | 低い | 高い |
| スケーリング速度 | 速い | インスタンス起動分遅い |
| コスト(小規模) | やや高い | 効率が悪い |
| コスト(大規模) | 高い | 最適化可能 |
| GPU対応 | 不可 | 可能 |
| カスタマイズ性 | 低い | 高い |
選択の目安
- Fargate:運用負荷の軽減を優先し、中小規模のワークロードに最適
- EC2起動タイプ:GPUが必要、または大規模ワークロードでコスト最適化を追求する場合に選択
まずはFargateで始め、要件が明確になるにつれてEC2起動タイプへの移行やハイブリッド構成を検討するというアプローチも有効です。重要なのは、技術的な制約とビジネス要件のバランスを取りながら、継続的に最適な選択を見直していくことです。