こんにちは。植松です。

ALBを導入したシステムでブラウザ上に「504 Gateway Time-out」が出るケースがあり、対応しました。
稼働しているシステムはALB+WAF+EC2という構成です。
導入前のシステムでは発生しないトラブルでした。

  • CSVをインポートして整形する処理で発生
  • CSVファイルのサイズが小さいと発生しない

ということはシステムを動かしてわかりました。

ログの確認

Apacheのログをまず確認してみましたが、形跡がない。
ということは、前段のALBかWAFで何か引っ掛かっていると判断。
ALBのログ(モニタリング)を見たところ、形跡がありました。
000510_1.pngWAFには形跡なしでした。
ALBでタイムアウトに引っ掛かったと判断し、ALBの仕様を確認してみました。

ALBの仕様を確認&設定変更

仕様には以下が記載されていました。

HTTP 504: Gateway Timeout
考えられる原因:

  • ロードバランサーは、接続タイムアウトが期限切れになる (10 秒) 前にターゲットへの接続の確立に失敗した。
  • ロードバランサーはターゲットへの接続を確立したが、アイドルタイムアウト期間が経過する前にターゲットが応答しなかった。
  • ネットワーク ACL または SecurityGroup のポリシーで、ターゲットから一時ポート (1024-65535) のロードバランサーノードへのトラフィックが許可されなかった。
  • ターゲットがエンティティ本文より大きな Content-Length ヘッダーを返した。ロードバランサーが欠落しているバイトを待機してタイムアウトした。
  • ターゲットは Lambda 関数であり、接続タイムアウトが期限切れになる前に Lambda サービスが応答しませんでした。
  • ロードバランサーがターゲットに接続するときに SSL ハンドシェイクタイムアウト (10 秒) が発生しました。

アイドルタイムアウト期間が怪しい。。
現状の設定を確認してみます。
000510_2.png60秒になっていましたので、一旦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を適用した場合は挙動が変わる可能性があるので、リリース前の検証はしっかり行う必要があると改めて認識しました。