教學課程:將 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 模組,請在開發電腦上安裝其他必要條件:

建立函式專案

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

建立新專案

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

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

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

  3. 在命令選擇區中,新增並執行命令 Azure IoT Edge:新的 IoT Edge 解決方案。 請遵循命令選擇區中的下列提示來建立您的解決方案:

    • 選取資料夾:選擇 Visual Studio Code 開發電腦上的位置,以建立方案檔。
    • 提供解決方案名稱:為您的解決方案新增描述性名稱,例如 FunctionSolution 或接受預設值。|
    • 選取模組範本:選擇 [Azure Functions - C#]。
    • 提供模組名稱 |將您的模組 命名為 CSharpFunction
    • 提供模組的 Docker 映像存放庫。 映像存放庫包含容器登錄的名稱和容器映像的名稱。 您的容器映像會從最後一個步驟預先填入。 將localhost:5000取代為您的 Azure 容器登錄中的登入伺服器值。 您可以從 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 容器登錄複製的使用者名稱和密碼值來更新欄位。 您可以移至 Azure 中的容器登錄,並查看 [設定> Access 金鑰] 頁面,以再次找到它們。
  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 StudioCode整合式終端機。

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

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

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

  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 內部署和監視模組。 下列各節使用 Azure IoT Edge 和適用於 Visual Studio Code 的 IoT 中樞,這些 Visual Studio Code 已列在必要條件中。 如果您尚未安裝擴充功能,請立即安裝延伸模組。

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

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

  3. 流覽至包含 CSharpFunction 的解決方案資料夾。 開啟組態資料夾,選取 deployment.amd64.json 檔案,然後選擇 [ 選取Edge部署指令清單]。

  4. 在您的裝置下,展開 [模組 ] 以查看已部署和執行的模組清單。 按兩下 [重新整理] 按鈕。 您應該會看到新的 CSharpFunctionSimulatedTemperatureSensor 模組以及 $edgeAgent$edgeHub一起執行。

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

    顯示如何在 Visual Studio Code 中檢視已部署模組的螢幕快照。

檢視產生的數據

您可以執行 Azure IoT 中樞:在命令選擇區中啟動監視內建事件端點,以查看從所有裝置抵達IoT中樞的所有訊息。 若要停止監視訊息,請在命令選擇區中執行命令 Azure IoT 中樞:停止監視內建事件端點

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

清除資源

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

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

刪除 Azure 資源

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

若要刪除資源:

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

  2. 選取包含IoT Edge測試資源的資源群組名稱。

  3. 檢閱資源群組中包含的資源清單。 如果您想要刪除所有資源群組,您可以選取 [ 刪除資源群組]。 如果您想要只刪除其中一些資源,您可以按下每個資源來個別刪除它們。

下一步

在本教學課程中,您已建立具有程式碼的 Azure Function 模組,以篩選 IoT Edge 裝置所產生的原始數據。

繼續進行下一個教學課程,以瞭解 Azure IoT Edge 可協助您將數據轉換成邊緣商業見解的其他方式。