AWS Elastic BeanstalkでWebSocketサーバーから426 Upgrade Required
備忘録として
※個人記事のため記載内容に誤りが含まれる可能性があります
やりたいこと
Application Load BarancerがWebSocketに対応したということで
Elastic Beanstalk上のNode.jsでWebSocketサーバーを立てる。
WebSocket Clientは汎用のものにしたい。(Not Socket.io)
環境
・PC
MacBook Pro (Retina 13-inch、Early 2015)
OS X El Capitan 10.11.6
・Elastic Beanstalk
64bit Amazon Linux 2017.03 v4.1.1 running Node.js
Proxy Server Nginx
ハマったポイント
・Elastic Beanstalkコンソール(ウェブページ)からアプリケーションを作ると
通常のELBしか選択できなく、ALBを使うにはebコマンドで作る必要があった
2017/07/14現在
・Socket.io ≠ Websocketプロトコル
wscatとかWebSocket Clientから接続できない。
勉強不足で気づかんかった。
That is why a WebSocket client will not be able to successfully connect to a Socket.IO server, and a Socket.IO client will not be able to connect to a WebSocket server (like ws://echo.websocket.org) either.
→$ npm install ws
・WebSocket Clientから接続すると426 Upgrade Required
超ハマった。
Elastic Beanstaikを作ったときのデフォルト設定で自動生成される
00_elastic_beanstalk_proxy.conf
のお陰でそのままだと
HTTP upgrade request が処理できない。
直接編集しても再デプロイすると元にもどる。
かなり長い時間掛けて調べた結果、 以下のページを発見。
つまるところプロジェクトフォルダ直下に作成した
.ebextentionsの中に以下のような設定ファイルを含めて
デプロイすることで解決。
.ebextentions/enable-websockets.config
これでWebSocket通信が通るようになるが、
Elastic Beanstalkのヘルスチェックがデフォルトだと
http GETでステータスコード200で帰ってくる想定になっているので
真っ赤になっているはず。
応急処置としてALBの見てるターゲットグループのヘルスチェックを編集して
成功コード426としたがあんまり良くない。