AWS IoT Events のユースケースとモチベ、ざっくりした使い方について調べる
AWS IoT Events enables you to monitor your equipment or device fleets for failures or changes in operation, and to trigger actions when such events occur. AWS IoT Events continuously watches IoT sensor data from devices, processes, applications, and other AWS services to identify significant events so you can take action.
"for failures or changes in operation, and to trigger actions when such events occur." で、状態変化に対する何かしらのアクションをトリガーするための機構らしいというのがわかった
色々なデバイスからの入力値を識別できる、と
データのスキーマを定義したり、ルールベースで振り分けたりする機能がありそう(裏とり未実施)なので、
「多様な Input のバリエーションに対して、それをルールベースで識別し、適切なアクションを割り当てることができる(Low Code で)」みたいなことが IoT Events のやりたいことなのかもしれない
Use Simple Logical Expressions to Recognize Complex Patterns of Events
AWS IoT Events can recognize patterns of events that involve multiple inputs from a single IoT device or application, or from diverse equipment and many independent sensors. This is especially useful because each sensor and application provides important information. But only by combining diverse sensor and application data can you get a complete picture of the performance and quality of operations. You can configure AWS IoT Events detectors to recognize these events using simple logical expressions instead of complex code.
SNS, IoT Core, Lambda, SQS, Firehose をトリガーできるらしい。
IoT Rules から Lambda をトリガーすることもできるらしいが、IoT Events と何が違ってるのかはちょっと今の自分にはよくわからない。
Trigger Actions Based on Events
AWS IoT Events enables you to directly trigger actions in Amazon Simple Notification Service (Amazon SNS), AWS IoT Core, Lambda, Amazon SQS and Amazon Kinesis Firehose. You can also trigger an AWS Lambda function using the AWS IoT rules engine which makes it possible to take actions using other services, such as Amazon Connect, or your own enterprise resource planning (ERP) applications.
AWS IoT Events includes a prebuilt library of actions you can take, and also enables you to define your own.
加圧状況の異常値をモニタリングするらしいチュートリアルを見ていく。3回異常値(過剰加圧状態)が検知されたら SNS に通知する、というのがやりたいことらしい
サンプルとなる入力イベントはこちら↓
{
"motorid": "Fulton-A32",
"sensorData": {
"pressure": 23,
"temperature": 47
}
}
マネコンに食わせることで、サンプルイベントのスキーマを認識してくれてる...ように見える。
状態遷移図を作って、管理変数を操作する方法やそれを使った遷移条件のロジックを書けるようにする、っていうノリに見える。
デバイスID の区別はどうなってるんだろう?というのは疑問。同種のデバイスをどう識別する??デバイス証明書でそこらへんのことはクリアされてる、ということだろうか?
25 あたりで "Create a detector for each unique key value." というのが出てきたので、この辺が対応するのだろうか??
For Detector creation key, choose the name of one of the attributes of the input you defined earlier. The attribute that you choose as the detector creation key must be present in each message input, and must be unique to each device that sends messages. This example uses the motorid attribute.
ここでデバイスのユニーク性を識別するっぽい。あくまでもイベントデータから識別する模様
完成した Detector Model の定義を yaml に吐き出してみた。
---
detectorModel:
detectorModelConfiguration:
status: ACTIVE
lastUpdateTime: 1552072424.212
roleArn: arn:aws:iam::123456789012:role/IoTEventsRole
creationTime: 1552072424.212
detectorModelArn: arn:aws:iotevents:us-west-2:123456789012:detectorModel/motorDetectorModel
key: motorid
detectorModelName: motorDetectorModel
detectorModelVersion: '1'
detectorModelDefinition:
states:
- onInput:
transitionEvents:
- eventName: Overpressurized
actions:
- setVariable:
variableName: pressureThresholdBreached
value: "$variable.pressureThresholdBreached + 3"
condition: "$input.PressureInput.sensorData.pressure > 70"
nextState: Dangerous
events: []
stateName: Normal
onEnter:
events:
- eventName: init
actions:
- setVariable:
variableName: pressureThresholdBreached
value: '0'
condition: 'true'
onExit:
events: []
- onInput:
transitionEvents:
- eventName: Back to Normal
actions: []
condition: "$variable.pressureThresholdBreached <= 1 && $input.PressureInput.sensorData.pressure
<= 70"
nextState: Normal
events:
- eventName: Overpressurized
actions:
- setVariable:
variableName: pressureThresholdBreached
value: '3'
condition: "$input.PressureInput.sensorData.pressure > 70"
- eventName: Pressure Okay
actions:
- setVariable:
variableName: pressureThresholdBreached
value: "$variable.pressureThresholdBreached - 1"
condition: "$input.PressureInput.sensorData.pressure <= 70"
stateName: Dangerous
onEnter:
events:
- eventName: Pressure Threshold Breached
actions:
- sns:
targetArn: arn:aws:sns:us-west-2:123456789012:MyIoTButtonSNSTopic
condition: "$variable.pressureThresholdBreached > 1"
onExit:
events:
- eventName: Normal Pressure Restored
actions:
- sns:
targetArn: arn:aws:sns:us-west-2:123456789012:IoTVirtualButtonTopic
condition: 'true'
initialStateName: Normal
onEnter
, onExit
, onInput
の区別について。
状態遷移図として捉えると解釈しやすい。
onXXX
はそれぞれのステートに対して関連付けられる概念。
- onEnter: そのステートに遷移した瞬間に何をするか
- onInput: すでにそのステートに遷移済み=「現在そのステートである」状態で受け取った入力に対して何をするか
- onExit: (何らかの入力等によって引き起こされた State Transition により)自分自身以外のステートに遷移する瞬間に、何をするか
CloudFormation をざっと見る限りでは、 onXXX
が発生したときに起こるのはおおよそ「イベント」と「ステートの遷移」あたりでざっと分類できそう。
ステートの遷移については状態遷移図なので当然ある話。説明不要
「イベント」は、IoT Events の概念。「アクション」を内包している。
アクションで SNS を叩いたり、内部変数を書き換えたりする。その際にそのアクションをトリガーする条件式もオプションで追加可能。この条件式によって、公式チュートリアル(?)の「3回しきい値超えしたら」といった、ステートフルな条件を実装可能にしている。
なんとなくノリは把握できたので、クローズする