教學課程:將 Azure Functions 部署為 IoT Edge 模組
適用於: 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裝置。
- 檢視篩選的數據。
您在本教學課程中建立的 Azure 函式會篩選裝置所產生的溫度數據。 當溫度高於指定的臨界值時,函式只會將訊息上游傳送至 Azure IoT 中樞。
如果您沒有 Azure 訂閱,請在開始之前,先建立 Azure 免費帳戶。
必要條件
開始本教學課程之前,請執行本教學課程來設定 Linux 容器開發的開發環境: 使用 Visual Studio Code 開發 Azure IoT Edge 模組。 完成該教學課程之後,您應該具備下列必要條件:
- Azure 中的免費或標準層 IoT 中樞。
- 使用 Linux 容器執行 Azure IoT Edge 的 AMD64 裝置。 您可以使用快速入門來設定 Linux 裝置 或 Windows 裝置。
- 容器登錄,例如 Azure Container Registry。
- 使用 Azure IoT Edge 和 Azure IoT 中樞 擴充功能設定的 Visual Studio Code。 適用於 Visual Studio Code 的 Azure IoT Edge 工具擴充功能處於維護模式。
- 在您的開發電腦上下載並安裝 Docker 相容的容器管理系統 。 將它設定為執行 Linux 容器。
若要使用 Azure Functions 開發 IoT Edge 模組,請在開發電腦上安裝其他必要條件:
建立函式專案
您在必要條件中安裝的 Azure IoT Edge for Visual Studio Code 提供管理功能,以及一些程式碼範本。 在本節中,您會使用 Visual Studio Code 來建立包含 Azure 函式的 IoT Edge 解決方案。
建立新專案
請遵循下列步驟來建立可自定義的 C# 函式解決方案範本。
在您的開發電腦上開啟 Visual Studio Code。
選取 [檢視>命令選擇區],以開啟Visual StudioCode命令選擇區。
在命令選擇區中,新增並執行命令 Azure IoT Edge:新的 IoT Edge 解決方案。 請遵循命令選擇區中的下列提示來建立您的解決方案:
- 選取資料夾:選擇 Visual Studio Code 開發電腦上的位置,以建立方案檔。
- 提供解決方案名稱:為您的解決方案新增描述性名稱,例如 FunctionSolution 或接受預設值。|
- 選取模組範本:選擇 [Azure Functions - C#]。
- 提供模組名稱 |將您的模組 命名為 CSharpFunction。
- 提供模組的 Docker 映像存放庫。 映像存放庫包含容器登錄的名稱和容器映像的名稱。 您的容器映像會從最後一個步驟預先填入。 將localhost:5000取代為您的 Azure 容器登錄中的登入伺服器值。 您可以從容器登錄 Azure 入口網站 的 [概觀] 頁面擷取登入伺服器。 最後一個字串看起來像 <登錄名稱>.azurecr.io/csharpfunction。
新增登錄認證
解決方案的環境檔案會儲存容器登錄的認證,並與IoT Edge執行時間共用認證。 運行時間需要這些認證,才能將私人映像提取到IoT Edge裝置。
Visual Studio Code 中的 IoT Edge 擴充功能會嘗試從 Azure 提取容器登錄認證,並在環境檔案中填入這些認證。 檢查您的認證是否已經在檔案中。 如果沒有,請立即新增它們:
- 在 Visual Studio Code 總管中,開啟
.env
檔案。 - 使用您從 Azure 容器登錄複製的使用者名稱和密碼值來更新欄位。 您可以移至 Azure 中的容器登錄並查看 [設定> Access 金鑰] 頁面,以再次找到它們。
- 儲存此檔案。
注意
本教學課程使用適用於 Azure Container Registry 的管理員登入認證,這對開發和測試案例而言很方便。 當您準備好進行生產案例時,建議您使用最低許可權驗證選項,例如服務主體。 如需詳細資訊,請參閱 管理容器登錄的存取權。
將目標架構設定為 AMD64
只有在Linux AMD64型容器上,才支援在IoT Edge上執行 Azure Functions 模組。 Visual Studio Code 的默認目標架構是 Linux AMD64,但我們會在這裡明確將其設定為 Linux AMD64。
開啟命令選擇區並搜尋 Azure IoT Edge:設定 Edge 解決方案的預設目標平臺。
在命令選擇區中,從選項清單中選取 AMD64 目標架構。
使用自定義程式代碼更新模組
讓我們新增一些額外的程式代碼,讓您的 CSharpFunction 模組在將訊息轉送至 IoT 中樞 之前,先處理邊緣的訊息。
在Visual Studio Code 總管中,開啟模組>CSharpFunction>CSharpFunction.cs。
使用下列程式代碼取代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;} } }
儲存檔案。
建置並推送IoT Edge解決方案
在上一節中,您已建立IoT Edge解決方案並修改 CSharpFunction ,以篩選出報告機器溫度低於可接受閾值的訊息。 現在,您必須將解決方案建置為容器映像,並將其推送至您的容器登錄。
選取 [檢視>終端機],以開啟Visual StudioCode整合式終端機。
在終端機中輸入下列命令,以登入 Docker。 使用 Azure 容器登錄的使用者名稱、密碼和登入伺服器登入。 您可以從登錄的 [存取密鑰] 區段擷取這些值,Azure 入口網站。
docker login -u <ACR username> -p <ACR password> <ACR login server>
您可能會收到建議使用
--password-stdin
的安全性警告。 雖然建議針對生產案例使用該最佳做法,但它不在本教學課程的範圍內。 如需詳細資訊,請參閱 docker 登入 參考。在 Visual Studio Code 總管中,以滑鼠右鍵按兩下 deployment.template.json 檔案,然後選取 [ 建置和推送 IoT Edge 解決方案]。
建置和推送命令會啟動三個作業。 首先,它會在名為 config 的解決方案中建立新的資料夾,以保存完整的部署指令清單,此指令清單內建在部署範本和其他解決方案檔案中的資訊中。 其次,它會執行
docker build
,根據目標架構的適當 dockerfile 來建置容器映像。 然後,它會執行docker push
,將映像存放庫推送至容器登錄。此程式第一次可能需要幾分鐘的時間,但下次執行命令時會更快。
檢視您的容器映像
當容器映像推送至容器登錄時,Visual Studio Code 會輸出成功訊息。 如果您想要自行確認作業成功,您可以在登錄中檢視映像。
- 在 Azure 入口網站 中,流覽至您的 Azure 容器登錄。
- 選取 [服務>存放庫]。
- 您應該會在清單中看到 csharpfunction 存放庫。 選取此存放庫以查看更多詳細數據。
- 在 [標記] 區段中,您應該會看到 0.0.1-amd64 標籤。 此標籤表示您所建置映像的版本和平臺。 這些值是在 CSharpFunction 資料夾中的 module.json 檔案中設定。
部署並執行解決方案
您可以使用 Azure 入口網站,將函式模組部署至 IoT Edge 裝置,就像您在快速入門中所做的一樣。 您也可以從 Visual Studio Code 內部署和監視模組。 下列各節使用 Azure IoT Edge 和適用於 Visual Studio Code 的 IoT 中樞,這些 Visual Studio Code 已列在必要條件中。 如果您尚未安裝擴充功能,請立即安裝延伸模組。
在 Visual Studio Code 總管的 [Azure IoT 中樞] 區段底下,展開 [裝置] 以查看您的 IoT 裝置清單。
以滑鼠右鍵按兩下IoT Edge裝置的名稱,然後選取 [ 建立單一裝置的部署]。
流覽至包含 CSharpFunction 的解決方案資料夾。 開啟組態資料夾,選取 deployment.amd64.json 檔案,然後選擇 [ 選取Edge部署指令清單]。
在您的裝置下,展開 [模組 ] 以查看已部署和執行的模組清單。 按兩下 [重新整理] 按鈕。 您應該會看到新的 CSharpFunction 與 SimulatedTemperatureSensor 模組以及 $edgeAgent 和 $edgeHub一起執行。
可能需要一些時間,新的模組才會出現。 IoT Edge 裝置必須從 IoT 中樞 擷取新的部署資訊、啟動新的容器,然後將狀態回報回 IoT 中樞。
檢視產生的數據
您可以執行 Azure IoT 中樞:在命令選擇區中啟動監視內建事件端點,以查看從所有裝置抵達IoT中樞的所有訊息。 若要停止監視訊息,請在命令選擇區中執行命令 Azure IoT 中樞:停止監視內建事件端點。
您也可以篩選檢視,以查看從特定裝置抵達IoT中樞的所有訊息。 在 Visual Studio Code 總管的 [>Azure IoT 中樞][裝置] 區段中,以滑鼠右鍵按兩下裝置,然後選取 [開始監視內建事件端點]。
清除資源
如果您打算繼續閱讀下一篇建議的文章,您可以保留您所建立的資源和組態並重複使用它們。 您也可以繼續使用與測試裝置相同的 IoT Edge 裝置。
否則,您可以刪除本文中建立的本機設定和 Azure 資源,以避免產生費用。
刪除 Azure 資源
刪除 Azure 資源和資源群組是無法回復的動作。 請確定您不會不小心刪除錯誤的資源群組或資源。 如果您在現有資源群組內建立IoT中樞,且該資源群組具有您想要保留的資源,請只刪除IoT中樞資源本身,而不是資源群組。
若要刪除資源:
登入 Azure 入口網站,然後選取 [資源群組]。
選取包含IoT Edge測試資源的資源群組名稱。
檢閱資源群組中包含的資源清單。 如果您想要刪除所有資源群組,您可以選取 [ 刪除資源群組]。 如果您想要只刪除其中一些資源,您可以按下每個資源來個別刪除它們。
下一步
在本教學課程中,您已建立具有程式碼的 Azure Function 模組,以篩選 IoT Edge 裝置所產生的原始數據。
繼續進行下一個教學課程,以瞭解 Azure IoT Edge 可協助您將數據轉換成邊緣商業見解的其他方式。