AWS IoT Coreで受信したデータをSQSのQueueに積んでEC2から読み出す
目次
はじめに
本記事ではAWS IoT Coreで受信したセンサーデータをSQSサービスのQueueに積み、それをEC2から読み出す手順について説明します。
AWS IoT CoreはIoT向けセンサーの受け口の役割を果たすサービスで、SQSはAWSのサービス間の連携に利用されるQueueサービスとなります。
実施方法
作業の流れ
以下の流れで作業を進めていきます。
- AWS IoT Coreの初期設定
- SQSのキューの作成
- AWS IoT Coreのルール作成
動作の確認としては以下を実施します。
- センサーデータを送信してSQSのキューに積まれていることを確認
- 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からキューのメッセージの読み出しを行う方法について説明しました。
次は何をしよう。何かご不明点がありましたらお気軽にお問合せ下さい。
ディスカッション
コメント一覧
まだ、コメントがありません