本記事では、Amazon ECS(Fargate)を用いたコンテナ環境における、システム全体のインフラ構成、データの通信フロー、および各コンポーネントの役割について解説します。
AWSのコンテナ環境は複数のサービスが複雑に連携しているため、初学者向けに全体像を体系的に整理しました。
1. 全体のインフラ構成図(通信フロー)
開発環境から本番環境のデータベース(RDS)まで、データがどのように流れていくか、およびそれを制御するセキュリティグループ(SG)の配置図です。
💡 構成のポイント:ALBからフロントとバックに直接ルーティングする理由
本構成では、ユーザーからのリクエストを「ユーザー ➔ ALB ➔ フロントエンド ➔ バックエンド ➔ RDS」と直列に中継するのではなく、ALB(Application Load Balancer)の 「パスベースルーティング」 を利用して並列に振り分けています。
-
ALBによるトラフィックの最適化
-
/api/*へのアクセス ➔ バックエンド(Spring Bootなど)へ直接ルーティング -
/(それ以外)へのアクセス ➔ フロントエンドへ直接ルーティング
-
-
主なメリット
- フロントエンドが「バックエンドへの通信の中継役」にならないため、不要なリソース消費や負荷を回避できる
- 各コンテナが独立して動作するため、トラフィックに応じたスケール(タスク数の増減)が容易である
- データベース(RDS)と通信する経路をバックエンドのみに限定できるため、セキュリティの担保が容易になる
2. 各コンポーネントの役割と必要性
全体フロー: ローカル ➔ Docker ➔ ECR ➔ ECS(タスク定義) ➔ クラスター ➔ サービス ➔ ALB ➔ RDS
① ECR(Elastic Container Registry)
- 【役割】 ローカル環境でビルドした Docker イメージを格納・保存するレジストリ(コンテナの倉庫)。
- 【なぜ必要?】 ECS はローカルPCのストレージにある Docker イメージを直接参照できないため、AWS上に一度 ECR を経由してイメージを配置する必要がある。
② RDS(MySQL)
- 【役割】 バックエンドアプリケーションが接続するリレーショナルデータベース。
- 【なぜ必要?】 ECS のコンテナは「ステートレス(状態を持たない)」な設計が基本であり、コンテナの再起動やスケール時に内部データは保持されない。そのため、永続化が必要なデータはすべて外部の独立した DB(RDS)に保存する必要がある。
③ クラスター(ECS Cluster)
- 【役割】 ECS のコンテナ群を動かすための論理的なグループ(インフラの枠組み)。
- 【なぜ必要?】 ECS のサービスやタスクを実行するための必須の入れ物であり、クラスターを境界としてリソースやセキュリティの管理が行われる。
④ タスク定義(Task Definition)
- 【役割】 Docker コンテナをどのように起動・動作させるかを記述した設定ファイル(設計図)。
-
【なぜ必要?】 ECS がコンテナを実行する際の必須パラメータであり、これがないとコンテナは起動できない。
-
※補足:タスク(Task)とは?
タスク定義(設計図)に基づいて実際に起動された、 コンテナの実体(インスタンス) を指す。
-
※補足:タスク(Task)とは?
-
【タスク定義に含まれる主なパラメータ】
- 使用する Docker イメージのパス(ECR の URL)
- 割り当てる CPU / メモリのリソース量
- コンテナのポートマッピング(ポート番号)
- アプリケーションに渡す環境変数
- ログ出力設定(CloudWatch Logs等)
- タスクに付与する IAM ロール
⑤ ECS サービス
- 【役割】 タスク定義に基づいて、指定された数のタスク(コンテナの実体)を維持・管理する仕組み。
-
【なぜ必要?】
- タスク(コンテナ)が異常終了した際に、自動で検知して新しいタスクを再起動(セルフヒーリング)するため
- ALB(ロードバランサー)のターゲットグループと自動で連動し、通信経路を確保するため
- 希望タスク数(Desired count)を維持し、運用の安定化とスケーリングを制御するため
⑥ ALB(Application Load Balancer)
- 【役割】 外部からの通信を受け付ける単一の窓口(リクエストの振り分け役)。
-
【なぜ必要?】
- ECS(Fargate)のコンテナは、起動や再起動のたびに IPアドレスが動的に変更される特性を持つ。
- ALB がその都度変わるコンテナの IP を自動追跡(ターゲットグループで管理)し、適切にルーティングを維持するため。
- 1つのエンドポイント(URL)から、パスの文字列(
/api/*や/)を識別して適切なコンテナへ通信を振り分けるため。
⑦ セキュリティグループ(SG)
- 【役割】 AWSリソース単位で設定する、通信の通過・遮断を制御する仮想ファイアウォール。
- 【なぜ必要?】 意図しないネットワークからのアクセスを完全に遮断し、許可された特定のサービス間でのみ通信を行わせるため。
3. セキュリティグループにおける具体的な通信ルール
本環境において安全性を担保するためには、以下のように「最小権限の原則」に基づいた数珠つなぎのアクセス制御を設定します。
-
ALBのセキュリティグループ
- ルール: インターネット(パブリック空間)からの HTTP / HTTPS(ポート 80 / 443)通信をすべて「許可」する。
-
ECSのセキュリティグループ
- ルール: **ALB のセキュリティグループからの通信「だけ」**を許可する(インターネットからの直接アクセスを遮断)。
-
RDSのセキュリティグループ
- ルール: **ECS(バックエンド)のセキュリティグループからの通信「だけ」**を許可する(データベースを外部から隠蔽)。
この多層防御の構造により、データベースやアプリケーションコンテナがインターネットから直接攻撃を受けるリスクを排除できます。
結論
Amazon ECS(Fargate)環境の構築においては、「タスク定義という設計図を元に、サービスがタスクを維持し、動的に変わるコンテナIPをALBが制御し、それらをセキュリティグループで厳密に守る」 というコンポーネント間の依存関係を正しく把握することが安定運用の鍵となります。
