ALBを導入したらブラウザ上で504 Gateway Time-outエラーが出るようになった
解決のためにまず確認したのは、
- ALBのCloudWatchモニタリング
- Apacheのアクセスログ
- PHPサイトのアプリケーションログ
どのログを見ても、エラーが増えたりはしていない。
Webサーバーまで到達できていないことを考えると、これはApacheやアプリケーションが原因ではない。
おそらくロードバランサーで何かおきてるんだろうとあたりをつけて、ALBの仕様を確認する。
ALBのドキュメントを確認すると、
HTTP 504: Gateway Timeout
考えられる原因:
- ロードバランサーは、接続タイムアウトが期限切れになる (10 秒) 前にターゲットへの接続の確立に失敗した。
- ロードバランサーはターゲットへの接続を確立したが、アイドルタイムアウト期間が経過する前にターゲットが応答しなかった。
- サブネットのネットワーク ACL で、ターゲットから一時ポート (1024-65535) のロードバランサーノードへのトラフィックが許可されなかった。
- ターゲットがエンティティ本文より大きな Content-Length ヘッダーを返した。ロードバランサーが欠落しているバイトを待機してタイムアウトした。
なるほど、ALBのタイムアウト設定が短すぎると、Webサーバーからのレスポンスを待ちきれずにエラーが発生したのか。
ALBの設定画面でアイドルタイムアウトの秒数を確認した
- AWS管理コンソール > EC2 > ロードバランサー
- 対象のロードバランサーを選択
-
「説明」タブを選択
-
属性 > アイドルタイムアウト の項目を確認
- 60秒 と設定があった
-
設定値を伸ばして更新する
- アイドルタイムアウトの範囲は 1 ~ 3,600 秒です。
無事、504 Gateway Time-outエラーが出なくなりました!
参考
504 Gateway Time-out が出た際は Elastic Load Balancing の設定にも注意しよう