【初心者向け】ELBからプライベートサブネットへのアクセスに困った話

記事タイトルとURLをコピーする

こんにちは。いそやです。

オンプレミスでの経験はありますが、慣れないAWSに四苦八苦しています。それでもAWSは楽しいですね!

その四苦八苦の中でも、AWSのElastic Load Balancer(ELB)の使用にあたってプライベートサブネットに配置したサーバーへのアクセスができず、とても困ったことがありました。
AWS初心者にはなかなか理解できなかったので、その顛末をブログにしました。 初めてELBを使ってみようという方が対象になります。



今回の検証用環境

f:id:swx-isoya:20211029175030p:plain インターネットゲートウェイ経由で、VPC内に構築したALB→各プライベートサブネットのwebサーバーにアクセスします。

上記の構成で、おや?と思われた方もいるかと思いますが、その違和感にたどり着くまでが長かったです…。
なお、今回はELBの中でもApplication Load Balancer(以下、ALB)を使用しました。

docs.aws.amazon.com

今回の目的

  1. HTTP接続でALBを経由して、異なるプライベートサブネットに配置したwebサーバーにアクセスを振り分けたい


困ったこと

上記の検証環境を構築し、webサーバにApcheをインストールし、簡単なwebサイトを準備しました。
ところが、ブラウザからALBにHTTP接続したところ、待てど暮らせどレスポンスがありません。
最終的にはタイムアウトとなり503エラーとなってしまいました。
セキュリティグループやルーティングテーブルの設定を見直しましたが、特に誤りと思われる該当箇所はありませんでした。

思い当たること

ALBの「サブネットの編集」で「インターネット向けロードバランサーを作成中ですが、次のサブネットにはアタッチされたインターネットゲートウェイが存在しません」との警告表示が出ていました。
f:id:swx-isoya:20211029141035j:plain
同様にアクセスできない事象に対してプライベートサブネットにインターネットゲートウェイを設定することで解消しているケースを散見しました。 しかし、インターネットゲートウェイを設定することでパブリックサブネットとなってしまい、今回の目的に合致しないため警告を無視して強行設定しました。
この時はルーティングしたいサブネットを指定するもの、と思い込んでいました。

そもそも理解できていなかったこと

そもそもALBは各AZ毎に設置される

上記の構成図のようにVPC内にALBがあれば良いと思っていました。しかし、オンプレミス環境に置き換えて考えれば、データセンター内にインターネットの入り口となるインターネットゲートウェイに繋がったALBが存在しないことがそもそもおかしいことですよね。
ですから、先ほどの「サブネットの編集」ではルーティングしたいサブネットではなく、ALBを配置したいAZ内のパブリックサブネットという理解になります。
ルーティングの対象はターゲットグループの役割ですね。

対応策

  1. プライベートサブネットしか存在しないAZにパブリックサブネットを作成
  2. ALBに紐付けるサブネットをパブリックサブネットに変更


f:id:swx-isoya:20211029141137j:plain パブリックサブネットに紐付けたところ、先ほどまで出ていた警告文が表示されていないことがわかります。

対応後の構成図はこちら。
f:id:swx-isoya:20211029175100p:plain

対応結果

無事にALB経由で各webサーバーにアクセスできました!

感想

特定のAZ内にプライベートサブネットしかない本番ではあり得ない検証環境であること、ALBのサブネット選択をミスしたことによる事象ではありましたが、おかげでALBの挙動がよく理解できました。
AWSに触れる方はクラウドネイティブな方も増えてくると思いますが、ブラックボックスになっているデータセンター内ではどうだろうか?という原点に立ち返って検討してみることも遠回りにはならない、と実感した次第です。


…と思っていたら、公式ドキュメントにばっちり解決策が書いてありました。まず公式ドキュメントを読むべきといういい教訓になりました…。それにしてもAWSって楽しいですね!

aws.amazon.com