Dockerコンテナのデプロイ・管理・スケーリングを行うコンテナオーケストレーションサービス
アプリを動かすとき、「コンテナ」という仕組みを使うと、アプリに必要なものをすべて1つの箱に詰め込んで、どこでも同じように動かせます。自分のパソコンでも、クラウドでも、まったく同じ箱を使うので「自分の環境では動いたのに...」という問題がなくなります。
しかし、この箱(コンテナ)を本番環境で安定して動かし続けるのは大変です。箱が壊れたら新しい箱を起動し、アクセスが増えたら箱を増やし、古い箱を新しい箱に入れ替える...。こうした「コンテナの運用管理」を自動でやってくれるのがコンテナオーケストレーションです。
Amazon ECS(Elastic Container Service)は、AWSが提供するコンテナオーケストレーションサービスです。下の図のように、コンテナイメージ(箱の設計図)をECRに保管し、タスク定義で実行条件を決め、サービスが常にコンテナを動かし続けます。
ECSはAWSの他のサービスと深く統合されており、コンテナを使ったWebアプリの構築から運用まで、AWSのエコシステムの中でシームレスに行えます。以下が主な特徴です。
タスク定義(Task Definition)は、コンテナを動かすための「レシピ(設計図)」です。料理のレシピに「材料」「分量」「手順」が書かれているように、タスク定義には以下の情報が書かれています。
- CPU / メモリ: コンテナに割り当てるコンピューティングリソースの量
- ポートマッピング: 外部からのアクセスをコンテナのどのポートに繋ぐか
- 環境変数: データベースの接続先やAPIキーなどの設定値
- ログ設定: ログの出力先(CloudWatch Logs等)
my-web-app:1、my-web-app:2のようにリビジョン番号が振られ、新バージョンをデプロイするときはリビジョンを上げてサービスを更新します。問題があれば古いリビジョンにロールバックも可能です。レストランに例えると、サービスはフロアマネージャーです。「テーブルには常に3皿出ている状態を維持して」という指示(desired count)に従い、料理(タスク)が片付けられたら新しく作り直します。
サービスはWebアプリのように「常に動いていてほしい」ワークロードのための仕組みです。タスクが異常終了しても自動で新しいタスクを起動して数を維持します。バッチ処理のように「1回実行して終わり」のワークロードにはサービスは不要で、タスクを直接起動します。
「常にN個のタスクを動かしたい」という数値。サービスはこの数を維持するために、タスクの起動・終了を自動管理します。Auto Scaling と連携すればアクセス量に応じて自動で増減もできます。
新バージョンをデプロイするとき、古いタスクを1つずつ新しいタスクに入れ替えます。常にヘルシーなタスクが残っているのでダウンタイムゼロでリリースできます。
CodeDeploy と連携して使います。まず新バージョンのタスク(Green)を別に起動し、ヘルスチェックが通ったらトラフィックを旧バージョン(Blue)から Green に切り替えます。切り替え後に問題が見つかった場合は、Blue がまだ残っているので即座にロールバックできます。ローリングアップデートより安全なため、本番環境ではこちらが推奨されます。
タスクはコンテナが実際に動く「箱」です。タスク定義(設計図)を元にサービスが起動し、中で1つ以上のコンテナが実行されます。
Fargate 起動タイプの場合、各タスクには専用の ENI(ネットワークインターフェース)が割り当てられ、プライベート IP アドレスを持ちます。CPU・メモリもタスク単位で確保されるため、他のタスクの影響を受けません。
タスクとコンテナは別物です。タスクは「実行環境」でENI・CPU・メモリを提供し、その中でコンテナが動きます。1つのタスクに複数のコンテナを入れることも可能です(例: Webアプリ + サイドカーログ収集)。
Fargate ではタスクごとに専用の ENI(ネットワークインターフェース)が付与されます。各タスクが固有の IP を持つため、セキュリティグループをタスク単位で設定でき、他のタスクと完全に分離されます。
PROVISIONING(リソース確保中)→ PENDING(起動待ち)→ RUNNING(稼働中)→ STOPPED(停止)。サービスが管理するタスクは STOPPED になると自動で新しいタスクが起動されます。
ECS でコンテナを動かすとき、「誰がサーバーを管理するか」を選べます。これが「起動タイプ」です。
Fargate は「サーバーのことは AWS に任せて、コンテナだけに集中したい」モードです。サーバーの購入・セットアップ・パッチ適用・スケーリングをすべて AWS がやってくれます。マンションの賃貸のようなもので、管理は大家さん(AWS)任せです。
EC2 は「サーバーを自分で管理する代わりに、自由にカスタマイズしたい」モードです。一戸建てを買うようなもので、修繕も自分でやるけど壁に穴を開けるのも自由です。
| 比較項目 | Fargate | EC2 |
|---|---|---|
| サーバー管理 | ほぼゼロ(サーバーレス) | EC2 の運用・パッチ適用が必要 |
| ネットワーク | awsvpc(タスクごとに専用 ENI) | bridge / awsvpc / host 選択可 |
| コスト | やや高い(リソース単価) | 大規模なら安い(RI / Spot 利用可) |
| コスト削減策 | FARGATE_SPOT(最大70%割引) | Spot Instance / RI / Savings Plans |
| カスタマイズ | 制限あり(OS 設定不可) | 自由(カーネル / ストレージ設定可) |
| GPU | 非対応 | GPU インスタンス利用可能 |
| スケール速度 | 速い(数十秒) | EC2 起動を含むため遅い |
| セキュリティ | タスク分離が強い(専用 ENI) | EC2 内で複数タスクが同居可能 |
ほとんどの Web アプリ・API サーバー・マイクロサービスは Fargate で十分です。サーバー管理が不要なのでチームがアプリ開発に集中でき、スケーリングも数十秒で完了します。迷ったら Fargate から始めましょう。
GPU が必要(機械学習推論など)、大規模でコスト最適化が重要(数百タスク以上で RI / Spot を活用)、OS レベルのカスタマイズが必要(カーネルパラメータ変更など)な場合に EC2 を選びます。
Fargate のコストが気になる場合、FARGATE_SPOT を使うと最大 70% 割引になります。ただし AWS の都合でタスクが中断される可能性があるため、中断に耐えられるワークロード(バッチ処理、開発環境など)に向いています。

AWSリソースへのアクセスを安全に管理する認証・認可サービス

AWSリソースへのアクセスを安全に管理する認証・認可サービス

リレーショナルデータベースの構築・運用を自動化するマネージドサービス

リレーショナルデータベースの構築・運用を自動化するマネージドサービス

リレーショナルデータベースの構築・運用を自動化するマネージドサービス

リレーショナルデータベースの構築・運用を自動化するマネージドサービス