AWSのロードバランサーはセキュリティグループに自分のグループIDを含めないと504 Gatewaytimeoutになります。いや~こんなの気づかないでしょ。フツー。

環境・構成


こんな感じです。

  • ロードバランサーはALB(Application Load Balancer)を使用
  • ロードバランサーにはとあるインスタンスを紐づけている
  • ヘルスチェックはインスタンスのHTTP・80番ポートを指定
  • Route53でドメインをAレコードにし、AliasをYesにしロードバランサーに紐づけている

現象


ロードバランサーに紐づけているEC2インスタンスにはElasticIPを付与しており、ElasticIP指定ではアプリケーションにアクセスできるものの、ドメイン指定では504 Gatewaytimeoutがでてしまうという状況でした。

また、ロードバランサーのヘルスチェックは失敗している状態で、ロードバランサーのターゲットタブでは「これらのいずれのアベイラビリティーゾーンにも、正常なターゲットは含まれていません。リクエストはすべてのターゲットにルーティング中です。」のメッセージが表示され、ステータスがunhealthyになっていました。

原因


ロードバランサーに設定しているセキュリティグループでロードバランサーからEC2へのアクセスが弾かれているのが原因でした。その結果、ヘルスチェックに失敗して504が発生していました。ここが504だったのでEC2のアプリ側に問題があるのではないかと疑った結果かなり時間をとられました。

というか、504だとわかんないでしょ。普通はアプリ側疑うよね…。まさかロードバランサー・EC2の間で失敗してると思わないですやん。こんなの。

対応


下記の手順で対応します。

  • ロードバランサーのセキュリティグループで表示されているグループIDを控える
  • セキュリティグループを開く
  • インバウンドに自身のグループIDを指定する

以上です。

いや、こんなのわかんないでしょ。というか、ロードバランサーに指定しているセキュリティグループのせいでEC2にアクセスできないってちょっとイケてなさすぎ(AWSの設計的に)だと思うのですが…。これって自分で自分の首絞め上げてるような感じですよ。この後、上司も同じ問題にぶつかっていたので、やっぱりフツーはわかんないんだと思います。