独自の IoT Edge モジュールを開発する

適用対象:IoT Edge 1.4 checkmark IoT Edge 1.4

重要

IoT Edge 1.4 がサポートされているリリースです。 以前のリリースの場合は、「IoT Edge を更新する」を参照してください。

Azure IoT Edge モジュールでは、他の Azure サービスに接続し、大規模なクラウド データ パイプラインに関与することができます。 この記事では、IoT Edge ランタイムと IoT Hub、したがって Azure クラウドの残りの部分とも通信するモジュールを開発する方法について説明します。

IoT Edge ランタイム環境

IoT Edge ランタイムでは、複数のIoT Edge モジュールの機能を統合し、IoT Edge デバイス上に展開するためのインフラストラクチャが提供されます。 ユーザーは任意のプログラムを IoT Edge モジュールとしてパッケージ化することができます。 IoT Edge の通信機能や管理機能を活用するため、モジュールで実行されているプログラムでは、Azure IoT Device SDK を使用してローカルの IoT Edge ハブに接続できます。

IoT Edge モジュールとしてプログラムをパッケージ化する

IoT Edge デバイスにプログラムをデプロイするには、まず、Docker 互換エンジンで、コンテナー化して実行する必要があります。 IoT Edge では、Docker の背後にあるオープンソース プロジェクトである Moby が Docker 互換エンジンとして使用されます。 Docker で使用していた同じパラメーターを IoT Edge モジュールに渡すことができます。 詳細については、「IoT Edge モジュールのコンテナー作成オプションを構成する方法」を参照してください。

IoT Edge ハブの使用

IoT Edge ハブでは、2 つの主要機能が提供されます。 IoT Hub へのプロキシと、ローカル通信です。

モジュールから IoT Edge ハブへの接続

モジュールからローカル IoT Edge ハブへの接続は、任意のクライアントの場合と同じ接続手順が必要です。 詳細については、IoT Edge ハブ への接続に関するページを参照してください。

AMQP 経由の IoT Edge ルーティングを使用するには、Azure IoT SDK の ModuleClient を使用できます。 ModuleClient インスタンスを作成し、デバイスで実行されている IoT Edge ハブにモジュールを接続します。これは、DeviceClient インスタンスで IoT デバイスを IoT Hub に接続する方法と似ています。 ModuleClient クラスとその通信方法に関する詳細については、優先する SDK 言語 (C#CPythonJava、または Node.js) の API リファレンスを参照してください。

IoT Hub プリミティブ

IoT Hub では、モジュール インスタンスがデバイスと同様に表示されます。 モジュール インスタンスでは次のことができます。

現在のところ、モジュールでは、クラウドからデバイスへのメッセージを受信したり、ファイルのアップロード機能を使用することはできません。

モジュールを作成するときに、デバイス アプリケーションで IoT Hub を使用する場合と同様に、IoT Edge ハブに接続し、IoT Hub プリミティブを使用することができます。 IoT Edge モジュールと IoT デバイス アプリケーションの唯一の違いは、モジュールではデバイス ID の代わりにモジュール ID を参照する必要があることです。

デバイスからクラウドへのメッセージ

IoT Edge モジュールにより、ローカル ブローカーとして機能し、メッセージをクラウドに伝達する IoT Edge ハブ経由で、クラウドにメッセージを送信できます。 デバイスからクラウドへのメッセージの複雑な処理を可能にするために、IoT Edge モジュールでは、他のモジュールまたはデバイスからそのローカルの IoT Edge ハブに送信されたメッセージをインターセプトして処理することができます。 IoT Edge モジュールは、処理済みのデータを含む新しいメッセージを送信します。 そのため、IoT Edge モジュールのチェーンを作成して、ローカル処理パイプラインを構築できます。

ルートを使用して IoT Hub の device-to-cloud メッセージを送信するには:

  • Azure IoT SDK の Module Client クラスを使用します。 各モジュールには、入力出力 エンドポイントがあります。
  • モジュール クライアント クラスの send message メソッドを使用して、モジュールの出力エンドポイントでメッセージを送信します。
  • デバイスの edgeHub モジュールで、この出力エンドポイントを IoT Hub に送信するルートを設定します。

ルートを使用してメッセージを処理するには:

  • 別のエンドポイント (モジュールまたはデバイス) からモジュールの入力エンドポイントにメッセージを送信するルートを設定します。
  • モジュールの入力エンドポイントでメッセージをリッスンします。 新しいメッセージが返されるたびに、Azure IoT SDK によってコールバック関数がトリガーされます。
  • このコールバック関数を使用してメッセージを処理し、必要に応じて、モジュール エンドポイント キューで新しいメッセージを送信します。

Note

ルート宣言の詳細については、「IoT Edge にモジュールをデプロイしてルートを確立する方法について説明します」を参照してください

ツイン

ツインは、IoT Hub によって提供されるプリミティブの 1 つです。 メタデータ、構成、条件などの状態情報を格納する JSON ドキュメントがあります。 各モジュールやデバイスには、独自のツインがあります。

  • Azure IoT SDK でモジュール ツインを取得するには、ModuleClient.getTwin メソッドを呼び出します。

  • Azure IoT SDK によってモジュール ツイン パッチを受け取るには、コールバック関数を実装し、Azure IoT SDK の ModuleClient.moduleTwinCallback メソッドによってそれを登録します。これにより、ツイン パッチが提供されるたびにコールバック関数がトリガーされるようになります。

ダイレクト メソッドを受信する

Azure IoT SDK でダイレクト メソッドを受信するには、コールバック関数を実装し、Azure IoT SDKModuleClient.methodCallback メソッドによってそれを登録します。これにより、ダイレクト メソッドが提供されるたびにコールバック関数がトリガーされるようになります。

言語とアーキテクチャのサポート

IoT Edge では複数のオペレーティング システム、デバイス アーキテクチャ、および開発言語をサポートしているため、ニーズに合うシナリオを構築できます。 ここでは、カスタム IoT Edge モジュールを開発する際の選択肢について説明します。 言語ごとのツールのサポートと要件の詳細については、「IoT Edge のための開発およびテスト環境の準備」を参照してください。

Linux

次の表のすべての言語について、IoT Edge では AMD64 およびほぼすべての ARM64 Linux コンテナーの開発をサポートしています。 Debian 11 ARM32 コンテナーもサポートされています。

開発言語 開発ツール
C Visual Studio Code
Visual Studio 2019/2022
C# Visual Studio Code
Visual Studio 2019/2022
Java Visual Studio Code
Node.js Visual Studio Code
Python Visual Studio Code

Note

AMD64 開発マシンで ARM32 IoT Edge モジュールをコンパイルするなど、クロスプラットフォーム コンパイルの場合は、IoT Edge モジュールに一致するターゲット デバイス アーキテクチャ上でコードをコンパイルするように開発マシンを構成する必要があります。 ターゲット デバイス アーキテクチャの詳細については、「Visual Studio Code を使用して Azure IoT Edge モジュールを開発する」を参照してください。

Windows

Windows コンテナーはサポートサポートされなくなりました。 IoT Edge for Linux on Windows は、Windows デバイスで IoT Edge を実行する場合に推奨される方法です。

モジュールのセキュリティ

モジュールは、セキュリティを考慮して開発する必要があります。 モジュールをセキュリティで保護する方法の詳細については、Docker のセキュリティに関するページを参照してください。

モジュールのセキュリティを向上させるために、IoT Edge は一部のコンテナー機能を既定で無効にします。 必要に応じて、既定値をオーバーライドして、モジュールに特権機能を提供することができます。

管理者特権での Docker アクセス許可を許可する

IoT Edge デバイス上の構成ファイルには、allow_elevated_docker_permissions というパラメーターがあります。 true に設定すると、このフラグによって、--privileged フラグおよび コンテナー作成オプションの Docker HostConfig の CapAdd フィールドで定義した追加の機能が許可されます。

Note

現時点では、このフラグは既定で true に設定されています。これにより、デプロイでモジュールに特権アクセス許可を与えることができます。 デバイスのセキュリティを向上させるには、このフラグを false に設定することをお勧めします。

CAP_CHOWN と CAP_SETUID を有効にする

Docker の機能 CAP_CHOWNCAP_SETUID は、既定で無効になっています。 これらの機能は、ホスト デバイス上のセキュリティで保護されたファイルに書き込むために使用でき、ルート アクセスを取得できる可能性があります。

これらの機能が必要な場合は、コンテナーの作成オプションの CapADD を使用して、手動で再度有効にできます。

次のステップ

IoT Edge のための開発およびテスト環境の準備

Visual Studio Code を使用して Azure IoT Edge モジュールを開発する

Visual Studio Code を使用して Azure IoT Edge モジュールをデバッグする

Azure IoT Hub SDK の概要と使用方法