CloudFront ディストリビューションで WebSockets を使用する
Amazon CloudFront は、WebSocket の使用をサポートしています。これは、クライアントとサーバー間の長時間の双方向性接続が必要な場合に便利な TCP ベースのプロトコルです。永続的な接続は、多くの場合、リアルタイムアプリケーションでの要件です。WebSockets を使用するシナリオには、ソーシャルチャットプラットフォーム、オンラインコラボレーションワークスペース、マルチプレイヤーゲーム、および金融取引プラットフォームのようなリアルタイムのデータフィードを提供するサービスが含まれます。WebSocket 接続経由のデータは、全二重通信に対して双方向に流れることができます。
WebSocket 機能は自動的に有効になり、どのディストリビューションでも動作します。WebSockets を使用するには、ディストリビューションにアタッチされているキャッシュ動作で次のいずれかを設定します。
すべてのビューワーリクエストのヘッダーをオリジンに転送します (AllViewer マネージドオリジンリクエストポリシーを使用できます)。
具体的には、オリジンリクエストポリシーで
Sec-WebSocket-Key
およびSec-WebSocket-Version
リクエストヘッダーを転送します。
WebSocket プロトコルの仕組み
WebSocket プロトコルは、独立した TCP ベースのプロトコルであり、これによって HTTP のオーバーヘッド (および潜在的なレイテンシーの増加) の一部を回避することができます。
WebSocket 接続を確立するために、クライアントはプロトコルの変更のため HTTP のアップグレードセマンティクスを使用する通常の HTTP リクエストを送信します。その後、サーバーはハンドシェイクを完了できます。WebSocket 接続は開いたままで、クライアントまたはサーバーが毎回新しい接続を確立する必要なしに互いにデータフレームを送信できます。
デフォルトでは、WebSocket プロトコルは通常の WebSocket 接続にポート 80 を使用し、TLS/SSL 経由の WebSocket 接続ではポート 443 を使用します。CloudFront ビューワープロトコルポリシー および プロトコル (カスタムオリジンのみ) に選択したオプションは、HTTP トラフィックだけでなく、WebSocket 接続にも適用されます。
WebSocket の要件
WebSocket リクエストは、以下の標準形式で RFC 6455
サンプルクライアントリクエスト:
GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Origin: https://example.com Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13
サンプルサーバー応答:
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Sec-WebSocket-Protocol: chat
WebSocket 接続がクライアントまたはサーバーによって、またはネットワークの中断によって切断された場合、クライアントアプリケーションはサーバーとの接続を再開する必要があります。
推奨される WebSocket ヘッダー
WebSockets を使用する際に予期しない圧縮関連の問題を避けるため、オリジンリクエストポリシーに以下のヘッダーを含めることをお勧めします。
-
Sec-WebSocket-Key
-
Sec-WebSocket-Version
-
Sec-WebSocket-Protocol
-
Sec-WebSocket-Accept
-
Sec-WebSocket-Extensions