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

適用於:IoT Edge 1.4 checkmark IoT Edge 1.4

重要

支援的版本是 IoT Edge 1.4。 如果您是舊版,請參閱更新 IoT Edge

您可以使用 Azure Functions,將直接實作商業規則的程式代碼部署到 Azure IoT Edge 裝置。 本教學課程會逐步引導您建立及部署 Azure 函式,以篩選模擬 IoT Edge 裝置上的感測器數據。 您可以使用您在快速入門中建立的模擬 IoT Edge 裝置。 在本教學課程中,您會了解如何:

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

Diagram of function architecture, showing how to stage and deploy a function module.

您在本教學課程中建立的 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。

    Screenshot showing where to add your Docker image repository name in Visual Studio Code.

新增登錄認證

解決方案的環境檔案會儲存容器登錄的認證,並與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 中樞。

    Screenshot showing how to view deployed modules in 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 可協助您將數據轉換成邊緣商業見解的其他方式。