【地味に嬉しいアップデートかも】IoT デバイスのログを Amazon CloudWatch Logs にバッチで送信できるようになりました。
IoT デバイスのログやセンサーデータなどを CloudWatch Logs に送る場合、AWS IoT Core のルールアクションを使うのが便利です。しかし、後で検索したりキーワードマッチで監視するケースを考えると、AWS に送るログは基本的に「1メッセージずつ」で送ることになります。
(途中で Lambda を挟めばどのようにでもできますが)
今回のリリースでは、バッチ的に複数件のログを1メッセージで送っても、ルールアクションで1件ずつにバラして CloudWatch Logs に格納できるようになりました。
試してみる
下記のドキュメントを参考に試します。
AWS IoT Rules の作成
マネジメントコンソールからルールを作成していきます。
ルール名を指定します。
SQL ステートメントに記載するトピックは今回はテストなので test01/logs
としました。(「test01
というデバイスのログ」という想定です)
SELECT * FROM 'test01/logs'
ルールアクションを次のようにセットします。
今回のアップデート機能を試すために、Batch mode
の有効化を忘れないようにします。
項目名 | セット内容 | 説明 |
---|---|---|
Action 1 | CloudWatch logs | 実行するルールアクションを選択 |
Log group name | Your-Log-Group | 転送先のロググループを指定(新規作成 or 既存のグループを指定) |
Batch mode | enable | チェックを入れる |
IAM Role | Your-IAM-Role | 新規作成 or 既存のロールを指定 |
最後にレビューして問題なければルールの作成を実行します。
ルールが作成されました。
動作確認
ドキュメントにあるように、複数メッセージを配列にしたフォーマットで送ります。
今回は、マネジメントコンソールにあるテストクライアントから Publish しました。
[ {"timestamp": 1675406437124, "message": "Test message 1"}, {"timestamp": 1675406452935, "message": "Test message 2"}, {"timestamp": 1675406459217, "message": "Test message 3"} ]
CloudWatch Logs 側を確認すると、配列に入れた3つのメッセージが個別のログとして格納されていることが確認できました。
単にログファイルの送信だけであれば、Basic Ingest を利用して送信するとコスト圧縮に繋がります。
下記のように宛先トピックを $aws/rules/DeviceLogs2CWLogs/test01/logs
に変えてバッチで送信します。
先程と同じように、問題なく CloudWatch Logs に格納できました。
注意点
この機能を利用する上で注意点があります。
先程試したフォーマットのように、メッセージには時刻を表す 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 ゲートウェイでは、一度のタイミングで複数のデータを配列でまとめて送信する仕様でしたね。)
ご利用のデバイスの仕様などを鑑みて、うまく活用いただければと思います。
以上です。