web-dev-qa-db-ja.com

Application Load BalancerはWebSocketをサポートしていますか?

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

ALBは実際にWebSocketをサポートしていますか? AWSのドキュメントはこれと矛盾しています。 このページ は、HTTPとHTTPSのみをサポートしていると言います。 WebSocketをサポートするためのALBのセットアップに関するガイドはありません。

19
jameshfisher

新しいApplication Load Balancer(ALB)でWebSocketを動作させることができました。

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

Add Target Group with Stickiness

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

Add Listen rule for WebSocket

サーバーにNode/Hapi/Socket.ioを使用しています(Amazon Linux AMIから派生したインスタンスで実行)。基本設定は次のとおりです。

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

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

ここで、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.');
            });
        });
    }
};

Socket.io-clientを使用して、クライアントに対してAngular 1.5xを使用しています。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
        };
    }
})();
33
programmerj

Application Load Balancerはwebsocketをサポートしています。ただし、2017年2月23日まで、websocketヘルスチェックはサポートされていません。後でオプションを追加する可能性があります。 Application Load Balancerの背後でWebソケットを使用する場合は、ターゲットグループのHTTPまたはHTTPSヘルスチェックを設定する必要があります。

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

リファレンスhttp://docs.aws.Amazon.com/elasticloadbalancing/latest/application/target-group-health-checks。 html

1
Bijohn Vincent

ALBはWebsocketをサポートしますが、インスタンスが少なくとも「アイドルタイムアウト」秒ごとにデータを送信しない場合、ロードバランサーは接続を閉じることができます。

0
Namtrh

ALB(アプリケーションロードバランサー)は、Webソケットをサポートします。こちらで確認できます https://aws.Amazon.com/blogs/aws/new-aws-application-load-balancer/ここに画像の説明を入力してください

また、設定されたアイドルタイムアウトに応じて、ALBは接続を閉じます。

上記のブログのスナップショット

0
saurav omar