チュートリアル:Azure Functions を IoT Edge モジュールとして展開するTutorial: Deploy Azure Functions as IoT Edge modules

Azure Functions を使用して、ビジネス ロジックを実装するコードを Azure IoT Edge デバイスに直接展開できます。You can use Azure Functions to deploy code that implements your business logic directly to your Azure IoT Edge devices. このチュートリアルでは、シミュレートされた IoT Edge デバイス上のセンサー データをフィルター処理する Azure 関数の作成と展開について段階的に説明します。This tutorial walks you through creating and deploying an Azure Function that filters sensor data on the simulated IoT Edge device. Windows または Linux のシミュレートされたデバイスに Azure IoT Edge をデプロイするクイック スタートで作成した、シミュレートされた IoT Edge デバイスを使用します。You use the simulated IoT Edge device that you created in the Deploy Azure IoT Edge on a simulated device on Windows or Linux quickstarts. このチュートリアルでは、以下の内容を学習します。In this tutorial, you learn how to:

  • Visual Studio Code を使用して、Azure 関数を作成する。Use Visual Studio Code to create an Azure Function.
  • VS Code と Docker を使用して Docker イメージを作成し、コンテナー レジストリに発行する。Use VS Code and Docker to create a Docker image and publish it to a container registry.
  • コンテナー レジストリから IoT Edge デバイスにモジュールを配置する。Deploy the module from the container registry to your IoT Edge device.
  • フィルター処理されたデータを表示する。View filtered data.

図 - チュートリアルのアーキテクチャ: 関数モジュールのステージとデプロイ

![Diagram - Tutorial architecture: stage and deploy function module](./media/tutorial-deploy-function/functions-architecture.png)

このチュートリアルでは、デバイスによって生成される温度データをフィルター処理する Azure 関数を作成します。The Azure Function that you create in this tutorial filters the temperature data that's generated by your device. この関数では、指定されたしきい値を温度が上回っているときにのみ、上流の Azure IoT Hub にメッセージを送信します。The Function only sends messages upstream to Azure IoT Hub when the temperature is above a specified threshold.

Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。If you don't have an Azure subscription, create a free account before you begin.

前提条件Prerequisites

このチュートリアルを開始する前に、前のチュートリアルを完了して、Linux コンテナー開発用の開発環境を設定しておく必要があります。Linux デバイス用の IoT Edge モジュールを開発するBefore beginning this tutorial, you should have gone through the previous tutorial to set up your development environment for Linux container development: Develop IoT Edge modules for Linux devices. このチュートリアルを完了すると、次の前提条件が満たされます。By completing that tutorial, you should have the following prerequisites in place:

Azure Functions を使用して IoT Edge モジュールを開発するには、開発用マシンに次の追加の前提条件をインストールします。To develop an IoT Edge module in with Azure Functions, install the following additional prerequisites on your development machine:

関数プロジェクトを作成するCreate a function project

前提条件としてインストールした Visual Studio Code 用 Azure IoT Tools は、いくつかのコード テンプレートと管理機能を提供します。The Azure IoT Tools for Visual Studio Code that you installed in the prerequisites provides management capabilities as well as some code templates. このセクションでは、Visual Studio Code を使用して、Azure 関数を含む IoT Edge ソリューションを作成します。In this section, you use Visual Studio Code to create an IoT Edge solution that contains an Azure Function.

新しいプロジェクトを作成するCreate a new project

独自のコードでカスタマイズできる C# 関数ソリューション テンプレートを作成します。Create a C# Function solution template that you can customize with your own code.

  1. 開発用マシンで Visual Studio Code を開きます。Open Visual Studio Code on your development machine.

  2. [表示] > [コマンド パレット] を選択して、VS Code コマンド パレットを開きます。Open the VS Code command palette by selecting View > Command Palette.

  3. コマンド パレットで、Azure IoT Edge:New IoT Edge solution コマンドを入力して実行します。In the command palette, enter and run the command Azure IoT Edge: New IoT Edge solution. コマンド パレットに表示されるメッセージに従って、ソリューションを作成します。Follow the prompts in the command palette to create your solution.

    フィールドField Value
    フォルダーの選択Select folder VS Code によってソリューション ファイルが作成される、開発マシン上の場所を選択します。Choose the location on your development machine for VS Code to create the solution files.
    Provide a solution name (ソリューション名の指定)Provide a solution name FunctionSolution のように、ソリューションのわかりやすい名前を入力するか、既定値をそのまま使用します。Enter a descriptive name for your solution, like FunctionSolution, or accept the default.
    Select module template (モジュール テンプレートの選択)Select module template [Azure Functions - C#] を選択します。Choose Azure Functions - C#.
    Provide a module name (モジュール名の指定)Provide a module name モジュールに CSharpFunction という名前を付けます。Name your module CSharpFunction.
    Provide Docker image repository for the module (モジュールの Docker イメージ リポジトリの指定)Provide Docker image repository for the module イメージ リポジトリには、コンテナー レジストリの名前とコンテナー イメージの名前が含まれます。An image repository includes the name of your container registry and the name of your container image. コンテナー イメージは、前の手順で事前設定されます。Your container image is prepopulated from the last step. localhost:5000 を、Azure コンテナー レジストリの ログイン サーバー の値に置き換えます。Replace localhost:5000 with the Login server value from your Azure container registry. Azure portal で、コンテナー レジストリの概要ページからログイン サーバーを取得できます。You can retrieve the Login server from the Overview page of your container registry in the Azure portal. 文字列は最終的に、<registry name>.azurecr.io/CSharpFunction のようになります。The final string looks like <registry name>.azurecr.io/CSharpFunction.

    Docker イメージ リポジトリを指定する

レジストリ資格情報を追加するAdd your registry credentials

コンテナー レジストリの資格情報は、環境ファイルに格納され、IoT Edge ランタイムと共有されます。The environment file stores the credentials for your container registry and shares them with the IoT Edge runtime. ランタイムでご自身のプライベート イメージを IoT Edge デバイスにプルするとき、ランタイムではこれらの資格情報が必要になります。The runtime needs these credentials to pull your private images onto the IoT Edge device.

IoT Edge 拡張機能は、Azure からコンテナー レジストリの資格情報をプルし、それらを環境ファイルに取り込もうとします。The IoT Edge extension tries to pull your container registry credentials from Azure and populate them in the environment file. 資格情報が既に含まれているかどうかを確認します。Check to see if your credentials are already included. 含まれていない場合は、次のようにして追加します。If not, add them now:

  1. VS Code エクスプローラーで、.env ファイルを開きます。In the VS Code explorer, open the .env file.
  2. ご自身の Azure コンテナー レジストリからコピーした ユーザー名パスワード の値を使用して、フィールドを更新します。Update the fields with the username and password values that you copied from your Azure container registry.
  3. このファイルを保存します。Save this file.

ターゲット アーキテクチャを選択するSelect your target architecture

現在、Visual Studio Code では、Linux AMD64 および Linux ARM32v7 デバイス用の C モジュールを開発できます。Currently, Visual Studio Code can develop C modules for Linux AMD64 and Linux ARM32v7 devices. ソリューションごとにターゲットとするアーキテクチャを選択する必要があります。これは、アーキテクチャの種類によって、コンテナーのビルド方法と実行方法が異なるためです。You need to select which architecture you're targeting with each solution, because the container is built and run differently for each architecture type. 既定値は Linux AMD64 です。The default is Linux AMD64.

  1. コマンド パレットを開き、次を検索します: 「Azure IoT Edge: Set Default Target Platform for Edge Solution (Azure IoT Edge: Edge ソリューションの既定のターゲット プラットフォームの設定) 」。または、ウィンドウの下部にあるサイド バーで、ショートカット アイコンを選択します。Open the command palette and search for Azure IoT Edge: Set Default Target Platform for Edge Solution, or select the shortcut icon in the side bar at the bottom of the window.

  2. コマンド パレットで、オプションの一覧からターゲット アーキテクチャを選択します。In the command palette, select the target architecture from the list of options. このチュートリアルでは、Ubuntu 仮想マシンを IoT Edge デバイスとして使用するため、既定値の amd64 のままにします。For this tutorial, we're using an Ubuntu virtual machine as the IoT Edge device, so will keep the default amd64.

カスタム コードでモジュールを更新するUpdate the module with custom code

モジュールがメッセージを IoT Hub に転送する前に、エッジでそれらを処理できるように、追加のコードを追加してみましょう。Let's add some additional code so that the module processes the messages at the edge before forwarding them to IoT Hub.

  1. Visual Studio Code で、 [モジュール] > [CSharpFunction] > [CSharpFunction.cs] の順に開きます。In Visual Studio Code, open modules > CSharpFunction > CSharpFunction.cs.

  2. CSharpFunction.cs ファイルの内容を次のコードに置き換えます。Replace the contents of the CSharpFunction.cs file with the following code. このコードは、周囲温度とマシン温度に関するテレメトリを受け取り、定義されたしきい値をマシン温度が超えた場合にのみ、IoT Hub にメッセージを転送します。This code receives telemetry about ambient and machine temperature, and only forwards the message on to IoT Hub if the machine temperature is above a defined threshold.

    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;}
        }
    }
    
  3. ファイルを保存します。Save the file.

IoT Edge ソリューションをビルドしてプッシュするBuild and push your IoT Edge solution

前のセクションでは、IoT Edge ソリューションを作成し、CSharpFunction を変更しました。これにより、レポートされたマシンの温度が許容可能なしきい値を下回るメッセージがフィルターで除外されます。In the previous section, you created an IoT Edge solution and modified the CSharpFunction to filter out messages with reported machine temperatures below the acceptable threshold. 次は、ソリューションをコンテナー イメージとしてビルドして、それをコンテナー レジストリにプッシュする必要があります。Now you need to build the solution as a container image and push it to your container registry.

  1. [表示] > [ターミナル] を選択して、VS Code 統合ターミナルを開きます。Open the VS Code integrated terminal by selecting View > Terminal.

  2. ターミナルで次のコマンドを入力して、Docker にサインインします。Sign in to Docker by entering the following command in the terminal. 自分の Azure コンテナー レジストリのユーザー名、パスワード、ログイン サーバーを使用してサインインします。Sign in with the username, password, and login server from your Azure container registry. これらの値は、Azure portal でご自身のレジストリの [アクセス キー] セクションから取得できます。You can retrieve these values from the Access keys section of your registry in the Azure portal.

    docker login -u <ACR username> -p <ACR password> <ACR login server>
    

    --password-stdin の使用を推奨するセキュリティ警告が表示される場合があります。You may receive a security warning recommending the use of --password-stdin. このベスト プラクティスは、運用環境のシナリオを対象に推奨されていますが、それはこのチュートリアルの範囲外になります。While that best practice is recommended for production scenarios, it's outside the scope of this tutorial. 詳細については、docker login のリファレンスをご覧ください。For more information, see the docker login reference.

  3. VS Code エクスプローラーで、deployment.template.json ファイルを右クリックし、 [Build and Push IoT Edge Solution](IoT Edge ソリューションのビルドとプッシュ) を選択します。In the VS Code explorer, right-click the deployment.template.json file and select Build and Push IoT Edge Solution.

    ビルドおよびプッシュ コマンドでは、3 つの操作を開始します。The build and push command starts three operations. 最初に、デプロイ テンプレートと他のソリューション ファイルの情報からビルドされた完全な配置マニフェストを保持する、config という新しいフォルダーをソリューション内に作成します。First, it creates a new folder in the solution called config that holds the full deployment manifest, which is built out of information in the deployment template and other solution files. 次に、docker build を実行して、お使いのターゲット アーキテクチャ用の適切な Dockerfile に基づいてコンテナー イメージをビルドします。Second, it runs docker build to build the container image based on the appropriate dockerfile for your target architecture. そして、docker push を実行して、イメージ リポジトリをコンテナー レジストリにプッシュします。Then, it runs docker push to push the image repository to your container registry.

    このプロセスは、初回は数分間かかる可能性がありますが、次回これらのコマンドを実行するときは、それより速くなります。This process may take several minutes the first time, but is faster the next time that you run the commands.

コンテナー イメージの表示View your container image

コンテナー イメージがコンテナー レジストリにプッシュされると、Visual Studio Code によって成功メッセージが出力されます。Visual Studio Code outputs a success message when your container image is pushed to your container registry. 操作の成功を自分で確認したい場合は、レジストリのイメージを表示できます。If you want to confirm the successful operation for yourself, you can view the image in the registry.

  1. Azure portal で、Azure Container Registry に移動します。In the Azure portal, browse to your Azure container registry.
  2. [リポジトリ] を選択します。Select Repositories.
  3. csharpfunction リポジトリが一覧に表示されます。You should see the csharpfunction repository in the list. このリポジトリを選択すると、さらに詳しい情報が表示されます。Select this repository to see more details.
  4. [タグ] セクションには、0.0.1-amd64 タグが表示されます。In the Tags section, you should see the 0.0.1-amd64 tag. このタグには、作成したイメージのバージョンとプラットフォームが示されます。This tag indicates the version and platform of the image that you built. これらの値は、CSharpFunction フォルダーの module.json ファイルで設定されます。These values are set in the module.json file in the CSharpFunction folder.

ソリューションの配置と実行Deploy and run the solution

クイック スタートで行ったように、Azure portal を使用して関数モジュールを IoT Edge デバイスに展開できます。You can use the Azure portal to deploy your Function module to an IoT Edge device like you did in the quickstarts. また、Visual Studio Code 内からモジュールを配置して、監視することもできます。You can also deploy and monitor modules from within Visual Studio Code. 以降のセクションでは、前提条件で示された VS Code 用の Azure IoT Tools を使用します。The following sections use the Azure IoT Tools for VS Code that was listed in the prerequisites. この拡張機能をまだインストールしていない場合は、ここでインストールしてください。Install the extension now, if you didn't already.

  1. Visual Studio Code エクスプローラーの [Azure IoT Hub] セクションで、 [デバイス] を展開して IoT デバイスの一覧を表示します。In the Visual Studio Code explorer, under the Azure IoT Hub section, expand Devices to see your list of IoT devices.

  2. IoT Edge デバイスの名前を右クリックし、 [Create Deployment for Single Device](単一デバイスのデプロイの作成) を選択します。Right-click the name of your IoT Edge device, and then select Create Deployment for Single Device.

  3. CSharpFunction が含まれているソリューション フォルダーの場所を参照します。Browse to the solution folder that contains the CSharpFunction. config フォルダーを開き、deployment.amd64.json ファイルを選択して、 [Select Edge Deployment Manifest](Edge 展開マニフェストの選択) を選択します。Open the config folder, select the deployment.amd64.json file, and then choose Select Edge Deployment Manifest.

  4. お使いのデバイスの [モジュール] を展開し、デプロイされて実行中のモジュールの一覧を表示します。Under your device, expand Modules to see a list of deployed and running modules. 更新ボタンをクリックします。Click the refresh button. 新しい CSharpFunction が、SimulatedTemperatureSensor モジュール、 $edgeAgent および $edgeHub と一緒に実行されていることがわかります。You should see the new CSharpFunction running along with the SimulatedTemperatureSensor module and the $edgeAgent and $edgeHub.

    新しいモジュールが表示されるまでに、数分かかる場合があります。It may take a few moments for the new modules to show up. IoT Edge デバイスは、その新しいデプロイ情報を IoT Hub から取得し、新しいコンテナーを起動した後、その状態を IoT Hub にレポートする必要があります。Your IoT Edge device has to retrieve its new deployment information from IoT Hub, start the new containers, and then report the status back to IoT Hub.

    VS Code での配置されたモジュールの表示

生成されたデータを表示するView the generated data

コマンド パレットで Azure IoT Hub: Start Monitoring Built-in Event Endpoint を実行することによって、IoT ハブに届くすべてのメッセージを確認できます。You can see all of the messages that arrive at your IoT hub by running Azure IoT Hub: Start Monitoring Built-in Event Endpoint in the command palette.

また、特定のデバイスから IoT Hub に届くすべてのメッセージが表示されるよう、ビューをフィルター処理することもできます。You can also filter the view to see all of the messages that arrive at your IoT hub from a specific device. [Azure IoT Hub Devices](Azure IoT Hub デバイス) セクション内でデバイスを右クリックして、 [Start Monitoring Built-in Event Endpoint](組み込みイベント エンドポイントの監視を開始する) を選択します。Right-click the device in the Azure IoT Hub Devices section and select Start Monitoring Built-in Event Endpoint.

メッセージの監視を停止するには、コマンド パレットで Azure IoT Hub: Stop Monitoring Built-in Event Endpoint コマンドを実行します。To stop monitoring messages, run the command Azure IoT Hub: Stop Monitoring Built-in Event Endpoint in the command palette.

リソースをクリーンアップするClean up resources

次の推奨記事に進む場合は、作成したリソースおよび構成を維持して、再利用することができます。If you plan to continue to the next recommended article, you can keep the resources and configurations that you created and reuse them. また、同じ IoT Edge デバイスをテスト デバイスとして使用し続けることもできます。You can also keep using the same IoT Edge device as a test device.

それ以外の場合は、課金されないようにするために、ローカル構成と、この記事で作成した Azure リソースを削除してもかまいません。Otherwise, you can delete the local configurations and the Azure resources that you created in this article to avoid charges.

Azure リソースを削除するDelete Azure resources

Azure のリソースとリソース グループは、削除すると元に戻すことができません。Deleting Azure resources and resource groups is irreversible. 間違ったリソース グループやリソースをうっかり削除しないようにしてください。Make sure that you don't accidentally delete the wrong resource group or resources. IoT Hub を、保持したいリソースが含まれている既存のリソース グループ内に作成した場合は、リソース グループを削除するのではなく、IoT Hub リソースだけを削除してください。If you created the IoT hub inside an existing resource group that has resources that you want to keep, delete only the IoT hub resource itself, instead of deleting the resource group.

リソースを削除するには、次の手順に従います。To delete the resources:

  1. Azure portal にサインインし、 [リソース グループ] を選択します。Sign in to the Azure portal and select Resource groups.

  2. IoT Edge のテスト リソースを含んだリソース グループの名前を選択します。Select the name of the resource group that contains your IoT Edge test resources.

  3. リソース グループに含まれるリソースの一覧を確認します。Review the list of resources contained in your resource group. それらすべてを削除する場合は、 [リソース グループの削除] を選択します。If you want to delete all of them, you can select Delete resource group. 一部だけを削除する場合は、削除する各リソースをクリックして個別に削除してください。If you want to delete only some of them, you can click into each resource to delete them individually.

次のステップNext steps

このチュートリアルでは、IoT Edge デバイスによって生成された生データをフィルター処理するコードが含まれる Azure 関数モジュールを作成しました。In this tutorial, you created an Azure Function module with code to filter raw data that's generated by your IoT Edge device. 独自のモジュールをビルドする準備ができたら、Visual Studio Code を使用した Azure IoT Edge 用の開発方法の詳細をご覧ください。When you're ready to build your own modules, you can learn more about how to Develop with Azure IoT Edge for Visual Studio Code.

引き続き次のチュートリアルを実行すると、Azure IoT Edge を利用して、エッジでデータをビジネス上の分析情報に変える他の方法について学習できます。Continue on to the next tutorials to learn other ways that Azure IoT Edge can help you turn data into business insights at the edge.