2

AWS EC2 Autoscaleクラスタで実行されているAkka HTTPサーバーがあります。このEC2自動スケールクラスタには、ELBアプリケーションロードバランサが前面にあります。 ELBのほかに、静的ファイルを提供するように設定されたクラウドフロントディストリビューションがあります。AWS CloudfrontでWebSocketを有効にする方法

私たちは、ブラウザからバックエンドへのすべてのwebsocket接続要求がエラーHTTP 400 Expected UpgradeToWebsocket headerで失敗する問題に直面しています。

さらに調査すると、クライアントはロードバランサに直接接続できますが、クラウドフロント経由の接続要求は失敗します。最終的にAWS Cloudfrontのドキュメントでthis pageにアクセスしました。これは、クライアントが接続できない理由である可能性のある「アップグレード」ヘッダーをクラウドフロントが除去してしまうことを示しています。

この問題を回避するために、すべての "ヘッダー転送"オプション(キャッシュを無効にする)を有効にしましたが、それでも機能しませんでした。さらに、特定のURLに対してクラウドフロントキャッシュを選択的に無効にするか、またはクラウドフロントをバイパスするオプションを見つけることができませんでした。

この問題を回避するにはどうしたらいいですか?ウェブソケットがクラウドフロントで動作するようにするにはどうすればよいですか?それともこれはサポートされていないのですか?

答えて

0

CloudFrontは現在Webソケットをサポートしていません。

CloudFrontを転送するように設定しようとしても、特定のヘッダーが要求から削除されます。これらはpage you mentionedの表にで示されています。「CloudFrontはヘッダーを削除します」およびCaching Based on Header Values Is Supported = 「いいえ」 AWSフォーラムから

残りは右の人々は、この機能要求を認識していますのでご安心ください。

—リチャードウェブソケットがあるのに対し、それは、静的なWebページのキャッシュ用に最適化されているようCloudFrontのは、ウェブソケットのための適切なソリューションではありませんAWS(2015年6月6日)

https://forums.aws.amazon.com/thread.jspa?messageID=723375

3

@主に動的です。一方、ELBはHTTPウェブソケット(ws://)とセキュアウェブソケット(wss://)の両方をサポートしており、すべてのSSLハンドシェイクを処理するように設定することができます。ただし、サーバーが送信している間にHTTP/HTTPS接続を開いたままにするには、TCP設定で構成する必要があります。ここではどのように行うのです:

  1. クリックして、EC2のロードバランサタブ
  2. に「ロードバランサの作成」「クラシックロードバランサ」を選択します。あなたは(無地ウェブソケットに対してTCPを選択してください)、単純なTCP
  3. を行うために、送信元と送信先のプロトコルを定義することを必要とする:

enter image description here 4.あなたは、あなたがする必要がある安全なウェブソケットをやってやっている場合

enter image description here 5.ヘルスチェックを設定し、インスタンスを追加して[作成]を押します。 CNAMEを定義すると、すべて設定されます。

ソースプロトコルとして「HTTP」または「HTTPS」を選択した場合、ロードバランサは接続を長時間開くように設計されていないため、ある時点で408エラーコード(タイムアウト)が発生します。それが私たちがTCPを選んだ理由です。

関連する問題