Rails5 + ActionCableをGAEにデプロイできなかったのでGKEにした


ActionCable is 何?

WebSocketを使ったリアルタイム処理をRails wayでお手頃に使えるフレームワーク

Google App Engine is not supported WebSocket!!

便利になったActionCableをGAEをにサクっとデプロイして本番稼働しようとおもったらGAEはWebSocket非対応のためActionCableが利用できません。

サポート対象外の機能
次に示す機能は、App Engine フレキシブル環境ではサポートされません。
バックエンド サービスへの HTTP/2 トラフィック
WebSocket
インスタンスに直接アクセスする HTTP リクエスト
https://cloud.google.com/appengine/docs/flexible/ruby/how-requests-are-handled

Google Cloud PlatformでActionCableを利用するには?

HTTP(S)ロードバランサはWebSocketリクエストを自動的にアップグレードしてくれるため、バックエンドにGCEかGKEをデプロイしておけば対応することができます。

HTTP(S) ロードバランサが HTTP(S) クライアントからの WebSocket アップグレード リクエストを認識し、バックエンド インスタンスからアップグレード成功のレスポンスが返されると、現在の接続期間中、ロードバランサが両方向のトラフィックのプロキシとして機能します。バックエンドからアップグレード成功のレスポンスが返されないと、ロードバランサが接続を終了します。
https://cloud.google.com/compute/docs/load-balancing/http/?hl=ja

ロードバランサを使わずに自前でnginxを立てても可

こうやればできるけど素直にHTTP(S)ロードバランサ使ったほうが楽ですね。

server {
  location /cable {
    proxy_pass http://0.0.0.0:3000/cable;
    proxy_http_version 1.1;
    proxy_set_header Upgrade websocket;
    proxy_set_header Connection Upgrade;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

Rails + ActionCableのGCPでの最小構成図

ActionCableはredis(or postgresql)が必要なのでもう1台GCEが必要になります。

はやくGAEでもActionCableが利用できるようになりますように!