はじめに
自作した VPC の中で動かしている Spring Boot アプリ(EC2)の前に、ロードバランサー(ALB)を立てようとしていました。
ところが ALB の作成画面で、サブネットの選択に進んだところ、**「最低2つのアベイラビリティーゾーンを選んでください」**という条件で止まってしまいました。私の VPC では、その条件をうまく満たせなかったのです。
「サブネットなら作ってあるのに、なんで足りないって言われるの?」と固まりました😅
原因は「サブネットの数」ではなく「どんなサブネットを、いくつの AZ に持っているか」でした。同じく自作 VPC で ALB に詰まった人のために残します。
環境
- AWS(EC2 + Application Load Balancer)
- 自作 VPC(
10.0.0.0/16)/ リージョン ap-northeast-1 - サブネット構成(最初の状態):
- public サブネット … 1つだけ(AZ-1a)
- private サブネット … AZ-1a / AZ-1c
起きたこと
ALB は「インターネット向け」で作るつもりでした。作成画面の「ネットワークマッピング」で、2つの AZ にチェックして、それぞれにサブネットを割り当てる必要があります。
でも私の VPC では——
- AZ-1a:public サブネットがある → OK
- AZ-1c:あるのは private サブネットだけ
という状態。インターネット向け ALB は、各 AZ でインターネットに出られる(public な)サブネットが必要なので、AZ-1c 側で選べるものがなく、2つ目の AZ を埋められませんでした。
原因
最初は「private サブネットもあるし、2つあるから大丈夫では?」と思っていました。でも、インターネット向け ALB に使うサブネットとしては、それでは足りませんでした。
ALB には、ざっくり2つの前提があります。
- 可用性のため、少なくとも2つの AZ にサブネットを指定する必要がある。
- インターネット向け ALB は、各 AZ のサブネットが public(インターネットゲートウェイへの経路を持つ)である必要がある。
私の VPC は public サブネットが AZ-1a に1つだけ。つまり「2つの AZ ぶんの public サブネット」が用意できておらず、条件を満たせなかった——というのが正体でした。「サブネットを作ってある」と「2つの AZ に public サブネットがある」は別物だったわけです。
解決
別の AZ に、2つ目の public サブネットを用意すれば解決でした。
- AZ-1c に新しいサブネットを作成(例:
10.0.4.0/24) - そのサブネットを、インターネットゲートウェイへの経路(
0.0.0.0/0 → IGW)を持つルートテーブルに関連付ける- ※ サブネットを作っただけでは public になりません。ルートテーブルの関連付けで初めて「外に出られる public サブネット」になります。
- ALB 作成画面に戻り、AZ-1a と AZ-1c の2つに、それぞれ public サブネットを割り当て
これで2つの AZ を満たせて、ALB を作成できました🎉
学び
- 基本的に ALB は、少なくとも2つの AZ にサブネットを指定する必要がある(冗長性のため)。
- インターネット向け ALB のサブネットは public(IGW への経路が必要)。
- サブネットを作る ≠ public になる。 ルートテーブルの関連付けまでやって、はじめて public サブネット。
おわりに
「サブネットは足りているはず」と思ったら、**“2つの AZ に public サブネットがあるか”**を数えてみる。自作 VPC で初めて ALB を立てる人の役に立てば嬉しいです🙌