ちょっといきぬき

vimとかpythonとかロボットとかMLとか環境構築とかの興味ある技術のことを書きたいだけの人生だった。

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から接続できない。
 勉強不足で気づかんかった。

github.com

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 が処理できない。
直接編集しても再デプロイすると元にもどる。

かなり長い時間掛けて調べた結果、 以下のページを発見。

scopestar.com

つまるところプロジェクトフォルダ直下に作成した
.ebextentionsの中に以下のような設定ファイルを含めて
デプロイすることで解決。

.ebextentions/enable-websockets.config

gist.github.com

これでWebSocket通信が通るようになるが、
Elastic Beanstalkのヘルスチェックがデフォルトだと
http GETでステータスコード200で帰ってくる想定になっているので
真っ赤になっているはず。

応急処置としてALBの見てるターゲットグループのヘルスチェックを編集して
成功コード426としたがあんまり良くない。