Event Grid を使用し IoT Hub のイベントに対応してアクションをトリガーする

他のサービスにイベント通知を送信して、ダウンストリームのプロセスをトリガーできるように、Azure IoT Hub は Azure Event Grid と統合します。 IoT Hub イベントをリッスンするようにビジネス アプリケーションを構成して、信頼性が高く、スケーラブルで安全な方法で重要なイベントに対応できるようにします。  たとえば、新しい IoT デバイスが IoT Hub に登録されるたびに、データベースの更新、作業チケットの作成、メール通知の配信などを実行するよう、アプリケーションを構築します。

Azure Event Grid は、発行-サブスクライブ モデルを使う、フル マネージドのイベント ルーティング サービスです。 Event Grid は、Azure FunctionsAzure Logic Apps などの Azure s サービスの組み込みサポートを備えており、webhook を使って Azure 以外のサービスにイベント アラートを配信できます。 Event Grid がサポートするイベント ハンドラーの完全な一覧については、「Azure Event Grid の概要」をご覧ください。

この統合について説明するビデオについては、Azure Event GridとAzure IoT Hubの統合を参照してください。

Azure Event Grid のアーキテクチャ

リージョン別の提供状況

Event Grid の統合は、Event Grid イベントグリッドがサポートされている地域にある IoT ハブで利用できます。 リージョンの最新の一覧については、「リージョン 別に利用可能な製品」を参照してください。

イベントの種類

IoT Hub は次のイベントの種類を発行します。

イベントの種類 説明
Microsoft.Devices.DeviceCreated デバイスが IoT Hub に登録されると発行されます。
Microsoft.Devices.DeviceDeleted デバイスが IoT Hub から削除されると発行されます。
Microsoft.Devices.DeviceConnected デバイスが IoT Hub に接続されると発行されます。
Microsoft.Devices.DeviceDisconnected デバイスが IoT Hub から切断されると発行されます。
Microsoft.Devices.DeviceTelemetry デバイス テレメトリのメッセージが IoT Hub に送信されると発行されます

各 IoT Hub から発行するイベントを構成するには、Azure Portal または Azure CLI を使います。 例については、チュートリアル「Logic Apps を使用して Azure IoT Hub イベントに関する電子メール通知を送信する」をお試しください。

イベント スキーマ

IoT Hub イベントには、デバイスのライフサイクルの変更に対応するために必要なすべての情報が含まれます。 eventType プロパティが Microsoft.Devices で始まることをチェックすることにより、IoT Hub イベントを識別できます。 Event Grid イベント プロパティの使い方について詳しくは、「Event Grid イベント スキーマ」をご覧ください。

デバイス接続スキーマ

次の例では、デバイス接続イベントのスキーマを示します。

[{  
  "id": "f6bbf8f4-d365-520d-a878-17bf7238abd8",
  "topic": "/SUBSCRIPTIONS/<subscription ID>/RESOURCEGROUPS/<resource group name>/PROVIDERS/MICROSOFT.DEVICES/IOTHUBS/<hub name>",
  "subject": "devices/LogicAppTestDevice",
  "eventType": "Microsoft.Devices.DeviceConnected",
  "eventTime": "2018-06-02T19:17:44.4383997Z",
  "data": {
      "deviceConnectionStateEventInfo": {
        "sequenceNumber":
          "000000000000000001D4132452F67CE200000002000000000000000000000001"
      },
    "hubName": "egtesthub1",
    "deviceId": "LogicAppTestDevice",
    "moduleId" : "DeviceModuleID",
  }, 
  "dataVersion": "1",
  "metadataVersion": "1"
}]

デバイス テレメトリ スキーマ

デバイス テレメトリ メッセージは、メッセージのシステム プロパティで コンテンツType が application/json にセットされ、コンテンツEncoding が UTF-8 にセットされた有効な JSON フォームである必要があります。 これらのプロパティでは、どちらも大文字と小文字が区別されません。 コンテンツのエンコードが設定されていない場合、IoT Hub では Base 64 エンコード形式でメッセージが書き込まれます。

エンドポイントを Event Grid として選択してデバイス テレメトリ イベントを Event Grid に発行する前に、それらをエンリッチすることができます。 詳細については、メッセージ エンリッチメントの概要に関するページを参照してください。

次の例に、デバイス テレメトリ イベントのスキーマを示します。

[{  
  "id": "9af86784-8d40-fe2g-8b2a-bab65e106785",
  "topic": "/SUBSCRIPTIONS/<subscription ID>/RESOURCEGROUPS/<resource group name>/PROVIDERS/MICROSOFT.DEVICES/IOTHUBS/<hub name>",
  "subject": "devices/LogicAppTestDevice",
  "eventType": "Microsoft.Devices.DeviceTelemetry",
  "eventTime": "2019-01-07T20:58:30.48Z",
  "data": {
      "body": {
          "Weather": {
              "Temperature": 900
            },
            "Location": "USA"
        },
        "properties": {
            "Status": "Active"
        },
        "systemProperties": {
          "iothub-content-type": "application/json",
          "iothub-content-encoding": "utf-8",
          "iothub-connection-device-id": "d1",
          "iothub-connection-auth-method": "{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}",
          "iothub-connection-auth-generation-id": "123455432199234570",
          "iothub-enqueuedtime": "2019-01-07T20:58:30.48Z",
          "iothub-message-source": "Telemetry"
        }
  },
  "dataVersion": "",
  "metadataVersion": "1"
}]

デバイスで作成されたスキーマ

次の例では、デバイス作成スキーマを示します。

[{
  "id": "56afc886-767b-d359-d59e-0da7877166b2",
  "topic": "/SUBSCRIPTIONS/<subscription ID>/RESOURCEGROUPS/<resource group name>/PROVIDERS/MICROSOFT.DEVICES/IOTHUBS/<hub name>",
  "subject": "devices/LogicAppTestDevice",
  "eventType": "Microsoft.Devices.DeviceCreated",
  "eventTime": "2018-01-02T19:17:44.4383997Z",
  "data": {
    "twin": {
      "deviceId": "LogicAppTestDevice",
      "etag": "AAAAAAAAAAE=",
      "deviceEtag":"null",
      "status": "enabled",
      "statusUpdateTime": "0001-01-01T00:00:00",
      "connectionState": "Disconnected",
      "lastActivityTime": "0001-01-01T00:00:00",
      "cloudToDeviceMessageCount": 0,
      "authenticationType": "sas",
      "x509Thumbprint": {
        "primaryThumbprint": null,
        "secondaryThumbprint": null
      },
      "version": 2,
      "properties": {
        "desired": {
          "$metadata": {
            "$lastUpdated": "2018-01-02T19:17:44.4383997Z"
          },
          "$version": 1
        },
        "reported": {
          "$metadata": {
            "$lastUpdated": "2018-01-02T19:17:44.4383997Z"
          },
          "$version": 1
        }
      }
    },
    "hubName": "egtesthub1",
    "deviceId": "LogicAppTestDevice"
  },
  "dataVersion": "1",
  "metadataVersion": "1"
}]

警告

デバイス作成イベントに関連付けられているツイン データは既定の構成であるため、新しく作成されたデバイスの実際の authenticationType とその他のデバイス プロパティは、それらに依存させないようにしてください。 新しく作成されたデバイスの authenticationType とその他のデバイス プロパティについては、Azure IoT SDK で提供されている Register Manager API を使用してください。

各プロパティの詳しい説明については、「IoT Hub の Azure Event Grid イベント スキーマ」をご覧ください。

イベントのフィルター処理

Event Grid により、イベントの種類、サブジェクト、およびデータ コンテンツでフィルター処理できます。 Event Grid サブスクリプションの作成時に、選択した IoT イベントにサブスクライブするように選択できます。

  • イベントの種類: Azure IoT Hubイベントの種類の一覧については、「イベントの種類」を参照してください。
  • 件名: IoT Hub イベントの場合、サブジェクトはデバイス名です。 件名はフォーム devices/{deviceId}を受け取ります。 先頭 (プレフィックス ) と末尾 (サフィックス) の一致に基づいて件名をフィルター処理できます。 フィルターは AND 演算子を使用するため、プレフィックスとサフィックスの両方に一致するサブジェクトを持つイベントがサブスクライバーに配信されます。
  • データ コンテンツ: データ コンテンツは、メッセージフォームを使用してAzure IoT Hubによって設定されます。 テレメトリ メッセージのコンテンツに基づいて配信されるイベントを選択することができます。 例については、 高度なフィルター処理を参照してください。 テレメトリ メッセージ本文のフィルター処理の場合、メッセージのシステム プロパティで contentType を application/json に設定し、contentEncoding を UTF-8 に設定する必要があります。 これらのプロパティでは、どちらも大文字と小文字が区別されません。

デバイス接続イベントおよびデバイス切断イベントの制限事項

デバイス状態イベント

デバイス接続状態イベントは、MQTT または AMQP のいずれかのプロトコルを使用して、または WebSocket 経由でこれらのプロトコルのいずれかを使用して接続しているデバイスで使用できます。 HTTPS でのみ行われた要求では、デバイス接続状態の通知はトリガーされません。

  • MQTT プロトコルで Java、Node、または Python Azure IoT SDK を使用して接続しているデバイスの場合、接続状態は自動的に送信されます。
  • AMQP プロトコルで Java、Node、または Python Azure IoT SDK を使用して接続しているデバイスの場合、正確な接続状態の遅延を減らすために、クラウドからデバイスへのリンクを作成する必要があります。
  • MQTT または AMQP プロトコルで .NET Azure IoT SDK を使用して接続しているデバイスの場合、最初のデバイスからクラウドまたはクラウドからデバイスへのメッセージが送受信されるまで、デバイス接続イベントは送信されません。
  • Azure IoT SDK の外部の MQTT では、これらの操作は、適切なメッセージング トピックでの SUBSCRIBE または PUBLISH 操作と同じになります。 AMQP 経由では、これらは適切なリンク パスでメッセージをアタッチまたは転送することと同じです。

デバイス状態のサイクル間隔

IoT Hub は、個々のデバイスの接続と切断のアクションを報告するのではなく、定期的な 60 秒のスナップショットで取得された現在の接続状態を公開します。 異なるシーケンス番号で同じ接続状態イベントを受信する場合も、異なる接続状態イベントを受信する場合も、60 秒の期間中にデバイスの接続状態に変化が生じたことを意味します。 image

イベントの使用に関するヒント

IoT Hub イベントを処理するアプリケーションは、以下の推奨される手法に従う必要があります。

  • 同じイベント ハンドラーにイベントをルーティングするように複数のサブスクリプションを構成できるので、イベントが特定のソースからであると想定しないでください。 常にメッセージ トピックをチェックし、予期される IoT Hub からものであることを確認してください。
  • 受信するすべてのイベントが予期する種類であると想定してはいけません。 メッセージを処理する前に、常に eventType をチェックしてください。
  • メッセージは、順不同で、または遅延の後に、到着する場合があります。 etag フィールドを使って、デバイス作成イベントやデバイス削除イベントについて、オブジェクトに関する情報が最新かどうかを確認してください。

次のステップ