ウェブソケットを作成し、サブスクライブされたアプリケーションにデータを送信する関数をAWS Lambdaで構築することは可能ですか?
このようなもの:
Johnは、スマートフォンでSuperPhotoAppアプリを開きましたが、デスクトップブラウザーを使用してSuperPhotoAppサービス(S3バケット)に写真をアップロードすることにしました。このイベントは、Socket.ioサーバーを作成し、すべてのサブスクライバーに更新をプッシュするLambda関数を実行します、彼の電話はアプリを開いていたので、アプリは新しい写真で自動的に更新されます。
これは、プッシュ通知またはAmazon SNSで実行できますが、キャラクターの位置を更新する必要があるオンラインゲームなどのリアルタイムの動作が必要な場合はどうでしょう。
Lambdaでこれが不可能な場合、デスクトップブラウザーを使用して開いたアプリを更新できるソリューションはありますか?
Amazon EC2が唯一のオプションですか?スケーリングに問題があることを読んだことがあるので、Lambdaについてコメントしています。
ここで説明したケースでは、Lambdaが機能するとは思わない。以下のAWSフォーラムへのリンクは、Lambda関数は最大15分間しか実行できず、さらに100msの関数ランタイムごとに課金されるため、コストがかかる可能性があることを指摘しています。 Amazonから、リクエストを数回聞いたことがあるというコメントがあるので、これを許可する何らかの方法に興味があります。
https://forums.aws.Amazon.com/thread.jspa?threadID=205761
EC2とNodeJSを使用してかなりの成功を収めているように見えるが、Socket.ioの代わりにWebsockets/wsと呼ばれるものを使用しなければならなかった誰かからの投稿があります。
http://www.jayway.com/2015/04/13/600k-concurrent-websocket-connections-on-aws-using-node-js/
ロードバランサーの背後でサーバーを実行する予定の場合は、ジャンプするためにさらにいくつかのフープがあるように見えます。
最近 AWSはIoT向けWebSocketのサポートをリリースしました サービス。サーバーレスWebアプリケーションのPub/Subメッセージシステムとして使用するのは非常に簡単です。 AWS lambda function
からhttp post request
経由で新しいメッセージを投稿し、クライアントでwebsocketメッセージとして受信できます。
フロントエンドアプリからMQTTサーバーへのwebsocket接続を処理する小さなnpmパッケージを作成しました。チェックアウト aws-mqtt-client
いいえ!Lambdaはsocket.io用に設計されたnotです。 Lambdaは、短時間の処理専用に設計されました。
安価な通知を提供する場合は、 PubNub または Realtime Framework などの外部サービスを試すことができます。
Amazonサービスのみを使用したい場合は、 SNS を試さないでください。このユースケースでは機能しません(ブラウザーのエンドポイントはありません)。
ただし、 AWS IoT を試すことができます。奇妙に聞こえるかもしれませんが、MQTTを介してブラウザをサポートしているため、安価で高速かつ簡単に通知を作成できる優れたツールです。 this リンクをたどると、すばらしいチュートリアルが得られます。デモコードが利用可能です こちら 。
更新(AWS re:invent 2018以降):API Gatewayがwebsocketをサポートするようになりました! LambdaでAPI Gateway Websocketを使用する例をこちらでご覧ください:
aPI Gatewayのこの機能のドキュメントはこちら: https://docs.aws.Amazon.com/apigateway/latest/developerguide/apigateway-websocket-api.html
API Gatewayでsocket.ioを使用するNode.jsフレームワークの興味深い例もありますが、ユースケースで特に機能するかどうかは調査していません: https://github.com/tiaod/分子-io
Amazon IoT Coreの使用を検討する必要があります。説明します。
リアルタイムストリームで計算を実行したり、分析を活用したりする必要があるリアルタイムの状況がある場合は、高速に設計されたプラットフォームへのストリーミングイベント(リアルタイムで状態の変化を反映する)を考慮する必要があります、AWS KinesisのようなKafka実装などの高可用性イベントストリーミング。その後、Kinesis AnalyticsやApache SparkやApache Stormなどのリアルタイムストリーミング分析用に設計されたツールからイベントストリームを使用できます。
その後、AWS Lambdaを使用してストリーミング分析(およびオプションで追加のイベント提供データ)を使用できます(これはKinesisを介して送信されるイベントによってトリガーできます)パイプライン)すべてのサブスクライバーに更新をプッシュします。特に各ユーザーに「トピック」を作成する場合、Amazon IoT Coreサービスを介して接続されている場合、これらのサブスクライバーに更新をリアルタイムでプッシュできます。このサービスは、使用できるトピックの数に上限がないように設計されているため、柔軟にスケーリングする必要があります。
これは、ベストプラクティスの「ビッグデータ」サーバーレス(VMの保守を避け、サーバーレス/マネージドサービスのみを使用する場合)アプローチの例であり、より弾力性があり、費用効果が高く、簡単です。維持し、独自のEC2インスタンスを管理するよりもスケーラブルで、負荷分散と可用性とレプリケーション、サーバー状態とべき等性、スケーリングと無駄なリソース、デプロイメントパイプラインとインスタンスの監視などの追加の頭痛を心配する必要があります。等..
Amazon IoT Coreサービスを使用する場合、MQTT(非常に高速で軽量)上のWebソケットを使用して、イベントをクライアントブラウザーに直接プッシュすることもでき、AWS Lambdaと直接統合することもできます。 IoT Coreを使用する優れたデモアプリがここにあります: https://github.com/aws-samples/aws-iot-chat-example
個人的に、私はより安価で、維持が容易で、パフォーマンスが良く、夜に眠ることができ、途切れないのアプローチを好む悪夢のない眠り。
AWS LambdaとPUBNUBなどの他のPUB/SUBサービスを組み合わせることができると思います https://www.pubnub.com/docs/pubnub-rest-api-documentation 。
リアルタイム機能を探している場合は、Firebase Real Time DatabaseまたはFirestoreを使用します。私は両方を非常に頻繁に使用し、それらは驚くべきことだと言わざるを得ません。こちらをご覧ください https://firebase.google.com
はい。AWSLambdaを使用して、socket.ioクライアントとしてsocket.ioサーバーにイベントを発行できます。
実装手順:
Index.jsにハンドラーコードを実装します。以下に例を示します。
exports.handler = async(event)=> {
var io = require('socket.io-client');
var socket = io.connect("http://example.com:9999");
let payload = { "id": "1" };
socket.emit("MyEvent", payload);
return 'Sent message!';
};
フォルダーのZipファイルを作成します。
事業
-node_modules
-index.json
-package-lock.json
-package.json
保存してテストします。