Amazon Web Services ブログ

データタイプのチェックにより AWS IoT Events 探知器モデルのランタイムエラーを検知する方法

この記事は2021年9月20日に投稿された記事の日本語訳です。

AWS IoT Events の利用者は、探知器モデルを使用して、機器の状態とイベントを定義します。AWS IoT Events の探知器モデルには、AWS IoT Events 式が含まれています。式は4つの基本的なデータタイプ(整数、文字列、10進数、ブール値)を持つことができます。式をチェックすることで、データタイプが正しく使用されているかどうかが分かり、探知器モデルが期待通りに動作するかの確認ができます。この記事では、AWS IoT Events の探知器モデルで誤ったデータタイプを使用した場合の結果について説明します。AWS IoT Events の探知器モデルのトラブルシューティング方法によって、探知器モデルの実行時エラーを検知する前に、これらのデータタイプのエラーを検出する方法を紹介します。

AWS IoT Events はフルマネージドサービスで、探知器モデルを作成することで、IoT センサーやアプリケーションからのイベントを簡単に検出・応答することができます。探知器モデルの詳細については、ガイド「Getting Started with the AWS IoT Events Console」を参照してください。

AWS IoT Event 式のデータタイプチェックの有効性

この記事では、産業用フォークリフトを例に挙げます。AWS IoT Events 探知器モデル を使って監視し、ランタイムエラーを検知して、トラブルシューティングする方法を紹介します。

この例のフォークリフトがアイテムをピックアップすると、AWS IoT Events 入力の 2 つの属性が更新されます。
そのうちの 1 つは weight で、フォークリフトによって持ち上げられるアイテムの重さです。2 つ目は isWeightLb で、重量の単位がポンドなのかキログラムなのかを示しています。開発者は、これらの属性を 2 つの方法で使用します。まず、 isWeightLb の受信は、フォークリフトがアクティブであることを示すハートビートとして使用されます。少なくとも 5 分に 1 回、値が受信されない場合、フォークリフトのステータスはオフラインに変更され、通知を送信します。

フォークリフトのハートビートの監視は、次の図に示す AWS IoT Events の探知器モデルを使ってモデル化されています。オフラインの状態は、フォークリフトが過去 5 分間に isWeightLb の新しい値を送信していないことを表しています。

「重量超過」イベントの設定

また、この開発者は、前述の探知器モデルを使用して、フォークリフトが重すぎるアイテムを持ち上げたときに通知を送信するようにしています。この開発者は、フォークリフトが 4,500 ポンドより重いアイテムを持ち上げると、SNS トピックに通知します。これは、次の図に示す「 Alert if too heavy 」イベントによって検出されます。

「アセットプロパティへのパブリッシュ」イベントの設定

開発者は、この検出器モデルにもう 1 つイベントを追加します。彼らはすでに、 AWS IoT SiteWise の 産業用アセットのモデリングで産業用フォークリフトをモデル化しています。彼らは、AWS IoT SiteWise のフォークリフトの isWeightLb アセットプロパティを、AWS IoT Events 探知器の isWeightLb 属性を使って入力したいと考えています。ハートビートを受信すると、彼らは探知器モデルに対して、次の図に示す アセットプロパティへのパブリッシュ AWS IoT SiteWise action を介して、AWS IoT SiteWise のフォークリフトの アセットプロパティ を入力させます。

ランタイムエラーの発生例

ここでは、複雑なシステムをモデリングする際に特によく見られるエラーを紹介します。HeartBeatの入力には、 isWeightLb (重量はポンドかキログラムか?)と weight (フォークリフトで持ち上げられたアイテムの重量)の 2 つの属性があります。開発者は、入力属性 isWeightLb を AWS IoT Events の探知器モデルから AWS IoT SiteWise のアセットプロパティに渡すつもりでした。しかし、AWS IoT SiteWise に weight 属性をブール値として渡しています。

このアクションが実行されるたびに、AWS IoT Events はHeartBeatweight 属性の値をブール値として AWS IoT SiteWise の forklifts/forklift1/isWeightLb のアセットプロパティに送ろうとします。

しかし、値が AWS IoT SiteWise に正しく取り込まれるためには、HeartBeatweight 属性に含まれる値がブール値である必要があります。ブール値でない場合、アクションは失敗します。この場合、この探知器からだけでなく、この AWS IoT SiteWise アクションを含むすべての探知器からも発生します。開発者は、探知器がハートビートメッセージを受信していないためにこの現象が起こっていると考えるかもしれません。そうではなく、探知器はハートビートメッセージを受信していますが、weight をブール値として処理することができていないだけです。

この問題の根本的な原因を見つけるために、開発者は次のことを行います。

    AWS IoT Events でのロギングを有効にし、 Amazon CloudWatch で探知器のログを確認して、ハートビートメッセージを受信していることを確認します。
    AWS IoT SiteWise の forklifts/forklift1/isWeightLb アセットプロパティの宣言されたデータタイプがブール値であることを確認します。
    AWS IoT Events の HeartBeatisWeightLb 属性が、実行時にブール値になっていることを確認します。

しかし、これらの手順のいずれを用いても、開発者は、彼らの探知器モデルが誤って isWeightLb 入力属性ではなく、weight 入力属性をブール値として AWS IoT SiteWise に送信していることを検知できません。

このようなデバッグの手間を減らすために、AWS IoT Events のトラブルシューティング機能では、探知器モデルの入力属性の期待されるデータタイプと実際のデータタイプの不一致を検知します。例えば、この状況でのトラブルシューティング機能は、$input.HeartBeat.weight の推論されたデータタイプである数値型が AWS IoT SiteWise のアクションで期待されるデータタイプであるブール値と一致しないことを開発者に警告します。

データタイプエラーのトラブルシューティング

AWS IoT Events 式では、式は4つの基本的なデータタイプ(整数、文字列、10進数、ブール値)のいずれかを持つ入力属性や変数を定義することができます。探知器モデルで使用される入力属性や変数のデータタイプは宣言しません。AWS IoT Events のトラブルシューティング方法では、探知器モデルの式の中で使用されているデータを分析することで、それらのデータタイプを推測することができます。

例えば、前出の探知器モデルの、 「Alert if too heavy」 イベントに、$input.HeartBeat.weight > 4500 という条件があるとします。この式は、入力属性 weight を整数リテラル 4500 と比較します。入力属性 weight は整数タイプの値と比較されているので、整数タイプの値を格納するためのものであり、整数型でなければなりません。

AWS IoT Eventsは、AWS IoT Events 式のタイプルールを利用して、探知器モデルで使用される入力属性と変数のデータ型を推論します。これらのルールは、言語内の演算子や関数が操作できるオペランドのタイプを決定します。例えば、AWS IoT Events 式における > 演算子のタイプルールは次のとおりです。

> の片方のオペランドが整数型の場合、他方のオペランドも整数型でなければならない。

探知器モデルを分析する際、AWS IoT Events のトラブルシューティング機能は、各式をそれに適用されるタイプルールと照合します。演算子のオペランドや、関数の引数のデータタイプを推測します。入力属性または変数のデータタイプが推測されると、トラブルシューティング機能はこの情報を使用して、他のアクションでの式のタイプが正しいかどうかをチェックします。

例: IotSitewiseActions によるタイプエラーの検出

前図に示す AWS IoT SiteWise のアクションを考えてみましょう。次の図に示す AWS IoT Events コンソールで Run Analysis を選択すると、AWS IoT Events のトラブルシューティング機能は、比較式 $input.HeartBeat.weight > 4500 を含む探知器モデルのすべての式を分析し、$input.HeartBeat.weight が整数型に違いないと推論します。

次に、AWS IoT Events は、探知器モデルの AWS IoT SiteWise アクション内の式を調べます。すると、AWS IoT SiteWise のアセットプロパティ forklifts/forklift1/isWeightlb に、$input.HeartBeat.weight という式がブール値として送信されることがわかります。しかし、$input.HeartBeat.weight という式の推論されたデータタイプである数値は、AWS IoT SiteWise のアクションで宣言されたデータタイプのブール値と一致しないため、AWS IoT Eventsは次の図のような警告を表示します。

警告メッセージには、「The expression in the IotSitewiseAction field [$input.HeartBeat.weight] is defined as type Boolean and inferred as type Integer. The defined type and the inferred type must be the same.”と表示されています。 この警告は、AWS IoT Events が $input.HeartBeat.weight という式を整数型と推論したことを示しています。しかし、AWS IoT SiteWise アクションは、この式から評価される実行時の値がブール値であることを想定しています。警告の Location フィールドは、Normal 状態の onEnter イベントリストにある Publish to asset property というイベントの AWS IoT SiteWise アクションで発生することを示しています。

例:カスタムペイロード式によるタイプエラーの検出

AWS IoT SiteWise アクション内の式が特定の宣言されたデータタイプを持つ必要があるのと同様に、AWS IoT Events もカスタムペイロード式が文字列であることを期待しています。例えば、前の図で示したアクションは、Alert if too heavy イベントを表示したものですが、その中でカスタムペイロード式「 'Last weight exceeded 4500, reported: ' + $input.HeartBeat.weight 」を使用した場合を考えてみましょう。

$input.HeartBeat.weight は、重量超過時のアラートイベント条件 $input.HeartBeat.weight > 4500 の中で整数として使用されているため、文字列ペイロードの一部として直接使用することはできません。トラブルシューティング機能では、この問題が次のような警告とともに報告されます。

結論

複雑なシステムの一部である AWS IoT Events の探知器モデルを作成することは難しいという声を、お客様から聞くことがあります。この記事では、AWS IoT Events の探知器モデルのトラブルシューティング方法について説明しました。この機能は、探知器モデルにデータを送信することなく、また探知器モデルを発行することなく、探知器モデルのタイプが正しいかどうかをチェックすることでデバッグ作業を簡素化します。

この機能で報告されるタイプベースの警告やエラーについては、ドキュメントをご参照ください。トラブルシューティング機能を使って、推論されたデータタイプが期待通りかどうかを確認することができます。これで、探知器モデルを発行せずにデータタイプが正しいかどうかを検知できるようになったので、AWS IoT Events コンソールで探知器モデルを編集する際に「Run Analysis」を選択し、探知器モデルを安心して利用してください。

この記事はソリューションアーキテクトの伊藤が翻訳しました。