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の統合を参照してください。

Diagram that shows Azure Event Grid architecture.

リージョン別の提供状況

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 は Base64 エンコード形式でメッセージを書き込みます。

エンドポイントを 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 に設定する必要があります。 これらのプロパティでは、どちらも大文字と小文字が区別されません。

デバイス テレメトリ イベントの場合、IoT Hub は、サブスクリプションに基づいて RouteToEventGrid という名前の既定のメッセージ ルートを作成します。 テレメトリ データが送信される前にメッセージをフィルター処理するには、ルーティング クエリを更新します。

デバイス接続状態イベントの制限

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

Event Grid を使用したデバイスの状態の監視については、「デバイスの接続状態の監視」を参照してください

デバイス接続状態時間

IoT Hub は、各デバイスの接続状態変更イベントの報告を試みますが、一部が見逃される可能性があります。 少なくとも、IoT Hub は、互いに 60 秒離れて発生する接続状態変更イベントを報告します。 この動作により、間にデバイス切断イベントなしで、複数のデバイス接続イベントが報告されるなどの結果が生じる可能性があります。

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

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

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

次のステップ