📬

AWS SQS + Lambda Triggerの導入でIoT端末のメッセージ処理を快適に

2023/12/16に公開

※この記事はLuup Advent Calendarの16日目の記事です。

こんにちは。IoTチームのYuxiです。

この記事ではメッセージが大量に飛び交うIoTシステムをより楽に処理できる技術、AWS SQS + Lambda Triggerをご紹介します。

IoTの通信メッセージ処理のアーキテクチャーの話

IoTシステムでは常に、IoT端末とサーバーの間に通信メッセージが飛び交っています。
システム規模によるさまざまな通信メッセージ処理のアーキテクチャーがあると思いますが、今回はサーバーレスなAWS SQS + Lambda Triggerという手法を紹介します。
AWS Simple Queue Service
AWS SQS公式ページから引用

AWS SQSはSimple Queue Serviceの略称です。名前の通り簡易的なマネージド型メッセージキューで、コンポーネント間で任意の量のメッセージを送信、保存、受信ができます。

Benefits of SQS

SQSの利点は⬆️のAWS公式に書いてありますが、今回は主にSQSのスケーラビリティとキューの特性を利用します。
SQSはIoTの負荷が急増したときでもメッセージの順序を維持しながら、自動スケーリングすることで大規模のメッセージに対応できます。
また、Lambda Triggerの並列数を絞ることによって、SQSのメッセージ処理速度に制限をかけることができ、Endpoint側へのリクエストが増えすぎないようにすることも可能です。

SQSを利用したメッセージ処理の流れ

SQS Architecture

IoT端末からAWS IoTに送信(MQTT)、AWS IoTはMessage Routing機能でSQSにメッセージを転送します。
SQSにメッセージが届いた時にLambda Triggerが発火し、Lambdaで順序にメッセージを処理します。

実装の流れ

事前準備

SQSの作成とLambdaの設定はPolicyとRoleを操作する権限が必要なので、該当の権限をアタッチしたアカウントで実装する必要があります。

SQS設定

Create queue
AWS SQSページでキューを作成します。パラメーター設定は一旦デフォルトで大丈夫です。キューの種類はStandardとFIFOがあり、Standardの方は処理速度が速いがメッセージの順序は多少前後することがあります。FIFOは順序を厳格に維持しますが、SQSアクションにサポートしていなくてMQTTメッセージの転送に使えないのでStandardにします。
SQS FIFO Attention

Lambdaの作成

Create Lambda
Lambdaの作成について詳細は省かせていただきますが、SQSから届いたメッセージはevent.Records配列に格納されていることにご留意ください。
SQS Event

Lambda triggerの設定

Lambda trigger
生成されたSQSのLambdaページでAdd Triggerボタンを押し、SQSと紐付けます。

AWS IoT Coreのメッセージルーティング設定

SQSに転送するIoTメッセージ源はいろいろありますが、今回はIoT端末からAWS IoT Coreに送信することを想定したので、SQSへのルーティング設定を紹介します。
Routing
AWS IoT CoreのMessage RoutingのRulesに入って、⬆️の図のように設定します。Actionsは作ったSQSと紐付けば良いです。SQLは実際のメッセージに合わせる必要があるが、一般のSQLと若干変わるので、こちらを参照しながら書いた方が良いです。

設定は以上になります🥳

おわりに

説明を簡略化した部分が多くすみませんが、IoTの通信メッセージ処理の1つのアーキテクチャーとして、今後どこかでご参考いただければと思います。

参考資料

Luup Developers Blog

Discussion