No.240
【AWS】【Elastic Beanstalk】ELBのタイムアウト設定
プロセスは動いているのにELBからの反応が返ってこない…
EB環境だけに限った話ではないのだが、ELB経由で重いページを表示するとレスポンスが返ってこず、画面が真っ白になってしまうことがある。
ブラウザのインスペクタで通信を見てみると、60秒きっかりで「504 GATEWAYTIMEOUT」が返ってきている。
これが原因なのは間違いないので調べてみると、なんとELBはデフォルトだと60秒でタイムアウトする設定になっている。マジか。
というわけで回避策を。
ELBで設定
Elastic Beanstalk などを使っていない場合はELBの設定を、ELB構築ごとに変える必要がある。
EC2コンソールからロードバランサーを開き「説明>属性」にある「アイドルタイムアウト」の項目を確認する。デフォルトだと60秒になっているはずだ。
「アイドルタイムアウトの編集」からお望みの時間に変更してあげよう。
.ebextensionsによる設定
Elastic Beanstalk を使用している場合、デプロイ時に.ebextensions
による記述でELBの値を変更することが出来る。
具体的にはoption_settings
にConnectionSettingIdleTimeout
項目を追加してあげればよい。
すべての環境に対する汎用オプション aws:elb:policies
記載例としては下記のようになる。例では600秒にしている。
option_settings:
...
- namespace: aws:elb:policies
option_name: ConnectionSettingIdleTimeout
value: 600
...
よくある誤解
Elastic Beanstalk のコンソールからの設定ではこの値は変更することが出来ない。(2017/7現在)
「設定>ロードバランサー>接続のストリーミング」あたりの数値をいじっても変わらないので注意しよう。