Closed9

AWS IoT Events のユースケースとモチベ、ざっくりした使い方について調べる

hassaku63hassaku63

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." で、状態変化に対する何かしらのアクションをトリガーするための機構らしいというのがわかった

hassaku63hassaku63

色々なデバイスからの入力値を識別できる、と

データのスキーマを定義したり、ルールベースで振り分けたりする機能がありそう(裏とり未実施)なので、

「多様な 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.

hassaku63hassaku63

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.

hassaku63hassaku63

https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-getting-started.html

加圧状況の異常値をモニタリングするらしいチュートリアルを見ていく。3回異常値(過剰加圧状態)が検知されたら SNS に通知する、というのがやりたいことらしい

Create an Input

サンプルとなる入力イベントはこちら↓

{
  "motorid": "Fulton-A32",
  "sensorData": {
    "pressure": 23,
    "temperature": 47
  }
}

マネコンに食わせることで、サンプルイベントのスキーマを認識してくれてる...ように見える。

Create a detector model

状態遷移図を作って、管理変数を操作する方法やそれを使った遷移条件のロジックを書けるようにする、っていうノリに見える。

デバイスID の区別はどうなってるんだろう?というのは疑問。同種のデバイスをどう識別する??デバイス証明書でそこらへんのことはクリアされてる、ということだろうか?

25 あたりで "Create a detector for each unique key value." というのが出てきたので、この辺が対応するのだろうか??

hassaku63hassaku63

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.

ここでデバイスのユニーク性を識別するっぽい。あくまでもイベントデータから識別する模様

hassaku63hassaku63

完成した 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
hassaku63hassaku63

onEnter , onExit , onInput の区別について。

https://dev.classmethod.jp/articles/iot-events-onenter-oninput/

状態遷移図として捉えると解釈しやすい。

onXXX はそれぞれのステートに対して関連付けられる概念。

  • onEnter: そのステートに遷移した瞬間に何をするか
  • onInput: すでにそのステートに遷移済み=「現在そのステートである」状態で受け取った入力に対して何をするか
  • onExit: (何らかの入力等によって引き起こされた State Transition により)自分自身以外のステートに遷移する瞬間に、何をするか

CloudFormation をざっと見る限りでは、 onXXX が発生したときに起こるのはおおよそ「イベント」と「ステートの遷移」あたりでざっと分類できそう。

ステートの遷移については状態遷移図なので当然ある話。説明不要

「イベント」は、IoT Events の概念。「アクション」を内包している。

アクションで SNS を叩いたり、内部変数を書き換えたりする。その際にそのアクションをトリガーする条件式もオプションで追加可能。この条件式によって、公式チュートリアル(?)の「3回しきい値超えしたら」といった、ステートフルな条件を実装可能にしている。

このスクラップは2021/04/05にクローズされました