新規システムのアーキテクチャを選定する際、バックエンドをLambdaにするか、ECS(Fargate)にするか、比較検討した内容をまとめました。
⏳ クイック比較まとめ
| 比較項目 | Lambda | ECS (Fargate) |
|---|---|---|
| アーキテクチャ | サーバーレス関数 | コンテナオーケストレーション |
| 実行時間の制限 | 最大15分 | 制限なし |
| スケーリング | 瞬時(ゼロスケール対応) | 緩やか(スケールアウト設定が必要) |
| 課金体系 | 従量課金(リクエスト数+実行時間) | 稼働時間課金(割り当てCPU+メモリ) |
| レイテンシ | コールドスタートの可能性あり | 常に安定(常駐のため) |
| ポータビリティ | 低い(AWS環境に強く依存) | 高い(Dockerイメージとして可搬) |
💡 5つの判断基準
1. ワークロードの特性(実行時間とステート)
-
Lambda
- 1回の実行時間は「最大15分」
→ 短時間で完了するステートレスな処理(APIのバックエンド、軽量な非同期処理など)に最適。
- 1回の実行時間は「最大15分」
-
ECS
実行時間の制限無し。
→ 15分を超えるような重いバッチ処理、機械学習の推論、WebSocketなどによるクライアントとの継続的な接続(ステートフルな処理)が必要な場合はこちら。
2. トラフィックの傾向とスケーラビリティ
-
Lambda
- 突発的なアクセス増に極めて強い。アクセスが来たら一瞬で自動的に並列スケールし、使われない時はゼロ台になる。
→ トラフィックの予測が難しいシステムに最適。
- 突発的なアクセス増に極めて強い。アクセスが来たら一瞬で自動的に並列スケールし、使われない時はゼロ台になる。
-
ECS
- オートスケーリングは可能だが、コンテナの起動には数十秒〜数分の時間がかかる。Lambdaほどの瞬発力はない。基本的には常に必要最小限のコンテナを稼働させておき、メトリクス(CPU使用率など)に応じてスケールアウトさせる運用になる。
3. コスト構造(従量課金 vs 稼働時間課金)
-
Lambda
- 「リクエスト回数」と「実行時間」の従量課金。アクセスが全くない夜間や休日はコストが完全にゼロになる。ただし、24時間365日絶え間なく大量のアクセスがあるシステムの場合、インフラコストが割高になる傾向がある。
-
ECS (Fargate)
- 「タスクに割り当てたCPUとメモリ」×「稼働時間」に対する課金。アクセスがゼロでも、コンテナを起動している限りコストが発生。一方で、ベースロード(常に一定のトラフィック)がある場合は、Lambdaよりもコストパフォーマンスが良くなるケースが多い。
4. レイテンシ(応答速度)のシビアさ
-
Lambda
- しばらく実行されていない状態からリクエストを受け取ると、実行環境をゼロから準備するコールドスタートが発生し、初回レスポンスが数秒遅延することがある。
-
ECS*
- 常にコンテナが起動して待機している状態のため、コールドスタートの概念が存在しない。常に安定したレイテンシが求められる要件(例:ミリ秒単位の応答が求められるリアルタイムAPIなど)に向いている。
5. 開発体験とポータビリティ(移行のしやすさ)
-
Lambda
- インフラやOSの管理をAWSに完全に任せられるため、開発者は「ビジネスロジックのコードを書くこと」に集中できる。しかし、AWSの各種サービス(API Gateway, DynamoDB, S3など)と密結合になりやすく、他クラウドへの移行は困難になる。
-
ECS
- Dockerコンテナを利用するため、「ローカル環境で動いたコンテナイメージが、本番環境でもそのまま動く」という強力な安心感あり。将来的にGoogle Cloud (Cloud Run / GKE) やオンプレミス環境へ移行したくなった際も、コンテナごと移動させやすい(ポータビリティが高い)。
🎯 まとめ:ユースケース別のおすすめ
✅ Lambda
- トラフィックの波が激しい、または新規事業などでアクセス予測が全くつかない
- 管理画面や社内ツールなど、利用されない時間帯が長く、コストを極限まで抑えたい
- S3へのファイルアップロード、DynamoDBの更新などをトリガーとする「イベント駆動型」のシステム
- インフラ運用の手間を最小化し、少人数のチームでスピーディに開発・運用したい
✅ ECS (Fargate)
- 1回の処理に15分以上かかる重い処理や、常駐型のプロセスが存在する
- 常に一定以上の安定したトラフィックがあり、Lambdaだとコスト高になる懸念がある
- ユーザー体験上、コールドスタートによる数秒のレイテンシ悪化を絶対に許容できない
- すでにDockerベースの開発フローが確立しており、将来的なベンダーロックインを避けたい