最初にClassic Load Balancerを使用するように設定されたElastic Beanstalkアプリケーションがあります。これにより、WebSocket経由で接続するとエラーが発生することがわかりました。そのため、ALBはWebSocketをサポートすると言われたため、代わりにApplication Load Balancerを使用するようにアプリケーションを構成しました。ただし、そうではないようです。WebSocketを介してALBに接続しようとすると、まったく同じエラーが発生します。
ALBは実際にWebSocketをサポートしていますか? AWSのドキュメントはこれと矛盾しています。 このページ は、HTTPとHTTPSのみをサポートしていると言います。 WebSocketをサポートするためのALBのセットアップに関するガイドはありません。
新しいApplication Load Balancer(ALB)でWebSocketを動作させることができました。
まず、ALBの新しいターゲットグループを作成します。このターゲットグループは、アプリケーションと同じポートを使用する必要があり、ヘルスチェックを構成する必要があります。ただし、主な違いは、スティッキネスを有効にする必要があることです。
次に、ALBに新しいリスナールールを追加します。このルールには、WebSocketセットアップをルーティングするためのパス/socket.ioが必要です。また、ターゲットグループ名を作成したターゲットグループに設定します。
サーバーに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
};
}
})();
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
ALBはWebsocketをサポートしますが、インスタンスが少なくとも「アイドルタイムアウト」秒ごとにデータを送信しない場合、ロードバランサーは接続を閉じることができます。
ALB(アプリケーションロードバランサー)は、Webソケットをサポートします。こちらで確認できます https://aws.Amazon.com/blogs/aws/new-aws-application-load-balancer/ここに画像の説明を入力してください
また、設定されたアイドルタイムアウトに応じて、ALBは接続を閉じます。