共用方式為


教學課程:將 Azure Functions 部署為 IoT Edge 模組

適用於: IoT Edge 1.5 核取記號 IoT Edge 1.5 IoT Edge 1.4 核取記號 IoT Edge 1.4

重要

IoT Edge 1.5 LTS 和 IoT Edge 1.4 LTS 為支援的版本。 IoT Edge 1.4 LTS 於 2024 年 11 月 12 日結束生命週期。 如果您是舊版,請參閱更新 IoT Edge

您可以使用 Azure Functions 來部署程式碼,直接在 Azure IoT Edge 裝置上實作您的商務邏輯。 本教學課程會逐步引導您建立並部署 Azure 函式,能在模擬的 IoT Edge 裝置上篩選感應器資料。 您會使用您在快速入門中建立的模擬 IoT Edge 裝置。 在本教學課程中,您會了解如何:

  • 使用 Visual Studio Code 來建立 Azure 函式。
  • 使用 Visual Studio Code 和 Docker 建立 Docker 映像,並將其發佈至容器登錄。
  • 從容器登錄將模組部署到您的 IoT Edge 裝置。
  • 檢視已篩選的資料。

函式架構的圖表,顯示如何暫存及部署函式模組。

您於此教學課程中建立的 Azure 函式,能夠篩選由您裝置所產生的溫度資料。 函式只有在溫度超過指定的閾值時,才會將訊息往上游傳送至 Azure IoT 中樞。

如果您沒有 Azure 訂閱,請在開始之前,先建立 Azure 免費帳戶

必要條件

在開始本教學課程之前,請先完成針對 Linux 容器開發設定開發環境的教學課程:使用 Visual Studio Code 開發 Azure IoT Edge 模組。 完成該教學課程之後,您必須具備下列必要條件:

若要以 Azure Functions 開發 IoT Edge 模組,請在您的開發機器上安裝其他必要條件:

建立函式專案

您在必要條件中安裝的「適用於 Visual Studio Code 的 Azure IoT Edge」可提供管理功能,以及一些程式碼範本。 在本節中,您會使用 Visual Studio Code 建立包含 Azure 函式的 IoT Edge 解決方案。

建立新專案

請遵循下列步驟來建立可自訂的 C# 函式解決方案範本。

  1. 在您的開發電腦上開啟 Visual Studio Code。

  2. 選取 [檢視] > [命令選擇區],以開啟 Visual Studio Code 命令選擇區。

  3. 在命令選擇區中,新增並執行 Azure IoT Edge: New IoT Edge solution 命令。 依照命令選擇區中的這些提示建立解決方案:

    • 選取資料夾:選擇開發機器上可供 Visual Studio Code 建立解決方案檔案的位置。
    • 提供解決方案名稱:輸入解決方案的描述性名稱 (例如 FunctionSolution),或接受預設值。
    • 選取模組範本:選擇 [Azure Functions - C#]
    • 提供模組名稱 | 將您的模組命名為 CSharpFunction
    • 提供模組的 Docker 映像存放庫。 映像存放庫包含容器登錄名稱和容器映像名稱。 系統會預先填入上一個步驟的容器映像。 將 localhost:5000 取代為 Azure Container Registry 的登入伺服器值。 您可以在 Azure 入口網站中,從容器登錄的概觀頁面擷取登入伺服器。 最終字串看起來會類似於:<登錄名稱>.azurecr.io/csharpfunction。

    螢幕擷取畫面:顯示 Visual Studio Code 中新增 Docker 映像存放庫名稱的位置。

新增登錄認證

解決方案的環境檔案會儲存容器登錄的認證,並與 IoT Edge 執行階段共用這些認證。 執行階段需要有這些認證才能將您的私人映像提取到 IoT Edge 裝置。

Visual Studio Code 中的 IoT Edge 擴充功能會嘗試從 Azure 提取您的容器登錄認證,並將這些認證填入到環境檔案中。 請查看您的認證是否已包含在檔案中。 如果沒有,請立即新增:

  1. 在 Visual Studio Code 總管中,開啟 .env 檔案。
  2. 使用從 Azure Container Registry 複製過來的 [使用者名稱] 和 [密碼] 值來更新欄位。 您可以移至 Azure 中的容器登錄,並查看 [設定]>[存取金鑰] 頁面,以再次找到這些值。
  3. 儲存此檔案。

注意

本教學課程會針對 Azure Container Registry 使用系統管理員登入認證,可便於開發和測試案例使用。 當您準備好進行生產案例時,建議使用最低權限驗證選項,例如服務主體。 如需詳細資訊,請參閱管理您容器登錄的存取權

將目標架構設定為 AMD64

只有在 Linux AMD64 架構的容器上,才支援在 IoT Edge 上執行 Azure Functions 模組。 Visual Studio Code 的預設目標架構是 Linux AMD64,但我們會在這裡明確將其設定為 Linux AMD64。

  1. 開啟命令選擇區並搜尋 Azure IoT Edge:設定 Edge 解決方案的預設目標平台

  2. 在命令選擇區中,從選項清單中選取 AMD64 目標架構。

使用自訂程式碼來更新模組

讓我們新增一些額外的程式碼,讓 CSharpFunction 模組在邊緣處理訊息,然後再將訊息轉送到 IoT 中樞。

  1. 在 Visual Studio Code 總管中,開啟 [模組]>[CSharpFunction]>[CSharpFunction.cs]

  2. 以下列程式碼取代 CSharpFunction.cs 檔案的內容。 此程式碼會接收有關環境和機器溫度的遙測,並只會在機器溫度高於所定義的閾值時,才將訊息轉送到 IoT 中樞。

    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. 儲存檔案。

建置和推送 IoT Edge 解決方案

在上一節中,您已建立 IoT Edge 解決方案 並修改 CSharpFunction,以篩選出回報的機器溫度低於可接受閾值的訊息。 現在,您需要建置容器映像形式的解決方案,並將它推送到容器登錄。

  1. 選取 [檢視]>[終端機],以開啟 Visual Studio Code 整合式終端機。

  2. 在終端機中輸入下列命令來登入 Docker。 使用您 Azure 容器登錄中的使用者名稱、密碼和登入伺服器登入。 您可以在 Azure 入口網站中,從登錄的 [存取金鑰] 區段擷取這些值。

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

    您可能會收到安全性警告,建議您使用 --password-stdin。 雖然建議生產案例使用該最佳做法,但是不在本教學課程的討論範圍內。 如需詳細資訊,請參閱 docker login 參考。

  3. 在 Visual Studio Code 總管中,以滑鼠右鍵按一下 deployment.template.json 檔案,然後選取 [建置並推送 IoT Edge 解決方案]

    建置和推送命令會啟動三項作業。 首先,它會在解決方案中建立名為 config 的新資料夾,以保存完整部署資訊清單 (根據部署範本中的資訊建立),以及其他解決方案檔案。 接著,它會執行 docker build,以根據目標架構的適當 dockerfile 建置容器映像。 然後,它會執行 docker push 以將映像存放庫推送至您的容器登錄。

    此程序第一次進行時可能需要幾分鐘的時間,但下一次執行命令時速度就會變快。

檢視容器映像

當容器映像推送至您的容器登錄時,Visual Studio Code 會輸出成功訊息。 如果您想要確認本身作業成功,您可以檢視登錄中的映像。

  1. 在 Azure 入口網站中,瀏覽到您的 Azure 容器登錄。
  2. 選取 [服務]>[存放庫]
  3. 您應該會在清單中看到 csharpfunction 存放庫。 選取此存放庫可查看詳細資料。
  4. 在 [標記] 區段中,您應該會看到 0.0.1-amd64 標記。 此標記表示您所建置的映像版本和平台。 這些值設定於 CSharpFunction 資料夾內的 module.json 檔案中。

部署並執行解決方案

您可以使用 Azure 入口網站將函式模組部署到 IoT Edge 裝置,如同您在快速入門中所做的一樣。 您也可以從 Visual Studio Code 內部署和監視模組。 下列幾節會使用必要條件中所列的「適用於 Visual Studio Code 的 Azure IoT Edge 和 IoT 中樞」。 如果您尚未安裝擴充功能,請立即安裝。

  1. 在 Visual Studio Code 總管中,展開 [Azure IoT 中樞] 區段下的 [裝置] 來查看您的 IoT 裝置清單。

  2. 以滑鼠右鍵按一下 IoT Edge 裝置的名稱,然後選取 [建立單一裝置的部署]

  3. 瀏覽至 CSharpFunction 所在的解決方案資料夾。 開啟 config 資料夾、選取 deployment.amd64.json 檔案,然後選擇 [選取 Edge 部署資訊清單]

  4. 請展開裝置下的模組,以查看已部署且執行中的模組清單。 選取 [重新整理] 按鈕。 您應該會看到新的 CSharpFunction 正在與 SimulatedTemperatureSensor 模組以及 $edgeAgent$edgeHub 一起執行。

    新模組可能需要一些時間才會出現。 IoT Edge 裝置必須從 IoT 中樞擷取其新的部署資訊、啟動新容器,然後向 IoT 中樞回報狀態。

    螢幕擷取畫面:顯示如何在 Visual Studio Code 中檢視已部署的模組。

檢視所產生的資料

您可以在命令選擇區中執行 Azure IoT Hub: Start Monitoring Built-in Event Endpoint,查看從所有裝置送達 IoT 中樞的所有訊息。 若要停止監視訊息,請在命令選擇區中執行命令 Azure IoT Hub: Stop Monitoring Built-in Event Endpoint 命令。

您也可以篩選檢視來查看所有從特定裝置送達 IoT 中樞的訊息。 在 Visual Studio Code 總管的 [Azure IoT 中樞]>[裝置] 區段中,以滑鼠右鍵按一下裝置,然後選取 [開始監視內建事件端點]

清除資源

如果您打算繼續閱讀下一篇建議的文章,則可以保留您所建立的資源和組態,並加以重複使用。 您可以也繼續使用相同的 IoT Edge 裝置作為測試裝置。

否則,可以刪除您在本文中建立的本機組態和 Azure 資源,以避免產生費用。

刪除 Azure 資源

刪除 Azure 資源和資源群組是無法回復的動作。 請確定您不會誤刪錯誤的資源群組或資源。 如果您在現有的資源群組內建立了 IoT 中樞,而該群組包含您想要保留的資源,則您只需刪除 IoT 中樞資源本身,而不要刪除資源群組。

若要刪除資源:

  1. 登入 Azure 入口網站,然後選取 [資源群組]

  2. 選取您的 IoT Edge 測試資源所屬的資源群組名稱。

  3. 檢閱資源群組所包含的資源清單。 若要將其全部刪除,您可以選取 [刪除資源群組]。 如果只想刪除某些部分,則可以選取各個資源以將其個別刪除。

下一步

在本教學課程中,您已建立包含程式碼的 Azure 函式模組,可篩選您 IoT Edge 裝置所產生的原始資料。

請繼續進行後續教學課程,以了解 Azure IoT Edge 有什麼其他方法,可協助您將此資料轉換成具有優勢的商業見解。