適用対象: IoT Edge 1.5
重要
IoT Edge 1.5 LTS は、サポートされているリリースです。 IoT Edge 1.4 LTS は、2024 年 11 月 12 日をもってサポートが終了しています。 以前のリリースの場合は、「IoT Edge を更新する」を参照してください。
Azure Functions を使用して、ビジネス ロジックを実行するコードを Azure IoT Edge デバイスに直接デプロイします。 このチュートリアルでは、シミュレートされた IoT Edge デバイスでセンサー データをフィルター処理する Azure 関数を作成してデプロイする方法について説明します。 クイックスタートで作成したシミュレートされた IoT Edge デバイスを使用します。 このチュートリアルでは、以下の内容を学習します。
- Visual Studio Code を使用して、Azure 関数を作成する
- Visual Studio Code と Docker を使用して Docker イメージを作成し、コンテナー レジストリに発行する
- コンテナー レジストリから IoT Edge デバイスにモジュールをデプロイする
- フィルター処理されたデータを表示する
このチュートリアルで作成する Azure 関数は、デバイスによって生成された温度データをフィルター処理します。 この関数は、温度が指定されたしきい値を超えている場合にのみ、アップストリームのメッセージを Azure IoT Hub に送信します。
Azure アカウントをお持ちでない場合は、開始する前に無料アカウントを作成してください。
前提条件
このチュートリアルを開始する前に、チュートリアルに従って Linux コンテナー開発用の開発環境を設定します。 Visual Studio Code を使用して Azure IoT Edge モジュールを開発します。 完了すると、次の前提条件が満たされます。
- Azure の無料または標準のIoT Hub
- Linux コンテナーで Azure IoT Edge を実行している AMD64 デバイス。 クイック スタートを使用して、 Linux デバイス または Windows デバイスを設定します。
- Azure Container Registry などのコンテナー レジストリ
- Azure IoT Edge と Azure IoT Hub 拡張機能を使用して Visual Studio Code を設定します。 "Visual Studio Code 用の Azure IoT Edge Tools" 拡張機能は、メンテナンス モードになっています。
- Docker 互換のコンテナー管理システムをダウンロードし、開発用コンピューターにインストールします。 Linux コンテナーを実行するように設定します。
Azure Functions を使用して IoT Edge モジュールを開発するには、次の追加の前提条件を開発マシンにインストールします。
関数プロジェクトを作成する
Azure IoT Edge for Visual Studio Code には、管理機能とコード テンプレートが用意されています。 このセクションでは、Visual Studio Code を使用して、Azure 関数を使用して IoT Edge ソリューションを作成します。
新しいプロジェクトを作成する
カスタマイズ可能な C# 関数ソリューション テンプレートを作成するには、次の手順に従います。
開発用マシンで Visual Studio Code を開きます。
[表示]>[コマンド パレット] を選択して Visual Studio Code コマンド パレットを開きます。
コマンド パレットで、Azure IoT Edge: New IoT Edge solution コマンドを追加して実行します。 コマンド パレットに表示されるこれらのメッセージに従って、ソリューションを作成します。
- フォルダーの選択: Visual Studio Code によってソリューション ファイルが作成される、開発マシン上の場所を選択します。
- Provide a solution name (ソリューション名の指定): FunctionSolution のように、ソリューションのわかりやすい名前を追加するか、既定値をそのまま使用します。
- Select a module template (モジュール テンプレートの選択): [Azure Functions - C#] を選択します。
- Provide a module name (モジュール名の指定): モジュールに CSharpFunction という名前を付けます。
- Provide Docker image repository for the module (モジュールの Docker イメージ リポジトリの指定): イメージ リポジトリには、コンテナー レジストリの名前とコンテナー イメージの名前が含まれます。 コンテナー イメージは、前の手順で事前設定されます。 localhost:5000 を、Azure Container Registry のログイン サーバーの値に置き換えます。 ログイン サーバーは、Azure portal のコンテナー レジストリの [概要] ページから取得できます。 文字列は最終的に、<レジストリ名>.azurecr.io/csharpfunction のようになります。
レジストリ資格情報を追加する
ソリューション内の環境ファイルは、コンテナー レジストリの資格情報を格納し、IoT Edge ランタイムと共有します。 ランタイムでご自身のプライベート イメージを IoT Edge デバイスにプルするときに、ランタイムでこれらの資格情報が必要になります。
Visual Studio Code の IoT Edge 拡張機能は、Azure からコンテナー レジストリの資格情報をプルし、それらを環境ファイルに取り込もうとします。 資格情報が既にファイルに含まれているかどうかを確認します。 含まれていない場合は、次のようにして追加します。
- Visual Studio Code エクスプローラーで、
.env
ファイルを開きます。 - Azure コンテナー レジストリからコピーした ユーザー名 と パスワード の値でフィールドを更新します。 もう一度見つけるには、Azure のコンテナー レジストリに移動し 、設定>Access キー ページを確認します。
- このファイルを保存します。
注意
このチュートリアルでは、開発とテストのシナリオに便利な、Azure Container Registry の管理者ログイン資格情報を使用します。 運用環境では、サービス プリンシパルなどの最小特権認証オプションを使用します。 詳細については、「コンテナー レジストリへのアクセスを管理する」を参照してください。
ターゲット アーキテクチャを AMD64 に設定する
IoT Edge 上の Azure Functions モジュールは、Linux AMD64 ベースのコンテナーでのみサポートされます。 Visual Studio Code の既定のターゲット アーキテクチャは Linux AMD64 ですが、ここでは Linux AMD64 に明示的に設定します。
コマンド パレットを開き、「Azure IoT Edge: Set Default Target Platform for Edge Solution (Azure IoT Edge: Edge ソリューションの既定のターゲット プラットフォームの設定)」を検索します。
コマンド パレットで、オプションの一覧から AMD64 ターゲット アーキテクチャを選択します。
カスタム コードでモジュールを更新する
CSharpFunction モジュールが IoT Hub に転送する前に、エッジでメッセージを処理するようにコードをいくつか追加します。
Visual Studio Code エクスプローラーで、[モジュール]>[CSharpFunction]>[CSharpFunction.cs] の順に開きます。
CSharpFunction.cs ファイルの内容を次のコードに置き換えます。 このコードは、環境温度とマシン温度に関するテレメトリを受信し、マシンの温度が定義されたしきい値を超えている場合にのみ、メッセージを IoT Hub に転送します。
using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Threading.Tasks; using Microsoft.Azure.Devices.Client; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Extensions.EdgeHub; using Microsoft.Azure.WebJobs.Host; using Microsoft.Extensions.Logging; using Newtonsoft.Json; namespace Functions.Samples { public static class CSharpFunction { [FunctionName("CSharpFunction")] public static async Task FilterMessageAndSendMessage( [EdgeHubTrigger("input1")] Message messageReceived, [EdgeHub(OutputName = "output1")] IAsyncCollector<Message> output, ILogger logger) { const int temperatureThreshold = 20; byte[] messageBytes = messageReceived.GetBytes(); var messageString = System.Text.Encoding.UTF8.GetString(messageBytes); if (!string.IsNullOrEmpty(messageString)) { logger.LogInformation("Info: Received one non-empty message"); // Get the body of the message and deserialize it. var messageBody = JsonConvert.DeserializeObject<MessageBody>(messageString); if (messageBody != null && messageBody.machine.temperature > temperatureThreshold) { // Send the message to the output as the temperature value is greater than the threshold. using (var filteredMessage = new Message(messageBytes)) { // Copy the properties of the original message into the new Message object. foreach (KeyValuePair<string, string> prop in messageReceived.Properties) {filteredMessage.Properties.Add(prop.Key, prop.Value);} // Add a new property to the message to indicate it is an alert. filteredMessage.Properties.Add("MessageType", "Alert"); // Send the message. await output.AddAsync(filteredMessage); logger.LogInformation("Info: Received and transferred a message with temperature above the threshold"); } } } } } //Define the expected schema for the body of incoming messages. class MessageBody { public Machine machine {get; set;} public Ambient ambient {get; set;} public string timeCreated {get; set;} } class Machine { public double temperature {get; set;} public double pressure {get; set;} } class Ambient { public double temperature {get; set;} public int humidity {get; set;} } }
ファイルを保存します。
IoT Edge ソリューションをビルドしてプッシュする
前のセクションでは、IoT Edge ソリューションを作成し、報告されたマシン温度が許容しきい値を下回るメッセージを除外するように CSharpFunction を変更しました。 次に、ソリューションをコンテナー イメージとしてビルドし、コンテナー レジストリにプッシュします。
Visual Studio Code 統合ターミナルを開きます。 [ 表示>ターミナル] を選択します。
ターミナルで Docker にサインインします。 Azure コンテナー レジストリのユーザー名、パスワード、ログイン サーバーを使用します。 これらの値は、Azure portal のレジストリの [アクセス キー ] セクションから取得します。
docker login -u <ACR username> -p <ACR password> <ACR login server>
--password-stdin
の使用を推奨するセキュリティ警告を受け取ることができます。 このベスト プラクティスは、運用環境のシナリオを対象に推奨されていますが、それはこのチュートリアルの範囲外になります。 詳細については、docker login のリファレンスをご覧ください。Visual Studio Code エクスプローラーで、 deployment.template.json ファイルを右クリックし、[ IoT Edge ソリューションのビルドとプッシュ] を選択します。
ビルドおよびプッシュ コマンドでは、3 つの操作を開始します。 最初に、完全な配置マニフェストを含む config という名前の新しいフォルダーをソリューションに作成します。このフォルダーは、配置テンプレートとその他のソリューション ファイルからビルドされます。 次に、
docker build
を実行して、ターゲット アーキテクチャに適した Dockerfile に基づいてコンテナー イメージをビルドします。 そして、docker push
を実行して、イメージ リポジトリをコンテナー レジストリにプッシュします。このプロセスは初めて数分かかる場合がありますが、次にコマンドを実行すると高速になります。
コンテナー イメージの表示
コンテナー イメージがコンテナー レジストリにプッシュされると、Visual Studio Code に成功メッセージが表示されます。 操作を確認するには、レジストリ内のイメージを表示します。
- Azure portal で、Azure コンテナー レジストリに移動します。
- [サービス]>[リポジトリ] を選択します。
- 一覧に csharpfunction リポジトリが表示されます。 詳細を表示するには、このリポジトリを選択します。
- [ タグ ] セクションには、 0.0.1-amd64 タグが表示されます。 このタグには、ビルドしたイメージのバージョンとプラットフォームが表示されます。 これらの値は、CSharpFunction フォルダーの module.json ファイルで設定されます。
ソリューションの配置と実行
Azure portal を使用して、クイックスタートのように Function モジュールを IoT Edge デバイスにデプロイします。 Visual Studio Code からモジュールをデプロイおよび監視することもできます。 次のセクションでは、前提条件に記載されている Visual Studio Code 拡張機能用の Azure IoT Edge と IoT Hub を使用します。 まだインストールしていない場合は、拡張機能を今すぐインストールします。
Visual Studio Code エクスプローラーの Azure IoT Hub セクションで、[ デバイス ] を展開して IoT デバイスの一覧を表示します。
IoT Edge デバイスの名前を右クリックし、 [Create Deployment for Single Device](単一デバイスのデプロイの作成) を選択します。
CSharpFunction を含むソリューション フォルダーに移動します。 config フォルダーを開き、deployment.amd64.json ファイルを選択して、 [Select Edge Deployment Manifest](Edge 展開マニフェストの選択) を選択します。
お使いのデバイスの [モジュール] を展開し、デプロイされて実行中のモジュールの一覧を表示します。 [更新] ボタンを選択します。 SimulatedTemperatureSensor モジュール、$edgeAgent、および$edgeHubと共に実行されている新しい CSharpFunction を確認できます。
新しいモジュールが表示されるまでに少し時間がかかる場合があります。 IoT Edge デバイスは、IoT Hub から新しいデプロイ情報を取得し、新しいコンテナーを開始して、状態を IoT Hub に報告します。
生成されたデータを表示する
コマンド パレットで Azure IoT Hub: 組み込みイベント エンドポイントの監視を開始して、デバイスから IoT ハブに 到着したすべてのメッセージを表示します。 メッセージの監視を停止するには、コマンド パレット で Azure IoT Hub: 組み込みイベント エンドポイントの監視を停止 するを実行します。
ビューをフィルター処理して特定のデバイスからのメッセージを表示するには、Visual Studio Code エクスプローラーの Azure IoT Hub>Devices セクションでデバイスを右クリックし、[ 組み込みイベント エンドポイントの監視の開始] を選択します。
リソースをクリーンアップする
次の推奨記事に進む場合は、作成したリソースと構成を保持し、再利用します。 また、同じ IoT Edge デバイスをテスト デバイスとして使用し続けることもできます。
それ以外の場合は、課金されないように、この記事で作成したローカル構成と Azure リソースを削除します。
Azure リソースを削除する
Azure のリソースとリソース グループは、削除すると元に戻すことができません。 間違ったリソース グループやリソースをうっかり削除しないようにしてください。 保持するリソースを含む既存のリソース グループ内に IoT Hub を作成した場合は、リソース グループではなく、IoT Hub リソース自体のみを削除します。
リソースを削除するには、次の手順に従います。
Azure portal にサインインし、 [リソース グループ] を選択します。
IoT Edge のテスト リソースを含んだリソース グループの名前を選択します。
リソース グループに含まれているリソースの一覧を確認します。 それらすべてを削除する場合は、[リソース グループの削除] を選択します。 一部だけを削除する場合は、削除する各リソースを選択して個別に削除してください。
次のステップ
このチュートリアルでは、IoT Edge デバイスによって生成された生データをフィルター処理するコードが含まれる Azure Functions モジュールを作成しました。
引き続き次のチュートリアルを実行すると、Azure IoT Edge を利用して、エッジでデータをビジネス上の分析情報に変える他の方法について学習できます。