AWS IoT Coreで受信したデータをSQSのQueueに積んでEC2から読み出す

はじめに

本記事ではAWS IoT Coreで受信したセンサーデータをSQSサービスのQueueに積み、それをEC2から読み出す手順について説明します。

AWS IoT CoreはIoT向けセンサーの受け口の役割を果たすサービスで、SQSはAWSのサービス間の連携に利用されるQueueサービスとなります。

実施方法

作業の流れ

以下の流れで作業を進めていきます。

  1. AWS IoT Coreの初期設定
  2. SQSのキューの作成
  3. AWS IoT Coreのルール作成

動作の確認としては以下を実施します。

  1. センサーデータを送信してSQSのキューに積まれていることを確認
  2. EC2にてSQS Queueのデータをリード

AWS IoT Coreの初期設定

センサーデータをAWS IoT Coreで受信できるようにするまではこちらの記事をご参照下さい。

SQSのキューの作成

AWSコンソールからSQSサービスのページに移動し、キューの作成を実施します。

標準キューの方を利用して以下のように設定していきます。メッセージの保持期間以外のパラメータの変更は行っていません。

これでSQSの設定は以上となります。今回は「my-iot-queue」という名前でキューを作成しました。

IoT Coreのルールの作成

AWS IoT CoreのルールのタブからSQSにデータを転送するルールの作成を行っていきます。ルールのページから「作成」をクリックして下さい。

ここから転送ルールの設定です。最初に名前と説明を入れておきます。

次のルールクエリステートメントでは、ルールを適用するセンサーデータのフィルタをSQLクエリにて実現します。MQTTのトピックベースでルールの設定を行う場合にはFROMの後ろの箇所にトピック名を入れて頂ければ問題ありません。私の場合は’sensor/001’のトピックを利用していますので、以下のように設定しました。

続けてアクションの設定を行っていきます。ここでアクションの追加を行います。

いくつかのAWSサービスが表示されます。ここで「SQSキューにメッセージを送信する」を選択し、画面一番下にあるアクションの設定をクリックして下さい。

これを見るとサービス間の連携が簡単であることがすぐにわかりますね。

こちらのページでは先ほどSQSのサービスで作成したキューを指定し、ロールを選択した後に「アクションの追加」をクリックして下さい。

該当するロールが存在しない場合には、ロールの作成をクリックして下さい。AWS IoTがSQSにアクセスするためのロールを名前を付けるだけで作成してくれます。

以下のようにアクションが追加されたことが確認できますので、最後に一番画面下にある「ルールの作成」をクリックして下さい。

これでAWS IoT Coreのルール作成は完了です。

動作確認1:センサーデータを送信し、キューに積まれていることを確認

事前準備として、センサーのデータをAWS IoT向けに送信して下さい。

その後、SQSのサービスのページで今回作成したキューの利用可能なメッセ時の項目が0以外となっていることを確認してください。以下の例ではMQTTで1メッセージのみAWS IoT Coreに送信した状態で、1つのメッセージが見えていることがわかります。

これでAWS IoTとSQS間の連携は出来ている状態です。

動作確認2:EC2からSQS Queueのリード

EC2を起動してSQSのキューからデータを読み取る際の動作を確認してきます。このEC2にはSQSにアクセスするために専用のIAMロールをアタッチしておく必要があります。必要であれば以下の記事を参照してIAMロールの作成・アタッチを実施して下さい。

ここではAmazon LinuxのAMIで動かしているEC2で説明します。確認にはAWS CLIを利用します。

まず以下のコマンドでSQSのキュー一覧を表示します。ここでエラーとなっている場合はIAMロールが正常にアタッチされているかを確認した方が良さそうです。

コマンド

aws sqs list-queues

今回作成したキューの確認が出来たのでQueueにあるデータのリード処理を実施します。

以下のコマンドを利用してみて下さい。QueueUrlsは上記コマンドで取得したQueueUrlsとなります。

コマンド

aws sqs receive-message –queue-url {QueueUrls}

Body部にセンサーデータが載っていることが確認出来るかと思います。尚、このタイミングでこのメッセージは利用可能なメッセージではなく、処理中のメッセージとなります。AWSコンソールのSQSサービスのページでは以下のような表示となります。また、メッセージが処理中となっている状態では、EC2から再度キューに対してリードを行っても該当のメッセージが再度読み出されることはありません。

しかし、SQSでは明示的にメッセージを消去しない限りはキューの中にメッセージが残り続けます。上記は処理中のメッセージとなっていますが、30秒経過することで再び利用可能なメッセージとなり、EC2からリード可能な状態に戻ります。この30秒という時間は「デフォルトの可視性タイムアウト」という名前でキュー毎に設定されていますので必要であれば変更して下さい。

最後にキューから読み出されたメッセージを削除します。QueueUrlsについては先ほどと同じです。ReceiptHandleについては先ほどメッセージを読みだした時に付いているReceiptHandleの値となります。こうして、メッセージの受信者以外がメッセージの削除を行えないようにしているということですね。

コマンド

aws sqs delete-message–queue-url {QueueUrls} –receipt-handle {ReceiptHandle}

これでEC2からの動作確認も完了となります。

さいごに

本記事ではセンサーデータをAWS IoT Core経由でSQSサービスのキューに送信すること、また、EC2からキューのメッセージの読み出しを行う方法について説明しました。

次は何をしよう。何かご不明点がありましたらお気軽にお問合せ下さい。