ECS Managed Instances 入門:ALB 経由で nginx コンテナを公開してみる

はじめに

こんにちは。satyamです。
本記事では、ECS Managed Instances を使用し、nginx コンテナを Application Load Balancer 経由で公開する方法を紹介します。

ECS Managed Instances は、EC2 ベースの実行環境を利用しつつ、プロビジョニング、スケーリング、パッチ適用、メンテナンスなどのインフラ管理の一部を ECS 側に任せられる新しいコンピューティングオプションです。

ECS を実運用に近い形で利用する場合、コンテナを起動するだけでなく、ALB でリクエストを受け付け、ECS Service で管理されるコンテナへ転送する構成がよく使われます。

そこで本記事では、nginx ベースのデモイメージを ECS Managed Instances 上で起動し、ALB とターゲットグループを組み合わせて、ブラウザから ECS タスク上の nginx 画面へアクセスできることを確認します。

目次

構成図

以下の図は、本記事で構築する構成を示しています。

動作フロー

  • ユーザーがブラウザから 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 に戻しておきます。