次の方法で共有


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

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

IoT Hub デバイス ストリームの概要を示す図。

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 を使ったデバイス ストリームの作成には、図にも示されている、次の手順が含まれます。

IoT Hub デバイス ストリームのハンドシェイク プロセスの手順を示す図。

  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 経由のアウトバウンド接続が必要です。 ストリーミング エンドポイントに関連付けられているホスト名は、次のスクリーンショットに示すように、Azure portal の IoT ハブの概要ウィンドウにあります。

Azure portal の IoT ハブの作業ウィンドウのスクリーンショット。デバイス ストリーミング エンドポイントのホスト名が強調表示されています。

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

az iot hub devicestream show --name <YourIoTHubName>

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

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

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

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

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

ストリーミング エンドポイントに関連付けられているホスト名は、次のスクリーンショットに示すように、Azure portal の IoT ハブの概要ウィンドウにあります。

Azure portal の IoT ハブの作業ウィンドウのスクリーンショット。デバイス ストリーミング エンドポイントのホスト名が強調表示されています。

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

az iot hub devicestream show --name <YourIoTHubName>

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

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

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

IoT ハブの Device Streams リソース ログを Azure Monitor ログに送信する診断設定を作成するには、次の手順に従います。

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

  2. 診断設定の名前を指定し、ログの一覧から [デバイス ストリーム (プレビュー)] を選択します。 Log Analytics ワークスペースに送信を選択します。 既存の Log Analytics ワークスペースを選択するか、新しいワークスペースを作成するように案内されます。

    Azure portal の [診断設定] ウィンドウを示すスクリーンショット。Device Streams リソース ログの設定が強調表示されています。

  3. Device Streams リソース ログを Log Analytics ワークスペースに送信する診断設定を作成したら、Azure portal の IoT ハブの左側のウィンドウで [監視] の下にある [ログ] を選択してログにアクセスできます。 Device Streams リソース ログは、 AzureDiagnostics テーブルに表示され、Category=DeviceStreamsを持っています。 操作の後でログがテーブルに表示されるまで、数分かかる場合があります。

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

    IoT ハブの AzureDiagnostic ログを示すスクリーンショット。Device Streams リソース ログ エントリの ID、操作、結果が強調表示されています。

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

リージョン別の提供状況

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

SDK の可用性

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

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

  • Node.js SDK と C# SDK は、サービス側のデバイス ストリームをサポートします。

次のステップ