AWS SQS + Lambda Triggersの導入でIoT端末のメッセージ処理を快適に
※この記事はLuup Advent Calendarの16日目の記事です。
こんにちは。IoTチームのYuxiです。
この記事ではメッセージが大量に飛び交うIoTシステムをより楽に処理できる技術、AWS SQS + Lambda Triggesをご紹介します。
IoTの通信メッセージ処理のアーキテクチャーの話
IoTシステムでは常に、IoT端末とサーバーの間に通信メッセージが飛び交っています。
システム規模によるさまざまな通信メッセージ処理のアーキテクチャーがあると思いますが、今回はサーバーレスなAWS SQS + Lambda Triggerという手法を紹介します。
AWS SQS公式ページから引用
AWS SQSはSimple Queue Serviceの略称です。名前の通り簡易的なマネージド型メッセージキューで、コンポーネント間で任意の量のメッセージを送信、保存、受信ができます。
SQSの利点は⬆️のAWS公式に書いてありますが、今回は主にSQSのスケーラビリティとキューの特性を利用します。
SQSはIoTの負荷が急増したときでもメッセージの順序を維持しながら、自動スケーリングすることで大規模のメッセージに対応できます。
また、Lambda Triggerの並列数を絞ることによって、SQSのメッセージ処理速度に制限をかけることができ、Endpoint側へのリクエストが増えすぎないようにすることも可能です。
SQSを利用したメッセージ処理の流れ
IoT端末からAWS IoTに送信(MQTT)、AWS IoTはMessage Routing機能でSQSにメッセージを転送します。
SQSにメッセージが届いた時にLambda Triggerが発火し、Lambdaで順序にメッセージを処理します。
実装の流れ
事前準備
SQSの作成とLambdaの設定はPolicyとRoleを操作する権限が必要なので、該当の権限をアタッチしたアカウントで実装する必要があります。
SQS設定
AWS SQSページでキューを作成します。パラメーター設定は一旦デフォルトで大丈夫です。キューの種類はStandardとFIFOがあり、Standardの方は処理速度が速いがメッセージの順序は多少前後することがあります。FIFOは順序を厳格に維持しますが、SQSアクションにサポートしていなくてMQTTメッセージの転送に使えないのでStandardにします。
Lambdaの作成
Lambdaの作成について詳細は省かせていただきますが、SQSから届いたメッセージはevent.Recors配列に格納されていることにご留意ください。
Lambda triggerの設定
生成されたSQSのLambdaページでAdd Trigger
ボタンを押し、SQSと紐付けます。
AWS IoT Coreのメッセージルーティング設定
SQSに転送するIoTメッセージ源はいろいろありますが、今回はIoT端末からAWS IoT Coreに送信することを想定したので、SQSへのルーティング設定を紹介します。
AWS IoT CoreのMessage RoutingのRulesに入って、⬆️の図のように設定します。Actionsは作ったSQSと紐付けば良いです。SQLは実際のメッセージに合わせる必要があるが、一般のSQLと若干変わるので、こちらを参照しながら書いた方が良いです。
設定は以上になります🥳
おわりに
説明を簡略化した部分が多くすみませんが、IoTの通信メッセージ処理の1つのアーキテクチャーとして、今後どこかでご参考いただければと思います。
参考資料
-
Using Lambda with Amazon SQS
-
Tutorial: Formatting a notification by using an AWS Lambda function
-
AWS IoT SQL reference
Discussion