Azure IoT Edge を透過型ゲートウェイとして構成する
この記事の内容
- IoT Edge を透過型ゲートウェイとして構成し、下位デバイスを IoT Hub に対して透過的に見せる方法を解説します
- 証明書(ルート CA・デバイス CA)の作成手順と、ゲートウェイデバイスおよびクライアントへの配置方法を紹介します
- 下位デバイスの接続文字列に
GatewayHostNameを追加して IoT Edge 経由で接続する設定を説明します - .NET サンプルコードを使ったテレメトリ送信と、IoT Hub からのダイレクトメソッド呼び出しの動作確認手順を紹介します
- オンプレミス環境でデバイスがインターネットに直接出られない場合のユースケースとして有効なパターンです
透過型ゲートウェイとは
IoT Edge を透過型ゲートウェイとして構成すると、IoT Edge の下位に接続したデバイスが IoT Hub に対して「普通の IoT デバイス」として透過的に見えるようになります。
通常の構成では、デバイスが直接 IoT Hub に接続しますが、この構成では以下のようなフローになります。
IoT Hub からのメッセージ(ダイレクトメソッドなど)も IoT Edge を経由してデバイスに届きます。IoT Edge Hub モジュールが IoT Hub と同じような役割を IoT Edge 上で担ってくれます。
構成の概要
今回の構成は以下のとおりです。
- IoT Hub:1つ
- IoT Edge デバイス:構成済み(IoT Edge Agent と IoT Edge Hub が動作中)
- 下位デバイス用 VM:Azure 上に新規作成し、IoT Edge デバイスと同一仮想ネットワークに所属させる
- .NET サンプルコード:下位デバイスとしてテレメトリ送信・ダイレクトメソッド受信を行う
手順1:IoT Hub に下位デバイスを作成する
まず IoT Hub 上に下位デバイスを作成します。このとき、デバイスの「親デバイス」として IoT Edge デバイスを指定することで、親子関係を明示できます。
デバイス作成後、プライマリ接続文字列を取得します。このとき、接続文字列のホスト名は IoT Hub のものがそのまま入っていますが、GatewayHostName は自分で追記する必要があります。
手順2:接続文字列に GatewayHostName を追加する
取得した接続文字列の末尾に以下のパラメータを追加します。
GatewayHostName には IoT Edge デバイスの IP アドレスまたはホスト名を指定します。これにより、デバイスは IoT Hub ではなく IoT Edge に対してメッセージを送信するようになります。
手順3:テスト用証明書を作成する
透過型ゲートウェイとして機能させるには、証明書ベースの接続が必須です。デバイスと IoT Edge 間の通信を暗号化するためのルート CA 証明書・デバイス CA 証明書を用意する必要があります。
本番環境では正式な証明書を使用しますが、テスト目的では IoT Edge が提供するスクリプトで自己署名証明書を作成できます。
証明書作成手順(IoT Edge デバイス上で実施)
まず IoT Edge のリポジトリをクローンし、証明書生成スクリプトをコピーします。
# リポジトリをクローン
git clone https://github.com/Azure/iotedge.git
# 必要なスクリプトをコピー
cp iotedge/tools/CACertificates/certGen.sh .
cp iotedge/tools/CACertificates/openssl_root_ca.cnf .
次に、ルート CA 証明書と中間証明書を作成します。
./certGen.sh create_root_and_intermediate
続いて、IoT Edge ゲートウェイ用のデバイス CA 証明書を作成します。
./certGen.sh create_edge_device_ca_certificate "<エッジデバイス名>"
生成されるファイルのうち、主に使用するのは以下の3つです。
- ルート CA 証明書(
azure-iot-test-only.root.ca.cert.pem) - デバイス CA 証明書
- デバイス CA 秘密鍵
手順4:証明書を IoT Edge に設定する
作成した証明書を IoT Edge デバイスの設定ファイルに反映します。
# /etc/aziot/config.toml に証明書パスを設定
[edge_ca]
cert = "file:///path/to/edge-device-ca.cert.pem"
pk = "file:///path/to/edge-device-ca.key.pem"
[trust_bundle_cert]
cert = "file:///path/to/azure-iot-test-only.root.ca.cert.pem"
設定後、IoT Edge を再起動して反映します。
手順5:下位デバイス(Windows PC / VM)にルート CA 証明書をインストールする
下位デバイスが IoT Edge との通信を信頼するために、作成したルート CA 証明書を下位デバイス側にもインストールします。
IoT Edge デバイスから下位デバイスへ証明書ファイルを SCP などでコピーし、Windows の場合は「ローカルコンピューター」の「信頼されたルート証明機関」ストアにインポートします。
これにより、下位デバイスから IoT Edge への接続時に証明書エラーが発生しなくなります。
手順6:.NET サンプルコードで動作確認する
今回は、IoT Hub のサンプルコード(simulate-device / invoke-device-method)を使って動作確認を行います。
テレメトリ送信の確認
下位デバイス側のサンプルコード(SimulatedDevice)の接続文字列に、手順2で作成した GatewayHostName 付きの接続文字列を設定します。
// 接続文字列に GatewayHostName を含める
private readonly static string s_connectionString =
"HostName=<IoTHub>.azure-devices.net;DeviceId=device;SharedAccessKey=<key>;GatewayHostName=<IoTEdgeIP>";
なお、サンプルコード内の ValidateConnectionString 関数が原因で正常動作しない場合は、その呼び出しを無効化してください。
プログラムを実行すると、テレメトリメッセージが IoT Edge 経由で IoT Hub に届くことを IoT Hub Explorer や Azure IoT Explorer で確認できます。
ダイレクトメソッド呼び出しの確認
次に、IoT Hub 側からダイレクトメソッドを呼び出す確認を行います。呼び出し側のサンプルコード(InvokeDeviceMethod)には、デバイスの接続文字列ではなく IoT Hub 自体の接続文字列(IoT Hub オーナーポリシーなど)が必要です。
// IoT Hub の接続文字列(デバイス接続文字列ではない)
private readonly static string s_connectionString =
"HostName=<IoTHub>.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=<key>";
// 対象デバイス名を正しく設定する
private readonly static string s_deviceId = "device";
実行すると、SetTelemetryInterval メソッドが IoT Hub → IoT Edge → 下位デバイスの経路で呼び出され、テレメトリ送信間隔が変化することを確認できます。
動作確認のポイント
IoT Edge のログで接続状況を確認すると、下位デバイスの接続確立(Connected)、MQTT サブスクリプション、デバイスプロキシの動作が確認できます。
iotedge logs edgeHub
# 出力例:
# New device connection for device
# Connection established for edge hub process
# Attempting subscription for device
# DeviceProxy connected
Azure IoT Explorer でデバイスのテレメトリを確認すると、IoT Edge 経由でメッセージが届いていることがわかります。
ユースケース:オンプレミス環境での活用
この構成は特に以下のようなシナリオで有効です。
- デバイスがインターネットに直接接続できないオンプレミス環境
- IoT Edge だけがインターネット接続を持ち、デバイスは IoT Edge とのみ通信する
- IoT Edge 経由でテレメトリをクラウドへ転送し、クラウドからのダイレクトメソッドもデバイスへ届けることができる
デバイスはすべて IoT Edge とだけ通信するため、セキュリティ境界を明確にできます。
構成上の注意点
透過型ゲートウェイ構成における最大の注意点は証明書の設定です。
- デバイス ↔ IoT Edge 間の通信は証明書ベースで暗号化する必要があります
- IoT Edge 側にデバイス CA 証明書を正しく設定すること
- 下位デバイス側にルート CA 証明書をインストールし、IoT Edge を信頼させること
- テスト環境ではスクリプトによる自己署名証明書が利用可能ですが、本番環境では正式な証明書を使用してください
この証明書の設定が構成上もっとも手間のかかる部分ですが、適切に設定することで安全な経路を確立できます。
まとめ
今回は IoT Edge を透過型ゲートウェイとして構成し、下位デバイスが IoT Edge 経由で IoT Hub と通信する構成を実装しました。
- IoT Edge の IoT Edge Hub モジュールが IoT Hub と同等の役割を担い、下位デバイスのメッセージを中継します
- 下位デバイスの接続文字列に
GatewayHostNameを追加するだけで、IoT Edge 経由の接続に切り替えられます - テレメトリのアップストリームだけでなく、IoT Hub からのダイレクトメソッド呼び出しも IoT Edge 経由でデバイスに届きます
- 証明書の適切な設定が構成の核心部分であり、IoT Edge 側・クライアント側の両方への証明書配置が必要です
- オンプレミスなどインターネット非接続環境のデバイスを IoT Hub に接続するための有力なアーキテクチャです