IoT Hub デバイス ストリーム (プレビュー)

Azure IoT Hub の "デバイス ストリーム" を使うと、さまざまな cloud-to-device 通信シナリオ用のセキュリティ保護された双方向 TCP トンネルの作成が容易になります。 デバイス ストリームは、デバイスとサービス エンドポイントの間のプロキシとして機能する IoT Hub ストリーミング エンドポイントによって仲介されます。 図で示されているこのセットアップは、デバイスがネットワーク ファイアウォールの内側にある場合や、プライベート ネットワークの内部に存在している場合に特に便利です。 そのため、IoT Hub デバイス ストリームは、ファイアウォール フレンドリな方法で、着信または発信ネットワーク ファイアウォール ポートを広範に開くことなく、IoT デバイスにアクセスしたいという、お客様のニーズに応えるのに役立ちます。

IoT Hub デバイス ストリームを使用することで、デバイスは安全に保たれます。デバイスでは、ポート 443 経由で IoT ハブのストリーミング エンドポイントへのアウトバウンド TCP 接続を開くだけで済みます。 ストリームが確立されると、サービス側とデバイス側のアプリケーションはそれぞれ、WebSocket クライアント オブジェクトにプログラムでアクセスして、生バイトを相互に送受信できます。 このトンネルによって提供される信頼性と順序の保証は、TCP の場合と同様です。

メリット

IoT Hub デバイス ストリームには次の利点があります。

  • ファイアウォール フレンドリなセキュア接続: デバイスまたはネットワーク境界でインバウンド ファイアウォール ポートを開かずに、サービス エンドポイントから IoT デバイスにアクセスできます (ポート 443 を経由する必要があるのは、IoT Hub へのアウトバウンド接続のみです)。

  • 認証: トンネルのデバイス側とサービス側の両方で、対応する資格情報を使って、IoT Hub を認証する必要があります。

  • 暗号化: 既定では、IoT Hub デバイス ストリームで TLS 対応の接続が使用されます。 この要素により、アプリケーションで暗号化が使われているかどうかに関係なく、トラフィックは常に確実に暗号化されます。

  • 接続の簡素化: 多くの場合、デバイス ストリームを使うことによって、IoT デバイスに接続できるようにするための仮想プライベート ネットワークの複雑なセットアップの必要がなくなります。

  • TCP/IP スタックとの互換性: IoT Hub デバイス ストリームでは、TCP/IP アプリケーション トラフィックに対応できます。 このアプローチは、広範な固有と標準ベースのプロトコルでこの機能を使用できることを意味します。

  • プライベート ネットワーク セットアップの簡単な使用: サービスは、デバイスの IP アドレスではなく、デバイス ID を参照することで、デバイスと通信できます。 この事実は、デバイスがプライベート ネットワーク内に存在してプライベート IP アドレスを持っている場合、またはその IP アドレスが動的に割り当てられてサービス側に認識されない場合に便利です。

デバイス ストリームのワークフロー

デバイス ID を提供してデバイスに接続するように、サービスによって要求されたときに、デバイス ストリームが開始されます。 このワークフローは特に、ユーザーが SSH または RDP クライアント プログラムを使用して、デバイス上で実行されている SSH または RDP サーバーにリモートで接続しようとしている (SSH および RDP を含む) クライアント/サーバー通信モデルに適しています。

デバイス ストリームの作成プロセスには、デバイス、サービス、IoT ハブのメインおよびストリーミング エンドポイントの間のネゴシエーションが含まれます。 IoT ハブのメイン エンドポイントでデバイス ストリームの作成が調整されている間に、ストリーミング エンドポイントでは、サービスとデバイスの間を流れるトラフィックが処理されます。

デバイス ストリームの作成フロー

プログラムによる SDK を使ったデバイス ストリームの作成には、図にも示されている、次の手順が含まれます。

  1. デバイス アプリケーションでは、デバイスに対して新しいデバイス ストリームが開始されたときに通知されるように、事前にコールバックが登録されます。 この手順は、通常、デバイスが起動し、IoT Hub に接続されたときに行われます。

  2. サービス側のプログラムでは、(IP アドレス ではなく) デバイス ID を提供することで、必要なときにデバイス ストリームを開始します。

  3. IoT ハブでは、手順 1 で登録したコールバックを呼び出して、デバイス側のプログラムに通知します。 デバイスは、ストリーム開始要求を受け入れるか拒否する場合があります。 このロジックは、アプリケーションのシナリオに固有である可能性があります。 デバイスがストリーム要求を拒否した場合、IoT Hub はそのことをサービスに通知します。それ以外の場合は、次の手順が実行されます。

  4. デバイスでは、ポート 443 経由のストリーミング エンドポイントへの安全なアウトバウンド TCP 接続が作成され、接続が WebSocket にアップグレードされます。 ストリーミング エンドポイントの URL と、認証に使用する資格情報はどちらも、ステップ 3 で送信された要求の一部として IoT Hub によってデバイスに提供されます。

  5. サービスは、ストリームを受け入れるデバイスの結果の通知を受け取り、ストリーミング エンドポイントへの独自の WebSocket クライアントの作成に進みます。 同様に、IoT Hub からのストリーミング エンドポイントの URL と認証情報を受信します。

上記のハンドシェイク プロセスの場合:

  • ハンドシェイク プロセスは 60 秒以内に完了する必要があります (手順 2 から 5)。そうしないと、ハンドシェイクがタイムアウトになって失敗し、適宜、サービスに通知されます。

  • 上記のストリームの作成フローの完了後、ストリーミング エンドポイントはプロキシとして機能し、サービスとデバイス間のトラフィックをそれぞれの WebSocket 経由で転送します。

  • デバイスとサービスの両方に、IoT Hub のメイン エンドポイントとストリーミング エンドポイントへのポート 443 経由のアウトバウンド接続が必要です。 これらのエンドポイントの URL は、IoT Hub のポータルの [概要] タブで確認できます。

  • 確立されたストリームの信頼性と順序の保証は、TCP の場合と同様です。

  • IoT Hub とストリーミング エンドポイントへのすべての接続では TLS が使用され、これらの接続は暗号化されます。

終了フロー

ゲートウェイへの TCP 接続のいずれかが (サービスまたはデバイスによって) 切断されたときに、確立されたストリームが終了します。 このアクションは、デバイスまたはサービスのプログラムで WebSocket を閉じて意図的に、またはネットワーク接続のタイムアウトやプロセスの失敗が発生した場合に非意図的に、実行される可能性があります。 ストリーミング エンドポイントへのデバイスまたはサービスの接続が終了すると、他の TCP 接続も (強制的に) 終了され、ストリームを再作成する必要がある場合は、サービスとデバイスで行う必要があります。

接続の要件

デバイス ストリームのデバイス側とサービス側の両方で、IoT Hub とそのストリーミング エンドポイントへの TLS 対応の接続を確立できる必要があります。 この状況では、これらのエンドポイントへのポート 443 経由のアウトバウンド接続が必要です。 これらのエンドポイントに関連付けられているホスト名は、図で示されているように、IoT Hub の [概要] タブで確認できます。

または、property.hostname および property.deviceStreams キーなど、ハブのプロパティ セクションの下にある Azure CLI を使用して、エンドポイント情報を取得することができます。

az iot hub devicestream show --name <YourIoTHubName>

出力は、ハブのデバイスとサービスがデバイス ストリームを確立するために接続する必要がある可能性がある、すべてのエンドポイントの JSON オブジェクトです。

{
  "streamingEndpoints": [
    "https://<YourIoTHubName>.<region-stamp>.streams.azure-devices.net"
  ]
}

Note

Azure CLI バージョン 2.0.57 以降がインストールされていることを確認してください。 最新バージョンは、「Azure CLI のインストール」ページからダウンロードできます。

デバイス ストリーミング エンドポイントへの送信接続を許可する

この記事の先頭で説明したように、デバイスでは、デバイス ストリームの開始プロセス中に IoT Hub ストリーミング エンドポイントへのアウトバウンド接続が作成されます。 デバイスまたはそのネットワーク上のファイアウォールでは、ポート 443 経由のストリーミング ゲートウェイへのアウトバウンド接続 (TLS を使用して暗号化される WebSocket 接続によって通信が行われることに注意してください) を許可する必要があります。

デバイス ストリーミング エンドポイントのホスト名は、Azure IoT Hub ポータルの [概要] タブで確認できます。

または、Azure CLI を使用して、この情報を見つけることができます。

az iot hub devicestream show --name <YourIoTHubName>

注意

Azure CLI バージョン 2.0.57 以降がインストールされていることを確認してください。 最新バージョンは、「Azure CLI のインストール」ページからダウンロードできます。

デバイス ストリーム リソース ログを使用してトラブルシューティングを行う

Azure Monitor を設定して、IoT Hub によって出力されるデバイス ストリームのリソース ログを収集することができます。 このアプローチは、トラブルシューティングのシナリオで役に立つ場合があります。

次の手順のようにして、IoT Hub のデバイス ストリーム ログを Azure Monitor ログに送信するための診断設定を作成します。

  1. Azure portal で、お使いの IoT ハブに移動します。 左側のウィンドウの [モニター] の下で、 [診断設定] を選択します。 次に [診断設定を追加する] を選択します。

  2. 診断設定の名前を指定し、ログの一覧から [DeviceStreams] を選択します。 次に [Log Analytics への送信] を選択します。 既存の Log Analytics ワークスペースを選ぶか、新しいものを作成するよう指示されます。

    デバイス ストリーム ログを有効にする

  3. デバイス ストリーム ログを Log Analytics ワークスペースに送信するための診断設定を作成した後、Azure portal で IoT ハブの左側のウィンドウにある [モニター][ログ] を選択することでログにアクセスできます。 デバイス ストリーム ログは、AzureDiagnostics テーブルに表示され、Category=DeviceStreams を含みます。 操作の後でログがテーブルに表示されるまで、数分かかる場合があります。

    ここで示すように、ターゲット デバイスの ID と操作の結果もログで確認できます。

IoT Hub での Azure Monitor の使用の詳細については、IoT Hub の監視に関するページを参照してください。 IoT Hub で使用できるすべてのリソース ログ、メトリック、およびテーブルの詳細については、Azure IoT Hub のデータ監視のリファレンスに関するページを参照してください。

リージョン別の提供状況

パブリック プレビュー中は、米国中部、米国東部 EUAP、北ヨーロッパ、東南アジア リージョンで IoT Hub デバイス ストリームを利用できます。 これらのリージョンのいずれかでハブを作成してください。

SDK の可用性

(デバイス側とサービス側の) 各ストリームの 2 つの側で IoT Hub SDK を使用して、トンネルを確立します。 パブリック プレビュー中は、お客様は次の SDK 言語から選ぶことができます。

  • C および C# の SDK では、デバイス側のデバイス ストリームがサポートされます。

  • NodeJS および C# の SDK では、サービス側のデバイス ストリームがサポートされます。

次のステップ