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

Azure IoT Hub デバイス ストリームによって、さまざまな cloud-to-device 通信シナリオのセキュリティで保護された双方向 TCP トンネルの作成が容易になります。Azure IoT Hub device streams facilitate the creation of secure bi-directional TCP tunnels for a variety of cloud-to-device communication scenarios. デバイス ストリームは、デバイスとサービス エンドポイント間のプロキシとして機能する、IoT Hub ストリーミング エンドポイントによって仲介されます。A device stream is mediated by an IoT Hub streaming endpoint which acts as a proxy between your device and service endpoints. 下の図に示されているこのセットアップは、デバイスがネットワーク ファイアウォールの背後にある場合や、プライベート ネットワーク内にある場合に特に便利です。This setup, depicted in the diagram below, is especially useful when devices are behind a network firewall or reside inside of a private network. そのため、IoT Hub デバイス ストリームは、ファイアウォール フレンドリな方法で、着信または発信ネットワーク ファイアウォール ポートを広範に開くことなく、IoT デバイスにアクセスしたいという、お客様のニーズに応えるのに役立ちます。As such, IoT Hub device streams help address customers' need to reach IoT devices in a firewall-friendly manner and without the need to broadly opening up incoming or outgoing network firewall ports.

"IoT Hub デバイス ストリームの概要"

IoT Hub デバイス ストリームを使用することで、デバイスは安全に保たれます。デバイスでは、ポート 443 経由で IoT ハブのストリーミング エンドポイントへのアウトバウンド TCP 接続を開くだけで済みます。Using IoT Hub device streams, devices remain secure and will only need to open up outbound TCP connections to IoT hub's streaming endpoint over port 443. ストリームが確立されると、サービス側とデバイス側のアプリケーションはそれぞれ、WebSocket クライアント オブジェクトにプログラムでアクセスし、RAW 型バイトに対する送受信を行うことができます。Once a stream is established, the service-side and device-side applications will each have programmatic access to a WebSocket client object to send and receive raw bytes to one another. このトンネルによって提供される信頼性と順序の保証は、TCP の場合と同様です。The reliability and ordering guarantees provided by this tunnel is on par with TCP.

メリットBenefits

IoT Hub デバイス ストリームには次の利点があります。IoT Hub device streams provide the following benefits:

  • ファイアウォール フレンドリなセキュア接続: デバイスまたはネットワーク境界でインバウンド ファイアウォール ポートを開かずに、サービス エンドポイントから IoT デバイスにアクセスできます (ポート 443 を経由する必要があるのは、IoT Hub へのアウトバウンド接続のみです)。Firewall-friendly secure connectivity: IoT devices can be reached from service endpoints without opening of inbound firewall port at the device or network perimeters (only outbound connectivity to IoT Hub is needed over port 443).

  • 認証: トンネルのデバイス側とサービス側の両方で、対応する資格情報を使って、IoT Hub を認証する必要があります。Authentication: Both device and service sides of the tunnel need to authenticate with IoT Hub using their corresponding credentials.

  • 暗号化: 既定では、IoT Hub デバイス ストリームで TLS 対応の接続が使用されます。Encryption: By default, IoT Hub device streams use TLS-enabled connections. そのため、アプリケーションで暗号化を使用するかどうかに関係なく、トラフィックは常に暗号化されます。This ensures that the traffic is always encrypted regardless of whether the application uses encryption or not.

  • 接続の簡素化: 多くの場合、デバイス ストリームを使うことによって、IoT デバイスに接続できるようにするための仮想プライベート ネットワークの複雑なセットアップの必要がなくなります。Simplicity of connectivity: In many cases, the use of device streams eliminates the need for complex setup of Virtual Private Networks to enable connectivity to IoT devices.

  • TCP/IP スタックとの互換性: IoT Hub デバイス ストリームでは、TCP/IP アプリケーション トラフィックに対応できます。Compatibility with TCP/IP stack: IoT Hub device streams can accommodate TCP/IP application traffic. つまり、広範な専用プロトコルおよび標準ベースのプロトコルで、この機能を利用できます。This means that a wide range of proprietary as well as standards-based protocols can leverage this feature.

  • プライベート ネットワーク セットアップの簡単な使用: サービスは、デバイスの IP アドレスではなく、デバイス ID を参照することで、デバイスと通信できます。Ease of use in private network setups: Service can communicate with a device by referencing its device ID, rather than device's IP address. これは、デバイスがプライベート ネットワーク内にあり、プライベート IP アドレスを持っているか、その IP アドレスが動的に割り当てられており、サービス側に認識されていない場合に便利です。This is useful in situations where a device is located inside a private network and has a private IP address, or its IP address is assigned dynamically and is unknown to the service side.

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

デバイス ID を提供してデバイスに接続するように、サービスによって要求されたときに、デバイス ストリームが開始されます。A device stream is initiated when the service requests to connect to a device by providing its device ID. このワークフローは特に、ユーザーが SSH または RDP クライアント プログラムを使用して、デバイス上で実行されている SSH または RDP サーバーにリモートで接続しようとしている (SSH および RDP を含む) クライアント/サーバー通信モデルに適しています。This workflow particularly fits into a client/server communication model, including SSH and RDP, where a user intends to remotely connect to the SSH or RDP server running on the device using an SSH or RDP client program.

デバイス ストリームの作成プロセスには、デバイス、サービス、IoT ハブのメインおよびストリーミング エンドポイントの間のネゴシエーションが含まれます。The device stream creation process involves a negotiation between the device, service, IoT hub's main and streaming endpoints. IoT ハブのメイン エンドポイントでデバイス ストリームの作成が調整されている間に、ストリーミング エンドポイントでは、サービスとデバイスの間を流れるトラフィックが処理されます。While IoT hub's main endpoint orchestrates the creation of a device stream, the streaming endpoint handles the traffic that flows between the service and device.

デバイス ストリームの作成フローDevice stream creation flow

SDK を使用するデバイス ストリームのプログラムによる作成には、下の図にも示されている、次の手順が含まれます。Programmatic creation of a device stream using the SDK involves the following steps, which are also depicted in the figure below:

"デバイス ストリームのハンドシェイク プロセス"

  1. デバイス アプリケーションでは、デバイスに対して新しいデバイス ストリームが開始されたときに通知されるように、事前にコールバックが登録されます。The device application registers a callback in advance to be notified of when a new device stream is initiated to the device. この手順は、通常、デバイスが起動し、IoT Hub に接続されたときに行われます。This step typically takes place when the device boots up and connects to IoT Hub.

  2. サービス側のプログラムでは、(IP アドレス ではなく) デバイス ID を提供することで、必要なときにデバイス ストリームを開始します。The service-side program initiates a device stream when needed by providing the device ID (not the IP address).

  3. IoT ハブでは、手順 1 で登録したコールバックを呼び出して、デバイス側のプログラムに通知します。IoT hub notifies the device-side program by invoking the callback registered in step 1. デバイスでは、ストリームの開始要求を受け入れるか拒否する場合があります。The device may accept or reject the stream initiation request. このロジックは、アプリケーションのシナリオに固有である可能性があります。This logic can be specific to your application scenario. ストリーム要求がデバイスによって拒否された場合、IoT Hub で適宜、サービスに通知します。それ以外の場合は、以下の手順が続きます。If the stream request is rejected by the device, IoT Hub informs the service accordingly; otherwise, the steps below follow.

  4. デバイスでは、ポート 443 経由のストリーミング エンドポイントへの安全なアウトバウンド TCP 接続が作成され、接続が WebSocket にアップグレードされます。The device creates a secure outbound TCP connection to the streaming endpoint over port 443 and upgrades the connection to a WebSocket. ストリーミング エンドポイントの URL と、認証に使用する資格情報は両方とも、手順 3 で送信された要求の一部として IoT Hub によってデバイスに提供されます。The URL of the streaming endpoint as well as the credentials to use to authenticate are both provided to the device by IoT Hub as part of the request sent in step 3.

  5. サービスは、ストリームを受け入れるデバイスの結果の通知を受け取り、ストリーミング エンドポイントへの独自の WebSocket クライアントの作成に進みます。The service is notified of the result of device accepting the stream and proceeds to create its own WebSocket client to the streaming endpoint. 同様に、IoT Hub からのストリーミング エンドポイントの URL と認証情報を受信します。Similarly, it receives the streaming endpoint URL and authentication information from IoT Hub.

上記のハンドシェイク プロセスの場合:In the handshake process above:

  • ハンドシェイク プロセスは 60 秒以内に完了する必要があります (手順 2 から 5)。そうしないと、ハンドシェイクがタイムアウトになって失敗し、適宜、サービスに通知されます。The handshake process must complete within 60 seconds (step 2 through 5), otherwise the handshake would fail with a timeout and the service will be notified accordingly.

  • 上記のストリームの作成フローの完了後、ストリーミング エンドポイントはプロキシとして機能し、サービスとデバイス間のトラフィックをそれぞれの WebSocket 経由で転送します。After the stream creation flow above completes, the streaming endpoint will act as a proxy and will transfer traffic between the service and the device over their respective WebSockets.

  • デバイスとサービスの両方に、ポート 443 経由のストリーミング エンドポイントと IoT Hub のメイン エンドポイントへのアウトバウンド接続が必要です。Device and service both need outbound connectivity to IoT Hub's main endpoint as well as the streaming endpoint over port 443. これらのエンドポイントの URL は、IoT Hub のポータルの [概要] タブで確認できます。The URL of these endpoints is available on Overview tab on the IoT Hub's portal.

  • 確立されたストリームの信頼性と順序の保証は、TCP の場合と同様です。The reliability and ordering guarantees of an established stream is on par with TCP.

  • IoT Hub とストリーミング エンドポイントへのすべての接続では TLS が使用され、これらの接続は暗号化されます。All connections to IoT Hub and streaming endpoint use TLS and are encrypted.

終了フローTermination flow

ゲートウェイへの TCP 接続のいずれかが (サービスまたはデバイスによって) 切断されたときに、確立されたストリームが終了します。An established stream terminates when either of the TCP connections to the gateway are disconnected (by the service or device). これは、デバイスまたはサービスのプログラムで WebSocket を閉じることで自発的に、あるいはネットワーク接続がタイムアウトになったか、プロセスが失敗した場合に非自発的に行われる可能性があります。This can take place voluntarily by closing the WebSocket on either the device or service programs, or involuntarily in case of a network connectivity timeout or process failure. ストリーミング エンドポイントへのデバイスまたはサービスの接続の終了時に、他の TCP 接続も (強制的に) 終了され、サービスとデバイスでは、必要に応じて、ストリームを再作成することになります。Upon termination of either device or service's connection to the streaming endpoint, the other TCP connection will also be (forcefully) terminated and the service and device are responsible to re-create the stream, if needed.

接続の要件Connectivity Requirements

デバイス ストリームのデバイス側とサービス側の両方で、IoT Hub とそのストリーミング エンドポイントへの TLS 対応の接続を確立できる必要があります。Both the device and the service sides of a device stream must be capable of establishing TLS-enabled connections to IoT Hub and its streaming endpoint. これには、これらのエンドポイントへのポート 443 経由でのアウトバウンド接続が必要です。This requires outbound connectivity over port 443 to these endpoints. これらのエンドポイントに関連付けられているホスト名は、下の図のように、IoT Hub の [概要] タブで確認できます。The hostname associated with these endpoints can be found on the Overview tab of IoT Hub, as shown in the figure below:

"デバイス ストリーム エンドポイント"

または、property.hostname および property.deviceStreams キーなど、ハブのプロパティ セクションの下にある Azure CLI を使用して、エンドポイント情報を取得することができます。Alternatively, the endpoints information can use be retrieved using Azure CLI under the hub's properties section, specifically, property.hostname and property.deviceStreams keys.

az iot hub devicestream show --name <YourIoTHubName>

出力は、ハブのデバイスとサービスが、状況によってはデバイス ストリームを確立するために接続する必要があるすべてのエンドポイントの JSON オブジェクトです。The output is a JSON object of all endpoints that your hub's device and service may need to connect to in order to establish a device stream.

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

注意

Azure CLI バージョン 2.0.57 以降がインストールされていることを確認してください。Ensure you have installed Azure CLI version 2.0.57 or newer. 最新バージョンは、「Azure CLI のインストール」ページからダウンロードできます。You can download the latest version from the Install Azure CLI page.

デバイス ストリーミング エンドポイントへの送信接続を許可するAllow outbound connectivity to the device streaming endpoints

この記事の先頭で説明したように、デバイスでは、デバイス ストリームの開始プロセス中に IoT Hub ストリーミング エンドポイントへのアウトバウンド接続が作成されます。As mentioned at the beginning of this article, your device creates an outbound connection to IoT Hub streaming endpoint during device streams initiation process. デバイスまたはそのネットワーク上のファイアウォールでは、ポート 443 経由のストリーミング ゲートウェイへのアウトバウンド接続 (TLS を使用して暗号化される WebSocket 接続によって通信が行われることに注意してください) を許可する必要があります。Your firewalls on the device or its network must allow outbound connectivity to the streaming gateway over port 443 (note that communication takes place over a WebSocket connection that is encrypted using TLS).

デバイス ストリーミング エンドポイントのホスト名は、Azure IoT Hub ポータルの [概要] タブで確認できます。"デバイス ストリーム エンドポイント"The hostname of device streaming endpoint can be found on the Azure IoT Hub portal under the Overview tab. "Device stream endpoints"

または、Azure CLI を使用して、この情報を見つけることができます。Alternatively, you can find this information using Azure CLI:

az iot hub devicestream show --name <YourIoTHubName>

注意

Azure CLI バージョン 2.0.57 以降がインストールされていることを確認してください。Ensure you have installed Azure CLI version 2.0.57 or newer. 最新バージョンは、「Azure CLI のインストール」ページからダウンロードできます。You can download the latest version from the Install Azure CLI page.

デバイス ストリーム アクティビティ ログを使用してトラブルシューティングを行うTroubleshoot via Device Streams Activity Logs

IoT ハブでデバイス ストリームのアクティビティ ログを収集するように、Azure Monitor ログを設定できます。You can set up Azure Monitor logs to collect the activity log of device streams in your IoT Hub. これは、トラブルシューティング シナリオで非常に役立つ場合があります。This can be very helpful in troubleshooting scenarios.

IoT Hub のデバイス ストリーム アクティビティのために Azure Monitor ログを構成するには、以下の手順に従います。Follow the steps below to configure Azure Monitor logs for your IoT Hub's device stream activities:

  1. IoT Hub の [診断設定] タブに移動し、 [診断をオンにする] リンクをクリックします。Navigate to the Diagnostic settings tab in your IoT Hub, and click on Turn on diagnostics link.

    "診断ログの有効化"

  2. 診断設定の名前を指定し、 [Log Analytics への送信] オプションを選びます。Provide a name for your diagnostics settings, and choose Send to Log Analytics option. 既存の Log Analytics ワークスペース リソースを選ぶか、新しいものを作成するよう指示されます。You will be guided to choose an existing Log Analytics workspace resource or create a new one. さらに、リストの [DeviceStreams] を確認します。Additionally, check the DeviceStreams from the list.

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

  3. これで、IoT Hub のポータルの [ログ] タブにあるデバイス ストリーム ログにアクセスできるようになりました。You can now access your device streams logs under the Logs tab in your IoT Hub's portal. デバイス ストリーム アクティビティ ログは、AzureDiagnostics テーブルに表示されます。ログには Category=DeviceStreams が含まれます。Device stream activity logs will appear in the AzureDiagnostics table and have Category=DeviceStreams.

    以下のように、ターゲット デバイスの ID と操作の結果もログで確認できます。As shown below, the identity of the target device and the result of the operation is also available in the logs.

    "デバイス ストリーム ログにアクセスする"

リージョン別の提供状況Regional Availability

パブリック プレビュー中は、米国中部および米国中部 EUAP リージョンで IoT Hub デバイス ストリームを利用できます。During public preview, IoT Hub device streams are available in the Central US and Central US EUAP regions. これらのリージョンのいずれかでハブを作成するようにしてください。Please make sure you create your hub in one of these regions.

SDK の可用性SDK Availability

(デバイス側とサービス側の) 各ストリームの 2 つの側で IoT Hub SDK を使用して、トンネルを確立します。Two sides of each stream (on the device and service side) use the IoT Hub SDK to establish the tunnel. パブリック プレビュー中は、お客様は次の SDK 言語から選ぶことができます。During public preview, customers can choose from the following SDK languages:

  • C および C# の SDK では、デバイス側のデバイス ストリームがサポートされます。The C and C# SDK's support device streams on the device side.

  • NodeJS および C# の SDK では、サービス側のデバイス ストリームがサポートされます。The NodeJS and C# SDK support device streams on the service side.

IoT Hub デバイス ストリームのサンプルIoT Hub device stream samples

IoT Hub のページでは、2 つのクイックスタート サンプルを利用できます。There are two quickstart samples available on the IoT Hub page. これらでは、アプリケーションでのデバイス ストリームの使用が示されています。These demonstrate the use of device streams by applications.

  • "エコー" サンプルでは、(SDK API を直接呼び出すことによって) プログラムでデバイス ストリームを使用する方法を示しています。The echo sample demonstrates programmatic use of device streams (by calling the SDK API's directly).

  • ローカル プロキシ サンプルでは、デバイス ストリームを使用して (SSH、RDP、Web などの) 既存のアプリケーションのトラフィックをトンネリングする方法を示しています。The local proxy sample demonstrates the tunneling of off-the-shelf client/server application traffic (such as SSH, RDP, or web) through device streams.

これらのサンプルについて、以下で詳しく説明します。These samples are covered in greater detail below.

エコー サンプルEcho Sample

エコー サンプルでは、サービス アプリケーションとデバイス アプリケーション間でバイトを送受信するために、プログラムでデバイス ストリームを使用する方法を示します。The echo sample demonstrates programmatic use of device streams to send and receive bytes between service and device applications. さまざまな言語でサービスとデバイスのプログラムを使用できることに注意してください。Note that you can use service and device programs in different languages. たとえば、C# のサービス プログラムで C のデバイス プログラムを使用できます。For example, you can use the C device program with the C# service program.

echo サンプルを次に示します。Here are the echo samples:

ローカル プロキシのサンプル (SSH または RDP の場合)Local proxy sample (for SSH or RDP)

ローカル プロキシのサンプルでは、クライアントおよびサーバー プログラム間の通信を含む、既存のアプリケーションのトラフィックのトンネリングを有効にする方法を示します。The local proxy sample demonstrates a way to enable tunneling of an existing application's traffic that involves communication between a client and a server program. このセットアップは SSH や RDP などのクライアント/サーバー プロトコルで動作します。その場合、サービス側は (SSH または RDP クライアント プログラムを実行している) クライアントとして機能し、デバイス側は (SSH デーモンまたは RDP サーバー プログラムを実行している) サーバーとして機能します。This set up works for client/server protocols like SSH and RDP, where the service-side acts as a client (running SSH or RDP client programs), and the device-side acts as the server (running SSH daemon or RDP server programs).

このセクションでは、ユーザーがデバイス ストリーム経由でデバイスに SSH 接続できるようにするための、デバイス ストリームの使用方法について説明します (RDP またはその他のクライアント/サーバー アプリケーションのケースは、プロトコルの対応するポートを使用する点で似ています)。This section describes the use of device streams to enable the user to SSH to a device over device streams (the case for RDP or other client/server application are similar by using the protocol's corresponding port).

セットアップでは、下の図に示されている、2 つのローカル プロキシ プログラム (つまり、デバイス ローカル プロキシサービス ローカル プロキシ) が利用されます。The setup leverages two local proxy programs shown in the figure below, namely device-local proxy and service-local proxy. ローカル プロキシ プログラムは、IoT Hub によるデバイス ストリームの開始ハンドシェイクを実行し、通常のクライアント/サーバー ソケットを使用して SSH クライアントおよび SSH デーモンとやりとりします。The local proxy programs are responsible for performing the device stream initiation handshake with IoT Hub, and interacting with SSH client and SSH daemon using regular client/server sockets.

"SSH/RDP のためのデバイス ストリーム プロキシ セットアップ"

  1. ユーザーはサービス ローカル プロキシを実行して、デバイスへのデバイス ストリームを開始します。The user runs service-local proxy to initiate a device stream to the device.

  2. デバイス ローカル プロキシがストリームの開始要求を受け入れ、IoT Hub のストリーミング エンドポイントへのトンネルが確立されます (上の説明を参照)。The device-local proxy accepts the stream initiation request and the tunnel is established to IoT Hub's streaming endpoint (as discussed above).

  3. デバイス ローカル プロキシは、デバイス上のポート 22 をリッスンする SSH デーモン エンドポイントに接続されます。The device-local proxy connects to the SSH daemon endpoint listening on port 22 on the device.

  4. サービス ローカル プロキシは、ユーザーからの新しい SSH 接続を待機している指定されたポートをリッスンします (このサンプルではポート 2222 を使用していますが、それ以外の利用可能なポートに構成することもできます)。The service-local proxy listens on a designated port awaiting new SSH connections from the user (port 2222 used in the sample, but this can be configured to any other available port). ユーザーは SSH クライアントを、localhost 上のサービス ローカル プロキシ ポートにポイントします。The user points the SSH client to the service-local proxy port on localhost.

メモNotes

  • 上記の手順では、SSH クライアント (右側) から SSH デーモン (左側) の間のエンド ツー エンド トンネルを完了します。The above steps complete an end-to-end tunnel between the SSH client (on the right) to the SSH daemon (on the left). このエンド ツー エンド接続の一部として、デバイス ストリーム経由の IoT Hub への送信トラフィックが含まれます。Part of this end-to-end connectivity involves sending traffic over a device stream to IoT Hub.

  • 図の矢印は、エンドポイント間で確立される接続の方向を示しています。The arrows in the figure indicate the direction in which connections are established between endpoints. 具体的には、デバイスに向かうインバウンド接続はないことに注意してください (これは多くの場合、ファイアウォールでブロックされます)。Specifically, note that there is no inbound connections going to the device (this is often blocked by a firewall).

  • サービス ローカル プロキシ上でポート 2222 を使用する選択は任意です。The choice of using port 2222 on the service-local proxy is an arbitrary choice. 他の利用可能なポートを使用するように、プロキシを構成できます。The proxy can be configured to use any other available port.

  • ポート 22 の選択はプロトコルに依存しており、この場合、SSH に固有のものです。The choice of port 22 is protocol-dependent and specific to SSH in this case. RDP の場合は、ポート 3389 を使用する必要があります。For the case of RDP, the port 3389 must be used. これは、提供されているサンプル プログラムで構成できます。This can be configured in the provided sample programs.

以下のリンクを使用して、選択した言語でローカル プロキシ プログラムを実行する方法を確認してください。Use the links below for instructions on how to run the local proxy programs in your language of choice. エコー サンプルと同様、デバイス ローカル プロキシ プログラムとサービス ローカル プロキシ プログラムは完全に相互運用可能であるため、さまざまな言語で実行できます。Similar to the echo sample, you can run device- and service-local proxy programs in different languages as they are fully interoperable.

次の手順Next steps

以下のリンクを使用して、デバイス ストリームについてさらに詳しく学習します。Use the links below to learn more about device streams.