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_settingsConnectionSettingIdleTimeout項目を追加してあげればよい。

すべての環境に対する汎用オプション aws:elb:policies

 記載例としては下記のようになる。例では600秒にしている。

option_settings:
  ...
  - namespace: aws:elb:policies
    option_name: ConnectionSettingIdleTimeout
    value: 600
  ...

よくある誤解

 Elastic Beanstalk のコンソールからの設定ではこの値は変更することが出来ない。(2017/7現在)

 「設定>ロードバランサー>接続のストリーミング」あたりの数値をいじっても変わらないので注意しよう。