こんにちは。植松です。
ALBを導入したシステムでブラウザ上に「504 Gateway Time-out」が出るケースがあり、対応しました。
稼働しているシステムはALB+WAF+EC2という構成です。
導入前のシステムでは発生しないトラブルでした。
- CSVをインポートして整形する処理で発生
- CSVファイルのサイズが小さいと発生しない
ということはシステムを動かしてわかりました。
ログの確認
Apacheのログをまず確認してみましたが、形跡がない。
ということは、前段のALBかWAFで何か引っ掛かっていると判断。
ALBのログ(モニタリング)を見たところ、形跡がありました。
WAFには形跡なしでした。
ALBでタイムアウトに引っ掛かったと判断し、ALBの仕様を確認してみました。
ALBの仕様を確認&設定変更
仕様には以下が記載されていました。
HTTP 504: Gateway Timeout
考えられる原因:
- ロードバランサーは、接続タイムアウトが期限切れになる (10 秒) 前にターゲットへの接続の確立に失敗した。
- ロードバランサーはターゲットへの接続を確立したが、アイドルタイムアウト期間が経過する前にターゲットが応答しなかった。
- ネットワーク ACL または SecurityGroup のポリシーで、ターゲットから一時ポート (1024-65535) のロードバランサーノードへのトラフィックが許可されなかった。
- ターゲットがエンティティ本文より大きな Content-Length ヘッダーを返した。ロードバランサーが欠落しているバイトを待機してタイムアウトした。
- ターゲットは Lambda 関数であり、接続タイムアウトが期限切れになる前に Lambda サービスが応答しませんでした。
- ロードバランサーがターゲットに接続するときに SSL ハンドシェイクタイムアウト (10 秒) が発生しました。
アイドルタイムアウト期間が怪しい。。
現状の設定を確認してみます。
60秒になっていましたので、一旦600秒に変更してみました。
再稼働確認
設定変更したので、再度システムを稼働してみると、以下のエラーに変わりました。
Gateway Timeout
The gateway did not receive a timely response from the upstream server or application.
このエラーはApacheが出しているとすぐにわかったので、ALBでのタイムアウトはクリアになったと判断できました。
Apacheのエラーログにも以下が記録されていました。
[proxy_fcgi:error] [pid 476629:tid 476673] (70007)The timeout specified has expired: [client 172.31.31.28:11862] AH01075: Error dispatching request to : (polling), referer: https://xxx.com/test.php
re:Postの記事によると、「アプリケーションのタイムアウトをロードバランサーのアイドルタイムアウト値よりも大きい値に設定します。これを行って、ロードバランサーがアイドル接続を適切に終了するようにします。」と記載があるので、ApacheのTimeoutを660にしました。
その後再度システムを稼働してみると、エラー無く処理が終了しました。
終わりに
今までALBやWAFを使っていなかったシステムにALB・WAFを適用した場合は挙動が変わる可能性があるので、リリース前の検証はしっかり行う必要があると改めて認識しました。