2016-09-05 19 views
11

私はクラシックロードバランサを使用するように最初に設定されたElastic Beanstalkアプリケーションを持っています。 WebSocket経由で接続すると、このエラーが発生することがわかりました。このため、ALBがWebSocketをサポートしていると言われたので、代わりにApplication Load Balancerを使用するようにアプリケーションを構成しました。しかし、彼らはそうではないようです:私はWebSocket経由でALBに接続しようとすると、まったく同じエラーが発生します。アプリケーション・ロード・バランサはWebSocketをサポートしていますか?

ALBは実際にWebSocketをサポートしていますか?これに関してAWSのドキュメントは矛盾しています。 This pageは、HTTPとHTTPSのみをサポートしていると言います。 WebSocketをサポートするようにALBを設定するガイドはありません。

+0

公式ブログからws://とwss://プロトコル」を参照してください。 –

+0

この発表とALBのFAQセクションにもかかわらず、https://aws.amazonにもかかわらずALB(httpステータス501未実装) – nont

+0

に同じエラーが表示されます。com/elasticloadbalancing/applicationloadbalancer/faqs/ – nont

答えて

20

新しいアプリケーションロードバランサ(ALB)で動作するWebSocketを取得できました。

まず、ALBの新しいターゲットグループを作成します。このターゲットグループはアプリケーションと同じポートを使用する必要があり、ヘルスチェックを設定する必要があります。しかし、主な違いは、粘着性を有効にする必要があることです。

Add Target Group with Stickiness

次に、あなたのALBに新しいリスナーのルールを追加します。このルールには、WebSocketセットアップ - /socket.ioをルーティングするパスが必要です。また、作成したターゲットグループにターゲットグループ名を設定します。

Add Listen rule for WebSocket

私は(アマゾンのLinux AMIから派生したインスタンス上で実行されている)私のサーバーのノード/ハピ/ Socket.ioを使用しています。基本的な設定は次のとおりです。私はsocket.io-クライアントで、私のクライアントのための角度の1.5倍を使用していますWebSocket.jsが

var io = null; 

module.exports = { 

    Initialize: function (http) { 

     io = require('socket.io')(http); 

     io.on('connection', function (socket) { 
      console.log('Websocket ' + socket.id + ' connected.'); 

      socket.on('disconnect', function() { 
       console.log('Websocket ' + socket.id + ' disconnected.'); 
      }); 
     }); 
    } 
}; 

ある

const hapi = require('hapi'); 
const websocket = require('./WebSocket'); 

var server = new hapi.Server(); 
server.connection(config.Application); 
websocket.Initialize(server.listener); 

。次のようにWebSocketクライアントオプションを設定することが重要です。そうしないと、接続できなくなります。

(function() { 

    'use strict'; 

    angular 
     .module('XXXXX', []) 
     .run(runHandler); 

    runHandler.$inject = ['WebSocketService']; 

    function runHandler(WebSocketService) { 
     WebSocketService.Initialize(); 
    } 
})(); 

のWebSocketサービス:インスタンスは、少なくともすべての「アイドルタイムアウト」の秒いくつかのデータを送信しない場合

(function() { 

    'use strict'; 

    angular 
     .module('XXXXX') 
     .factory('WebSocketService', WebSocketService); 

    WebSocketService.$inject = []; 

    function WebSocketService() { 

     var socket = null; 

     function initialize() { 

      var url = 'http://' + ALB_URL + ':5800'; 

      socket = io(url, {transports: ['websocket'], upgrade: false}); 

      socket.on('connect', function() { 
       console.log('Socket connected'); 
      }); 

      socket.on('disconnect', function() { 
       console.log('Socket disconnected'); 
      }); 
     } 

     return { 
      Initialize: initialize 
     }; 
    } 
})(); 
+0

ヘルスチェックの設定は何ですか? socket.ioまたはアプリケーションコードに特別なヘルスチェックエンドポイントがありますか?私の場合、 '/'を要求すると、ALBは健康でないと考えられる 'HTTP 426'レスポンスが返されます。 – dskrvk

+1

私はALBの後ろに2つのVMを持っています。それぞれはノードWebサービスをホストします。私はhttp::5800/v1/monitor/pingにHTTP 200 OKの文字列として現在のサーバーの日付/時刻を返すRESTエンドポイントを持っています。 私のAPI(非ウェブソケット)Target Group-> Health Checksでこの情報を設定します。 – programmerj

+0

@programmerjだからあなたのALB_URLは何ですか? "xxx.us-east-1.elasticbeanstalk.com/socket.io:5800"?パスは正確に "socket.io"である必要がありますか、それとも任意ですか? Flask-socketioはポート5000経由でWebSocketを公開します。ポート5000を使用しますか? – Alpenglow

0

ALBサポート用WebSocketが、ロードバランサが接続を閉じることができます。

1

アプリケーションロードバランサはwebsocketをサポートします。しかし、2017年2月23日までwebsocket health checkのサポートはありません。後でオプションを追加することがあります。 Application Load Balancerの背後にあるWebSocketを使用する場合は、ターゲット・グループのHTTPまたはHTTPSヘルス・チェックを設定する必要があります。

AWSドキュメントから: "ヘルスチェックはWebSocketをサポートしていないことに注意してください。

リファレンス:https://aws.amazon.com/blogs/aws/new-aws-application-load-balancer/「ALBを経由してのWebSocketのネイティブサポートを提供します:http://docs.aws.amazon.com/elasticloadbalancing/latest/application/target-group-health-checks.html

関連する問題