【地味に嬉しいアップデートかも】IoT デバイスのログを Amazon CloudWatch Logs にバッチで送信できるようになりました。

2023.02.02

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

IoT デバイスのログやセンサーデータなどを CloudWatch Logs に送る場合、AWS IoT Core のルールアクションを使うのが便利です。しかし、後で検索したりキーワードマッチで監視するケースを考えると、AWS に送るログは基本的に「1メッセージずつ」で送ることになります。
(途中で Lambda を挟めばどのようにでもできますが)

今回のリリースでは、バッチ的に複数件のログを1メッセージで送っても、ルールアクションで1件ずつにバラして CloudWatch Logs に格納できるようになりました。

試してみる

下記のドキュメントを参考に試します。

AWS IoT Rules の作成

マネジメントコンソールからルールを作成していきます。

01-create-rule

ルール名を指定します。

02-rule-name

SQL ステートメントに記載するトピックは今回はテストなので test01/logs としました。(「test01 というデバイスのログ」という想定です)

SELECT * FROM 'test01/logs'

03-topic2

ルールアクションを次のようにセットします。
今回のアップデート機能を試すために、Batch mode の有効化を忘れないようにします。

04-set-actions

項目名 セット内容 説明
Action 1 CloudWatch logs 実行するルールアクションを選択
Log group name Your-Log-Group 転送先のロググループを指定(新規作成 or 既存のグループを指定)
Batch mode enable チェックを入れる
IAM Role Your-IAM-Role 新規作成 or 既存のロールを指定

最後にレビューして問題なければルールの作成を実行します。

05-review-create2

ルールが作成されました。

06-basic-ingest0

動作確認

ドキュメントにあるように、複数メッセージを配列にしたフォーマットで送ります。
今回は、マネジメントコンソールにあるテストクライアントから Publish しました。

07-mqtt-test-client3

[
  {"timestamp": 1675406437124, "message": "Test message 1"}, 
  {"timestamp": 1675406452935, "message": "Test message 2"}, 
  {"timestamp": 1675406459217, "message": "Test message 3"}
]

CloudWatch Logs 側を確認すると、配列に入れた3つのメッセージが個別のログとして格納されていることが確認できました。

08-cwlogs-events2

単にログファイルの送信だけであれば、Basic Ingest を利用して送信するとコスト圧縮に繋がります。
下記のように宛先トピックを $aws/rules/DeviceLogs2CWLogs/test01/logs に変えてバッチで送信します。

09-basic-ingest-pub

先程と同じように、問題なく CloudWatch Logs に格納できました。

10-cwlogs.

注意点

この機能を利用する上で注意点があります。
先程試したフォーマットのように、メッセージには時刻を表す timestamp に対して UNIX タイムスタンプを指定します。またデータを表す messageの指定が必要になります。

全体のフォーマットは、json の配列で送ります。

[
  {"timestamp": 1675324301695, "message": "Test message 1"}, 
  {"timestamp": 1675324306244, "message": "Test message 2"}, 
  {"timestamp": 1675324310310, "message": "Test message 3"}
]

このような条件があるため、この機能を利用する場合はデバイス側の仕様を合わせる必要があります。

(なお、バッチモードをオフにした従来の使い方であれば、フォーマットの要件はありません。)

最後に

今回のアップデートを見た時、上記のような注意点があることからあまりピンとこなかったのですが、IoT デバイスの場合だと間欠的にデータを送るケースもあると思うので、バッチでデータを送る(送りたい)ケースは意外と多いのかなと思いました。

(確かに、以前のブログで紹介した「LMG-300」という IoT ゲートウェイでは、一度のタイミングで複数のデータを配列でまとめて送信する仕様でしたね。)

ご利用のデバイスの仕様などを鑑みて、うまく活用いただければと思います。

以上です。

参考ドキュメント