結論
「アタッチ」はできないが、「ルーティング先に指定」はできる。
背景
サービスが軌道に乗り、アクセス数も増えてきたため、EC2をスケールアウトすることにした。
しばらくすると、サブネットに配置できるEC2が限界を迎えてしまったため、
サブネットを追加することにした。1
サブネットを追加する
ymlテンプレートを更新し、CloudFormationにアップロードすると…
A load balancer cannot be attached to multiple subnets in the same Availability Zone: 'ap-northeast-1a' (Service: AmazonElasticLoadBalancing; Status Code: 400; Error Code: InvalidConfigurationRequest; Request ID: 7fbf2ff1-dbf4-4e8c-8403-0a9f2021426d; Proxy: null)
ALBに同じAZから複数のサブネットをアタッチできないとエラーが出て失敗する。
アベイラビリティーゾーンごとに 1 つだけサブネットを指定できます。
新しいサブネットはALB側ではなくオートスケーリンググループ側の設定で追加する
オートスケーリンググループ側のサブネット設定画面で、同じAZから複数のサブネットを追加できる。
ELBのロードバランス先を決めているのはターゲットグループ
仕組みを述べると以下のような整理となる。
- オートスケーリングによって作成されたEC2は、オートスケーリンググループ側に設定されたいずれかのサブネットに配置される(ここは、同じAZから複数のサブネットを設定できる)。
- オートスケーリングによって作成されたEC2は、オートスケーリンググループ側に設定されたターゲットグループに所属させられる。
- ALBとターゲットグループは、リスナーによって対応付けが定義される。
- ALBへのリクエストは、対応付けられたターゲットグループに所属するいずれかのEC2に負荷分散される。
ALBの負荷分散先はターゲットグループに所属するEC2であり、ロードバランス先のサブネットを追加したいのであれば、ターゲットグループに、追加したいサブネットに所属するEC2を追加してやれば良い。
なお、ターゲットグループ側にサブネットを設定する箇所は無く、任意のサブネットのEC2を追加できる。サブネットを特定したい場合は、オートスケーリング側に設定する。オートスケーリングを利用しない場合は、ターゲットグループに直接、追加したいサブネットに配置している個々のEC2を追加してやれば良い。
なお、VPCはターゲットグループ側にも設定するため、VPC外のEC2をターゲットグループに追加することはできない。
それではALBに設定するサブネットとは何か?
「ALBに設定するサブネット」と「ターゲットグループ内のインスタンスが所属するサブネット」が別概念であるということが分かった。前者は1つのAZから1つのサブネットしかアタッチできない。
前者については、ALBの実体というか、エンドポイントのようなもの(ENIか?)を各AZにつき1つずつ設定しなければならないと理解している。
こちらのサイトの図がイメージしやすいと思う。
まとめ
- ALB側に設定する「サブネット」は1AZにつき1つしか設定できないが、ALB側に設定していないサブネットにもリクエストを分散させることは可能である。
- リクエストを分散させたいEC2はターゲットグループに設定する。オートスケーリングを使用しているのであれば、オートスケーリンググループに複数のサブネットを設定し、ターゲットグループに紐づける。
-
サブネットを増やすのではなく、既存のサブネットのIPアドレスのセグメントを拡張するほうが望ましいが、すでに他のサブシステム等が利用しているサブネットでIPアドレスを確保しているなどの制約があり採用できなかった。 ↩