ALBを利用してECSのサービス単位でパスパターンごとにルーティングを行う方法についてメモ書きします。
構成は下記のようになります。
このシステムではXXX_API
とYYY_API
の2つのAPIがあります。
<ホスト名>/v1/YYY/*
にアクセスがあった時はYYY_APIがあるECSサービスに接続します。
上記のパスパターンでない時はXXX_API
にアクセスするようにします。
パスパターンの設定の仕方
マネージメントコンソールから EC2 --> Load balancers --> <対象ALB> --> <対象 listener>
にアクセスし、Rules
タブから設定を行います。
上記は<ホスト名>/v1/YYY/*
にアクセスがあった時、ターゲットグループYYY-tg
にPriority (優先度) 1 (最優先)で接続する設定と、パスパターンが<ホスト名>/v1/YYY/*
以外の場合はターゲットグループXXX-tg
に接続するような設定となっています。
Manager rules
をクリックするとパスパターンの設定を行うことができます。
ターゲットグループについて
マネージメントコンソールから EC2 --> ターゲットグループ
にアクセスすることで、ターゲットグループを作成することができます。
ターゲットグループXXX-tg
、YYY-tg
についてはそれぞれ次の設定が行っています。
※ 下記はマネージメントコンソールの設定項目を書き出したものです。
"Choose a target type" = "IP addresses"
"Protocol : Port" = "HTTP: 4000"
"IP address type" = "IPv4"
"Protocol version" = "HTTP1"
"Health check protocol" = "http"
"Health check path" = "/health"
Port
については、ECSサービス、ECSタスクのcontainerPortと同じ値にする必要があります。
Health check path
については、<host名>/health
に接続できた際にレスポンス200を返すAPIがあることを前提に記載しています。実行してレスポンス200を返すAPIならなんでも良いです。
レスポンス200が返ってこないとコンテナに異常があると判断され、コンテナが再起動されます。
つまり、きちんとレスポンス200を返すAPIを設定しないとコンテナの再起動が繰り返されるので注意が必要です。
ターゲットグループとECSサービス(プラベートサブネットに配置)を紐づけると、ターゲットグループにECSサービスのプライベートアドレスが自動的に割り振られるようです。(未検証)
ALBとECSサービスの紐付け方
ALBとECSサービスの紐付けは、ALBのターゲットグループをECSサービスに設定することで行うことができます。
つまり、今回の場合は下記の作業が必要となります。
ターゲットグループXXX-tg
を作成して、ECSサービスXXX-service
のtargetGroupArn
に設定する
ターゲットグループYYY-tg
を作成して、ECSサービスYYY-service
のtargetGroupArn
に設定する
紐付けを行うには、まずマネージメントコンソールからAmazon ECS --> クラスター --> <対象クラスター名>
にアクセスし、「サービス」タブから「作成」ボタンをクリックします。(更新はできない)
ECSサービス作成中のステップ2: ネットワーク構成
まで遷移すると紐づけが行えます。
下記ではYYY_API
用のECSサービスの設定を行っています。
指定するALBはXXX_APIとYYY_APIで共通で使用する「XY-alb」を指定しています。
「ロードバランサーに追加」ボタンを押下するとどのターゲットグループを使用するか指定できます。
あとはサービスの作成を完了させて、XXX_API用のサービスも作成すればパスパターンごとにAPIを実行できるようになります。