AWS IoTのいろいろなルールを見てみる&ちょっと試してみる #reinvent

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、大瀧です。 ラスベガスで開催中のAWSのカンファレンスイベントre:Inventで発表されたAWS IoTの根幹となる機能、ルールをご紹介します。

AWS IoTのルール設定とは

awsiot_1

AWS IoTは、IoTデバイスの管理とAWSの各サービスを連携させるPub/Subモデルのサービスです。IoTルールは、IoTデバイス(上図の"AWS IoT Device SDK")からIoTメッセージブローカー(上図の"DEVICE GATEWAY")にPublishされたメッセージをAWSサービスに配信するSubscribeルールエンジンです(上図右上にある「RULES ENGINE」を指します)。配信先として以下のサービスをサポートします。

  • Amazon DynamoDB
  • Amazon S3
  • Amazon SNS
  • Amazon SQS
  • AWS Lambda
  • Amazon Kinesis Streams
  • Amazon Kinesis Firehose
  • AWS IoTの別Topicへのメッセージ転送

一部ドキュメントに記載されていないものもありますが、AWS CLIのリファレンスには記載がありました。

今回はS3へのメッセージ格納を試してみたいと思います。

設定手順

AWS IoTの管理画面から[Create a Rule]をクリックします。任意のルール名を入力します。

iotrule01

続いてルールクエリを指定します。ルールクエリは、IoTメッセージブローカーで扱う全トピックからのフィルタリングおよび関数処理をSQLライクに記述できます。扱える構文はドキュメントを参照してください。今回はtopic/testトピックのメッセージをそのまま配信対象とします。関数処理を使うと、メッセージの集計などいろいろできそうですね。

[Choose an Action]では、先ほど列記した転送先のサービスをルールアクションとして設定します。今回は[Store the message in a file and store in the cloud(S3)]を選択します。

iotrule02

上記を選択すると、S3への格納要件のフォームが表示されます。[S3 Bucket]はS3バケットの選択、[Key]はオブジェクト名を入力します。オブジェクト名には変数が設定できるようなのですが、ドキュメントにリファレンスらしいものは見当たらなかったため、DynamoDBのルールを見本にタイムスタンプを含めました。

文字列のみにしてしまうとメッセージがすべて同一オブジェクトに上書き保存されてしまうので、ログデータのように追記として格納する場合は上記のような工夫が必要です。

[Add Action]をクリックして確定します。今回はルールアクションを一つだけ設定しましたが、ルールアクションを追加して複数のサービスに配信することも可能です。

iotrule03_1

[Create]をクリックして、ルール作成は完了です。

動作確認

では、以下の記事の通りにセットアップし、mosquitto_pubコマンドでIoTメッセージブローカーにPublishしてみます。mosquitto_subコマンドが動作しているとメッセージを横取りしてしまうようなので、止めておいてください。

$ mosquitto_pub --cafile rootCA.pem --cert cert.pem --key thing-private-key.pem -h XXXXXXXXXXXX.iot.ap-northeast-1.amazonaws.com  -p 8883 -q 1 -d -t topic/test -i clientid2 -m '{"message":"hello!"}'
Client clientid2 sending CONNECT
Client clientid2 received CONNACK
Client clientid2 sending PUBLISH (d0, q1, r0, m1, 'topic/test', ... (20 bytes))
Client clientid2 received PUBACK (Mid: 1)
Client clientid2 sending DISCONNECT
$

3回繰り返しました。

で、S3バケットの内容を確認すると。。。

iotrule04

ルールエンジンによってファイルが作成されていますね!ファイルの中身を見てみます。

suzaku:~ ryuta$ aws s3 cp s3://takipone-iottest/iottest-1444368810776.txt .
download: s3://takipone-iottest/iottest-1444368810776.txt to ./iottest-1444368810776.txt
$ cat iottest-1444368810776.txt
{"message":"hello!"}$

きちんとメッセージが格納されていますね!

まとめ

IoTルールの設定例として、S3への格納を試してみました。IoTメッセージブローカーでは様々なメッセージを扱うことになりますので、用途に応じてルールクエリ、ルールアクションをうまく使い分けできると良いですね。

例えば、S3アクションだとメッセージごとにS3オブジェクトがバラバラと作成されてしまうので、代わりにKinesis Firehoseに配信することでレコードをある程度まとめた形でFirehoseからS3に格納する、といった工夫もできると思います。それぞれのアクションの動きをよく理解しておくことが重要ですね。

参考資料