原因が掴めなくて結構困ってたので、似たような症状を抱える人が引っかかるように原因と対策を書いておきます。
TL;DR
問題
ELB 経由で EC2 にアクセスすると、最初の接続が遅くなるときがあった。具体的には 60 秒ほど。しかし、一回接続するとしばらく大丈夫だったりする。
解決した方法
- ELB のサブネットに インターネットゲートウェイ を当てる。
インターネットゲートウェイのないサブネットを持つ ELB には接続できない。片方のサブネットにだけついてたりすると中々気づけなくて厄介。
(^o^)元凶はわたしです
これと似た症状の人には効くかも?
1. サーバーの inital connection が遅い。
ブラウザ(Chrome)の検証ツールの「Network」タブから確認
2. curl コマンドで確かめる
curl コマンドを使って状況を把握する
curl -v -k -3 SOME_URL
$ curl -v -k -3 SOME_URL
* Rebuilt URL to: SOME_URL
* Trying ELBのIP1...
* TCP_NODELAY set
* Connection failed
* connect to ELBのIP1 port 80 failed: Operation timed out
* Trying ELBのIP2...
* TCP_NODELAY set
* Connected to SOME_URL (ELBのIP2) port 80 (#0)
ELB は Availability Zone ごとに作られる ので、1 つ目の ELB にタイムアウトし、2 つ目の ELB に繋がる。
この時、タイムアウトするまでに 1 分以上かかっていた。
解決策
- 「VPC > Subnets」 で ELB に割り当ててるサブネットの Route Table を確認する
- 「VPC > Route Table」で該当の Route Table に インターネットゲートウェイを追加する
サブネットはインターネットゲートウェイをルーティングテーブルに追加すると、インターネットに繋がるようになります。
※サブネットを「パブリック」にしたくない場合は新たにサブネットを作ったりする必要があるかもしれません。
まとめ
- ELB のサブネットはインターネット経由で使う場合は、インターネットゲートウェイを付与する必要がある。
- ELB のサブネットのうち、どれか一つが設定漏れしてると中々症状に気づきにくかった
参考文献
全く同じ原因で困ってる人がいた…ありがとう Amazonian…
ELB Connection Delay to Backend Instance
この方とも状況が全く同じでした。
インターネットに公開する ELB は Private Subnet に配置してはいけない