ECS(Fargate)でコンテナを起動その2(ALBを利用したルーティング&CodeDeployの下準備)
はじめに
記事の目的
以前の記事では、パブリックサブネット上に直接ECSサービスを作成し、タスクに割り当てられたIPアドレスに直接アクセスした。
これだとタスクを起動するたびにIPアドレスが変わってしまうので、今回は、ALBを用意してコンテナへのルーティングを実施する。
前提・環境
ECSのクラスターは以下記事で作成したものを利用する。
ECS(Fargate)でコンテナを起動する方法メモ(基礎編:nginxアプリ) - エンジニアを目指す日常ブログdockerイメージは以下記事でECRにpush済の、Reactのイメージを利用する。 tomiko0404.hatenablog.com
VPC、サブネットは新たに作成する。ALBを作成するために2つ以上のAZを指定する必要がある。また、Fargateのサービスを作成する際、プライベートサブネットしか指定できない。
- public-subnet-1a
- public-subnet-1c
- private-subnet-1a
- private-subnet-1c
VPCの作成方法とパブリックサブネットの作成方法は以下に記載。 tomiko0404.hatenablog.com
実施内容(サマリ)
ALBを作成→ECSのサービスを作成の順番で実施する。
参考資料:
https://pages.awscloud.com/rs/112-TZM-766/images/AWS_CICD_ECS_Handson.pdf
ALBの作成
ALB用セキュリティグループ作成
マネジメントコンソールの「VPC」→「セキュリティグループ」
インバウンドルールの設定を実施。
- タイプ:HTTP
- ソース:
0.0.0.0/0
(フルオープン)
ALBの作成
マネジメントコンソールの「EC2」→「ロードバランサー」→「ロードバランサーの作成」
- 今回はALBを選択
- Schemeは「Internet-facing」を選択。(インターネットからアクセスしたいので)
- IP address type は「IPv4」を選択。
- VPCは先ほど作ったVPCを選択。
- Mappingにサブネットを設定する。「public-subnet-1a」と「public-subnet-1c」を選択。(インターネットからアクセスしたいので)
サブネットの設定は、ヘルプを見ると「2つ以上のアベイラビリティーゾーン(AZ)を有効にする」「AZごとに1つのサブネットを選択」とのこと。 - 「Security Group」は先ほど作成したものを選択。
- Listenerの設定でターゲットグループの設定を求められるので、適当にCreate target groupしておく。(このターゲットグループは使わないので後で消す)
リスナーとは「リスナーとは、設定したプロトコルとポートを使用して接続リクエストをチェックするプロセスです。リスナーに対して定義したルールにより、ロードバランサーが登録済みターゲットにリクエストをルーティングする方法が決まります。」とのこと。
Application Load Balancer のリスナー - Elastic Load Balancing
リスナーとターゲットグループの削除
先ほど作ったリスナーとターゲットグループを削除しておく。
リスナーはロードバランサの詳細画面から、ターゲットグループはEC2コンソールの「ターゲットグループ」から。
IAMロールの作成
Fargateサービスで「ブルーグリーンデプロイメント」をする際に、CodeDeployを利用可能なIAMロールを与える必要があるので、事前に作成する。
IAMロールの作成 → 「CodeDeploy」→「CodeDeploy - ECS」を選択する。
Fargateサービスの作成
タスク定義の作成
- 起動タイプはFargateとする。
- タスクロールは無しとする。
- ネットワークモードは変更しない。
- タスクメモリ(GB)とタスクCPU(vCPU)は最小のものにする。
- コンテナを追加。
- イメージはECRからURLコピーしてdockerイメージを指定する。
- ポートマッピングは80とする。
サービスの作成
作成したタスク定義から「アクション」→「サービスの作成」
基本設定
- 起動タイプはFargateとする。
- プラットフォームのバージョンはLATESTとする。
- クラスターは以前作成したクラスターを選択する。
- タスクの数は今回1とする。
- 最小ヘルス率は50としておく。最大率は200としておく。
- デプロイメント方法を指定する。
- ローリングアップデート:最小ヘルス率と最大率で指定されたタスク数を守りながら、旧バージョンから新バージョンにタスク定義を切り替える。
- Blue/Greenデプロイメント:そもそもブルーグリーンデプロイメントは、本番環境を2つ用意しておき、ロードバランサの向き先を旧環境から新環境に変更することでリリースする方法。
参考:3分でわかる ブルーグリーンデプロイメント | 日経クロステック(xTECH)
今回はBlue/Greenデプロイメントを選択する。
- デプロイ設定は「CodeDeployDefault.ECSAllAtOnce」とする。
- CodeDeploy のサービスロールは先ほど作ったIAMロールを設定する。
ネットワーク設定
- クラスターVPCは作成したVPCを設定する。
- サブネットは以下を設定する。(「現時点ではプライベートサブネットのみサポートしています。」との注意が表示される。以前パブリックサブネットでもできたが…)
- private-subnet-1a
- private-subnet-1c
- セキュリティグループは新規作成でHTTPのフルオープンを設定しておく。
- パブリックIPの自動割り当ては「Disabled」にする。(今回はALB経由でアクセスするため)
- ロードバランサの種類は「ALB」を選択する。
- ロードバランサ名は先ほど作ったロードバランサを設定する。
- ロードバランス用のコンテナを追加する。
- プロダクションリスナーポートは80とする。
- テストリスナーはチェックを外しておく。
- Blue/Greenデプロイメントのために2つのターゲットグループを作成する。
- AutoScalingは無しにしておく。
結果の確認
タスクが作成された。
作成していたロードバランサーにリスナーが追加された。
ターゲットグループが作成された。 IPアドレス欄に記載されているプライベートIPアドレスは、先ほど作成されたタスクのプライベートIPアドレスと一致する。
ALBのDNS名にアクセスすると、作成したアプリが表示された。
構成図(イメージ)
おそらくこんな感じ。
おわりに
ECS Fargateでコンテナを立ち上げてALB経由でアクセスすることができた。デプロイの方法は後日実施する。
関連記事
このあと実施したこと
- 今回作成したFargateを使ってBlue/Green デプロイを実施。 tomiko0404.hatenablog.com