はじめに
こんにちは。satyamです。
本記事では、ECS Managed Instances を使用し、nginx コンテナを Application Load Balancer 経由で公開する方法を紹介します。
ECS Managed Instances は、EC2 ベースの実行環境を利用しつつ、プロビジョニング、スケーリング、パッチ適用、メンテナンスなどのインフラ管理の一部を ECS 側に任せられる新しいコンピューティングオプションです。
ECS を実運用に近い形で利用する場合、コンテナを起動するだけでなく、ALB でリクエストを受け付け、ECS Service で管理されるコンテナへ転送する構成がよく使われます。
そこで本記事では、nginx ベースのデモイメージを ECS Managed Instances 上で起動し、ALB とターゲットグループを組み合わせて、ブラウザから ECS タスク上の nginx 画面へアクセスできることを確認します。
目次
- はじめに
- 目次
- 構成図
- 事前準備(セキュリティグループ / CloudWatch Logs)
- ECS クラスター作成
- ターゲットグループ / ALB の作成
- タスク定義作成
- ECS Service 作成
- 動作確認
- まとめ
- おまけ:ECS Managed Instances の自動調整
構成図
以下の図は、本記事で構築する構成を示しています。

動作フロー
- ユーザーがブラウザから Application Load Balancer の DNS 名へアクセスします。
- Application Load Balancer が HTTP リクエストを受け付けます。
- リクエストはターゲットグループへ転送されます。
- ターゲットグループが、ECS Service によって登録された nginx タスクへリクエストを転送します。
- nginx タスク内のコンテナが、ブラウザに nginx の画面を返します。
- nginx コンテナのログは CloudWatch Logs に出力されます。
検証構成
- ECS クラスター:1
- ECS Managed Instances:使用(ECS タスクの実行基盤)
- ECS Service:1
- タスク定義:1
- コンテナイメージ:nginx ベースのデモイメージ
- Application Load Balancer:1
- ターゲットグループ:1
- CloudWatch Logs ロググループ:1
- IAM ロール:タスク実行ロール、Managed Instances 用ロール
- VPC:1(検証用 VPC)
- サブネット:パブリックサブネット 2 つ
- セキュリティグループ:Application Load Balancer 用、ECS タスク用、Managed Instances 用
事前準備(セキュリティグループ / CloudWatch Logs)
ECS クラスターおよび ECS Service を作成する前に、本検証で使用するセキュリティグループと CloudWatch Logs ロググループを準備します。
1. セキュリティグループの作成
AWS マネジメントコンソールから EC2 を選択します。
セキュリティグループ → [セキュリティグループを作成] を選択します。
以下のセキュリティグループを作成します。
- ALB 用セキュリティグループ
このセキュリティグループは、Application Load Balancer にアタッチします。
名前:ecs-mi-nginx-alb-sg 説明:Security group for nginx ALB VPC:検証用 VPC インバウンドルール:HTTP 80 / My IP

[セキュリティグループを作成] を選択します。
ブラウザから ALB にアクセスできるようにするための設定です。
※ 検証環境のため、アクセス元は My IP に制限しています。
- ECS タスク用セキュリティグループ
このセキュリティグループは、後ほど ECS Service 作成時に ECS タスクへアタッチします。
名前:ecs-mi-nginx-task-sg 説明:Security group for ECS nginx task VPC:検証用 VPC インバウンドルール:HTTP 80 / ALB 用セキュリティグループ (ecs-mi-nginx-alb-sg)

[セキュリティグループを作成] を選択します。
ALB 経由の通信のみ nginx タスクで受け付ける構成とします。
- Managed Instances 用セキュリティグループ
このセキュリティグループは、後ほど ECS クラスター作成時に Managed Instances 用として使用します。
名前:ecs-mi-managed-instance-sg 説明:Security group for ECS Managed Instances VPC:検証用 VPC インバウンドルール:なし アウトバウンドルール:すべてのトラフィック

[セキュリティグループを作成] を選択します。
本検証では、Managed Instances へ直接アクセスする必要はないため、インバウンドルールは設定しません。
2. CloudWatch Logs ロググループの作成
次に、nginx コンテナのログ出力先となるロググループを作成します。
AWS マネジメントコンソールから CloudWatch を選択します。
ログ管理 → ロググループ → [ロググループを作成] を選択します。
以下の内容でロググループを作成します。
ロググループ名:任意 保持期間:1週間(7日) ログクラス:スタンダード

[作成] を選択します。
このロググループは、後ほどタスク定義のログ設定で指定します。
ECS クラスター作成
次に、本検証で使用する ECS クラスターを作成します。
AWS マネジメントコンソールから Amazon Elastic Container Service を選択します。
クラスター → [クラスターの作成] を選択します。
クラスター名:ecs-mi-nginx-cluster
1. インフラストラクチャの設定
「コンピューティングキャパシティの取得方法を選択」では、以下を選択します。
「Fargate インスタンスとマネージドインスタンス」

本検証では、nginx タスクを Managed Instances 上で実行します。
インスタンスプロファイルの作成
インスタンスプロファイル では、以下を選択します。
「新しいインスタンスプロファイルを作成」を選択します。
ロール作成画面が開いたら、ロール名を確認して [ロールを作成] を選択します。

必要なロールおよびポリシーはコンソール側で自動的に作成され、クラスター作成画面に選択された状態で反映されます。
インフラストラクチャロールの作成
インフラストラクチャロール では、以下を選択します。
「新しいインフラストラクチャロールを作成」を選択します。
インフラストラクチャロールも同様に、ロール名を確認して [ロールを作成] を選択します。

作成後、クラスター作成画面に自動で反映されます。
インスタンス選択 では、以下を選択します。
「ECS のデフォルトを使用」

この設定により、タスク定義やサービスの要件に基づいて、ECS 側でインスタンスタイプが選択されます。
2. ネットワーク設定
ネットワーク設定 を開き、以下を設定します。
VPC:検証用 VPC サブネット:検証用のパブリックサブネット 2 つ セキュリティグループ:ecs-mi-managed-instance-sg

設定内容を確認し、[作成] を選択します。
ターゲットグループ / ALB の作成
次に、ブラウザから nginx コンテナへアクセスするためのターゲットグループと Application Load Balancer を作成します。
1. ターゲットグループの作成
AWS マネジメントコンソールから EC2 を選択します。
ロードバランシング → ターゲットグループ → [ターゲットグループの作成] を選択します。
ターゲットの種類 では、以下を選択します。
「IP アドレス」
以下の内容で設定します。
ターゲットグループ名:ecs-mi-nginx-tg プロトコル:HTTP ポート:80 VPC:検証用 VPC

[次へ] を選択します。
ターゲットを登録 画面では、IP アドレスを手動で登録しません。
「IP を指定してポートを定義する」に IP アドレスが入力されている場合は、[削除] を選択し、ターゲットが 0 件の状態にします。

[次へ] を選択し、設定内容を確認してから [ターゲットグループの作成] を選択します。
ECS Service 作成後に、nginx タスクがターゲットグループへ自動的に登録されます。
2. Application Load Balancer の作成
AWS マネジメントコンソールから EC2 を選択します。
ロードバランシング → ロードバランサー → [ロードバランサーの作成] を選択します。
ロードバランサーの種類では、[Application Load Balancer] を選択します。
- 基本的な設定
以下の内容で設定します。
ロードバランサー名:ecs-mi-nginx-alb スキーム:インターネット向け ロードバランサーの IP アドレスタイプ:IPv4

- ネットワークマッピング
以下を設定します。
VPC:検証用 VPC アベイラビリティーゾーンとサブネット:検証用のパブリックサブネット

セキュリティグループ では、事前準備で作成した ALB 用セキュリティグループを選択します。
セキュリティグループ:ecs-mi-nginx-alb-sg

- リスナーとルーティング
リスナーは以下の内容で設定します。
プロトコル:HTTP ポート:80
デフォルトアクション では、以下を選択します。
アクションのルーティング:ターゲットグループへ転送 ターゲットグループ:ecs-mi-nginx-tg

ここでは、先ほど作成したターゲットグループを指定します。
設定内容を確認し、[ロードバランサーの作成] を選択します。
タスク定義作成
次に、ECS Managed Instances 上で nginx ベースのデモコンテナを起動するためのタスク定義を作成します。
AWS マネジメントコンソールから Amazon Elastic Container Service を選択します。 タスク定義 → [新しいタスク定義の作成] を選択します。
タスク定義ファミリー名を入力します。
タスク定義ファミリー:ecs-mi-nginx-task
1. インフラストラクチャの要件
起動タイプ では、以下を選択します。
「 マネージドインスタンス 」
デフォルトで設定されていない場合は、以下の値を設定します。
オペレーティングシステム/アーキテクチャ:Linux/X86_64 ネットワークモード:awsvpc CPU:1 vCPU メモリ:2 GB

タスクロール は、今回のコンテナから AWS API を実行しないため、未指定のままとします。
タスク実行ロールでは、以下を選択します。
「 ecsTaskExecutionRole 」

2. コンテナの設定
コンテナの詳細 では、以下を設定します。
名前:nginx イメージ URI:public.ecr.aws/b8a8x1o6/nginxdemos-hello:1.0.0
ポートマッピング では、以下を設定します。
コンテナポート:80 プロトコル:TCP ポート名:http-port アプリケーションプロトコル:HTTP

リソース割り当て制限(条件付き)では、以下を設定します。
CPU:0.5 vCPU メモリのハード制限:1 GB メモリのソフト制限:1 GB

3. ログ設定
ログ収集 を有効にし、CloudWatch Logs を設定します。
ロググループ では、事前準備で作成したロググループを選択します。
ロググループ:[事前に作成したロググループ名を指定] ストリームプレフィックス:ecs
ストリームプレフィックスには任意の値を指定できます。
本検証では例として 「 ecs 」 を指定します。

設定内容を確認し、[作成] を選択します。
ECS Service 作成
次に、作成したタスク定義を実行し、起動したタスクを Application Load Balancer と連携するための ECS Service を作成します。
AWS マネジメントコンソールから Amazon Elastic Container Service を選択します。
クラスター → 「 ecs-mi-nginx-cluster 」を選択します。
サービス タブを開き、[作成] を選択します。
1. サービスの詳細
サービスの詳細 では、作成済みのタスク定義を選択します。
タスク定義ファミリー:ecs-mi-nginx-task タスク定義のリビジョン:対象リビジョン サービス名:ecs-mi-nginx-service

環境 では、対象のクラスターが選択されていることを確認します。
コンピューティング設定(アドバンスト)は、デフォルトのままとします。
2. ネットワーキング
VPC とサブネットは、ECS クラスターおよび Application Load Balancer を作成したものと同じものを選択します。
セキュリティグループでは、事前準備で作成した ECS タスク用セキュリティグループを選択します。
VPC:検証用 VPC サブネット:検証用のパブリックサブネット 2 つ セキュリティグループ:ecs-mi-nginx-task-sg

3. ロードバランシング - オプション
ロードバランシング では、[ロードバランシングを使用] を有効にします。
ロードバランサーの種類:Application Load Balancer コンテナ:nginx 80:80

Application Load Balancer では、以下を選択します。
ロードバランサー:ecs-mi-nginx-alb

リスナー では、以下を選択します。
リスナー:HTTP:80

ターゲットグループ では、以下を選択します。
ターゲットグループ名:ecs-mi-nginx-tg

設定内容を確認し、[作成] を選択します。
サービス作成後、ECS がタスクを起動し、起動したタスクをターゲットグループへ自動的に登録します。 タスクが起動し、ターゲットグループで正常な状態になるまで、2〜5分程度かかる場合があります。
動作確認
最後に、ECS Service、タスク、ターゲットグループ、ALB が正常に動作していることを確認します。
1. ECS Service の確認
AWS マネジメントコンソールから Amazon Elastic Container Service を選択します。
クラスター → ecs-mi-nginx-cluster を選択します。
サービス タブを開き、作成したサービスを選択します。
サービス名:ecs-mi-nginx-service
サービスの状態とタスク数を確認します。
ステータス:アクティブ デプロイとタスク:1/1 件の実行中のタスク

2. ECS タスクの確認
タスク タブを開き、実行中のタスクを選択します。
タスクおよびコンテナの状態を確認します。
タスクの状態:実行中 コンテナ名:nginx ステータス:Running


3. ターゲットグループの確認
AWS マネジメントコンソールから EC2 を選択します。
ターゲットグループ → ecs-mi-nginx-tg を選択します。
ターゲット タブを開き、ECS タスクがターゲットとして登録されていることを確認します。
ポート:80 ヘルスステータス:Healthy

4. ALB の DNS 名へアクセス
AWS マネジメントコンソールから EC2 を選択します。
ロードバランシング → ロードバランサー → ecs-mi-nginx-alb を選択します。
詳細画面で ALB の DNS 名をコピーし、ブラウザからアクセスします。

nginx の画面が表示されれば、ALB からターゲットグループを経由して、ECS Managed Instances 上の nginx コンテナへ正常にアクセスできています。
5. CloudWatch Logs の確認
AWS マネジメントコンソールから CloudWatch を選択します。
ログ → ログ管理 → ロググループ → 「対象のロググループ」を選択します。
ログストリームが作成され、コンテナログが出力されていることを確認します。


以上で、ALB からターゲットグループを経由して、ECS Managed Instances 上の nginx コンテナへアクセスできることを確認できました。
あわせて、ECS Service、タスクの起動状態、ターゲットのヘルスチェック、CloudWatch Logs へのログ出力も確認できました。
まとめ
本記事では、ECS Managed Instances を使用し、Application Load Balancer 経由で nginx ベースのデモコンテナを公開しました。
ECS Managed Instances により、EC2 ベースの実行環境を利用しながら、基盤となるキャパシティ管理の一部を ECS に任せられることを確認できました。
また、ALB → ターゲットグループ → ECS タスク のリクエストの流れや、CloudWatch Logs へのログ出力も確認しました。
今回の構成は、ECS Managed Instances と ALB を組み合わせた Web アプリケーション構成を理解するための基本となります。
今後は、カスタムアプリケーションイメージのデプロイや ACM 証明書を利用した HTTPS 化など、より実運用に近い構成へ発展させることができます。
おまけ:ECS Managed Instances の自動調整
ECS Managed Instances では、ECS タスクの実行に必要なキャパシティを ECS 側で自動的に準備できます。
そのため、EC2 ベースの実行環境を利用しながら、インスタンス管理の手間を減らすことができます。
動作を確認したい場合は、AWS マネジメントコンソールから対象の ECS Service を開きます。
Amazon Elastic Container Service → クラスター → [対象クラスター] → サービス → [対象サービス]
[サービスを更新] を選択し、必要なタスク数を 1 から 2 に変更してサービスを更新します。
更新後、追加のタスクが起動し、ターゲットグループで Healthy になることを確認できます。
確認が完了したら、不要なリソース利用を避けるため、必要なタスク数を 1 に戻しておきます。




