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 architecture

リージョン別の提供状況

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

イベントの種類

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"
}]

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

デバイス テレメトリ メッセージは、メッセージのシステム プロパティで contentType が application/json に設定され、contentEncoding が 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 とその他のデバイス プロパティについては、Azure IoT SDK で提供されている Register Manager API を使用してください。

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

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

IoT Hub イベント サブスクリプションでは、イベントの種類、データ コンテンツ、およびサブジェクト (デバイス名) に基づいてイベントをフィルター処理できます。

Event Grid により、イベントの種類、サブジェクト、およびデータ コンテンツでフィルター処理できます。 Event Grid サブスクリプションの作成時に、選択した IoT イベントにサブスクライブするように選択できます。 Event Grid のサブジェクト フィルターは、Begins With (プレフィックス) と Ends With (サフィックス) の一致に基づいて動作します。 フィルターは AND 演算子を使用するため、プレフィックスとサフィックスの両方に一致するサブジェクトを持つイベントがサブスクライバーに配信されます。

IoT イベントのサブジェクトには次の形式が使われます。

devices/{deviceId}

さらに、Event Grid では、データ コンテンツなどの各イベントの属性でフィルター処理することもできます。 これにより、テレメトリ メッセージの内容に基づいて配信されるイベントを選択することができます。 高度なフィルター処理を参照して、例を確認してください。 テレメトリ メッセージ本文のフィルター処理の場合、メッセージのシステム プロパティで contentType を application/json に設定し、contentEncoding を UTF-8 に設定する必要があります。 これらのプロパティでは、どちらも大文字と小文字が区別されません。

DeviceConnected、DeviceDisconnected、DeviceCreated、DeviceDeleted のような非テレメトリ イベントの場合、サブスクリプションの作成時に Event Grid のフィルター処理を使用できます。 テレメトリ イベントの場合、Event Grid でのフィルター処理に加えて、ユーザーは、メッセージ ルーティング クエリ経由で、デバイス ツイン、メッセージのプロパティと本文に対してフィルター処理することもできます。

Event Grid 経由でテレメトリ イベントをサブスクライブすると、IoT Hub では、Event Grid にデータ ソース型のデバイス メッセージを送信するための既定のメッセージ ルートが作成されます。 メッセージ ルーティングの詳細については、IoT Hub メッセージ ルーティングに関するページを参照してください。 このルートは、ポータルの [IoT Hub] > [メッセージ ルーティング] に表示されます。 Event Grid までの唯一のルートは、テレメトリ イベントに対して作成される EG サブスクリプションの数に関係なく作成されます。 そのため、フィルターの異なるサブスクリプションがいくつか必要な場合、同じルートでこれらのクエリに OR 演算子を使用できます。 ルートの作成と削除は、Event Grid 経由のテレメトリ イベントのサブスクリプションによって制御されます。 IoT Hub メッセージ ルーティングを利用して Event Grid までのルートを作成したり、削除したりすることはできません。

テレメトリ データが送信される前に、メッセージをフィルター処理するために、ルーティング クエリを更新できます。 ルーティング クエリは本文が JSON である場合にのみ、メッセージ本文に適用できることに注意してください。 また、メッセージのシステム プロパティで contentType を application/json に設定し、contentEncoding を UTF-8 に設定する必要もあります。

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

デバイス接続状態イベントを受信するには、デバイスで IoT Hub を使用して、device-to-cloud send telemetry または cloud-to-device receive message 操作を呼び出す必要があります。 ただし、デバイスが AMQP プロトコルを使用して IoT Hub に接続する場合は、デバイスで "cloud-to-device メッセージ受信" 操作を呼び出すことをお勧めします。そうしないと、接続状態の通知が数分遅延することがあります。 デバイスが MQTT プロトコルを使用して接続する場合、IoT Hub は cloud-to-device リンクを開いたままにします。 AMQP の cloud-to-device リンクを開くには、Receive Async API を呼び出します。

device-to-cloud リンクは、デバイスがテレメトリを送信する限り、開いたままになります。

デバイスの接続と切断が頻繁に発生する場合、IoT Hub から 1 つ 1 つの接続状態が送信されることはありませんが、60 秒間隔の定期的なスナップショットで取得された現在の接続状態が発行されます。 異なるシーケンス番号で同じ接続状態イベントを受信する場合も、異なる接続状態イベントを受信する場合も、デバイスの接続状態に変化が生じたことを意味します。

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

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

  • 同じイベント ハンドラーにイベントをルーティングするように複数のサブスクリプションを構成できるので、イベントが特定のソースからであると想定しないでください。 常にメッセージ トピックをチェックし、予期される IoT Hub からものであることを確認してください。

  • 受信するすべてのイベントが予期する種類であると想定してはいけません。 メッセージを処理する前に、常に eventType をチェックしてください。

  • メッセージは、順不同で、または遅延の後に、到着する場合があります。 etag フィールドを使って、デバイス作成イベントやデバイス削除イベントについて、オブジェクトに関する情報が最新かどうかを確認してください。

次のステップ