AS部 古川です。
本記事では、ALBのターゲットグループにALBは登録できないことについて記載します。
背景
以下のマイクロサービスアーキテクチャにB/Gデプロイを実装するために、様々な制約がある中でアーキテクチャを選択する必要がありました。
- 各サービスにAWS Fargeteを使用
- グローバルIPアドレスを固定する必要があったので、前段にNLBを使用
- 複数のサービスをパスベースでルーティングするために、ALBを使用
- NLBのターゲットグループにALBを設定するために、ALBにIPアドレスを付与
※IPアドレスの付与に関する詳しい実装方法については以下の記事を参考にしてください。
- 各インフラリソースをServerless FrameworkでIaC化
- CI/CDツールはJenkinsを使用
方針
B/Gデプロイを実現するには、ALBの加重ラウンドロビンを使用して加重割合を調整する必要があります。
また、今回は加重ラウンドロビンに使用するALBの後ろに、パスベースのルーティングを行えるロードバランサーを置くことにしました。
1つ1つのコンテナサービスにB/G用のECSタスクセットを使用する方法もありますが、サービスが複数ある場合にデプロイのダウンタイムを考慮する必要があることと、
Jenkinsfileの大幅改修による実装コストの大きさから、今回はECSタスクセットを使用しないとことにしました。
※ECSタスクセットの実装については、以下の記事を参照してください
ALBを使用(NGパターン)
以下の構成図のように、パスベースルーティング用ALBを、加重ラウンドロビン用ALBのターゲットグループに設定できるかどうか実施しました。
実施方法は、加重ラウンドロビン用ALBと同様にこちらの方法でAWS Lambdaを使用しALBに直接IPアドレスを付与し、加重ラウンドロビン用ALBのターゲットグループに登録できるかを試しました。
しかし、ALBのターゲットグループにALBのIPアドレスを付与したところ、以下のようなエラーが発生しました。
AWS Japanに問い合わせたところ、ALBのターゲットグループにALBに付与したIPアドレスは登録できない
ことがわかりました。
(抜粋) You cannot register the IP addresses of another Application Load Balancer in the same VPC.
Nginxでリバースプロキシ
パスベースルーティングにALBを使用できなかったので、Nginxのリバースプロキシを使用することにしました。
なお、NginxをAWS Fargateで起動します。
AWS Fargateで動いている各サービスに特定のパスでアクセスするために、Service Discoveryを使用してプライベートDNS名前空間へのサービスの登録を行います。(※AWS公式ドキュメント)
さいごに
ALBのターゲットグループにALBを登録可能か、検索してもなかなか答えが見つからなかったので、実際に手を動かして試してみました。 NLBのターゲットグループにはALBのIPアドレスを登録できるので、ALBのターゲットグループにも登録可能かと思われるかもしれませんが、登録不可能なのでご注意ください。