39

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

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

4

5 に答える 5

45

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

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

スティッキーでターゲット グループを追加

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

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

クライアントに Angular 1.5x を socket.io-client と共に使用しています。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
        };
    }
})();
于 2016-11-04T12:55:34.903 に答える
5

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

于 2016-11-06T14:23:48.283 に答える
1

ALB (Application Load Balancer) は Websocket をサポートします。ここで確認できますhttps://aws.amazon.com/blogs/aws/new-aws-application-load-balancer/ここに画像の説明を入力してください

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

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

于 2018-10-26T10:34:03.147 に答える