本文說明如何設定 Durable Functions,將協調生命週期事件(如已建立、完成與失敗)發佈到自訂 的 Azure 事件網格主題。
以下是一些使用此功能有用的情境:
像藍綠部署這類 DevOps 情境:在實施並排部署策略前,你可能想先知道是否有任務正在執行。
進階監控與診斷支援:你可以在針對查詢優化的外部儲存庫中追蹤編排狀態資訊,例如 Azure SQL Database 或 Azure Cosmos DB。
長時間執行的背景活動:如果你使用 Durable Functions 來管理長期執行的背景活動,此功能能幫助你了解目前狀態。
先決條件
- 在您的 Durable Functions 專案中安裝 Microsoft.Azure.WebJobs.Extensions.DurableTask 。
- 安裝 Azurite 儲存模擬器 ,或使用現有的 Azure 儲存帳號。
- 安裝 Azure CLI 或使用 Azure Cloud Shell
建立自訂事件網格主題
建立一個事件網格主題,用於從持久函數傳送事件。 以下說明說明如何使用 Azure CLI 建立主題。 你也可以 使用 PowerShell 或 Azure 入口網站來建立主題。
建立資源群組
使用 az group create 命令建立資源群組。 目前 Azure Event Grid 並不支援所有區域。 有關支援哪些區域的資訊,請參閱 Azure 事件網格總覽。
az group create --name eventResourceGroup --location westus2
建立自訂主題
事件網格主題提供一個使用者定義的端點,你可以把事件發佈到那裡。 以主題的唯一名稱取代 <topic_name>。 主題名稱必須是唯一的,因為它會成為 DNS 條目。
az eventgrid topic create --name <topic_name> -l westus2 -g eventResourceGroup
取得端點和金鑰
找出主題的終點。 請用你選擇的名字來替代 <topic_name> 。
az eventgrid topic show --name <topic_name> -g eventResourceGroup --query "endpoint" --output tsv
如果你使用基於金鑰的驗證,請取得主題金鑰。 請用你選擇的名字來替代 <topic_name> 。
az eventgrid topic key list --name <topic_name> -g eventResourceGroup --query "key1" --output tsv
現在你可以將事件發送到主題。
配置事件網格發佈使用基於金鑰的認證
在你的 Durable Functions 專案中,找到該 host.json 檔案。
Durable Functions 1.x
在durableTask屬性中加入eventGridTopicEndpoint和eventGridKeySettingName。
{
"durableTask": {
"eventGridTopicEndpoint": "https://<topic_name>.westus2-1.eventgrid.azure.net/api/events",
"eventGridKeySettingName": "EventGridKey"
}
}
Durable Functions 2.x
在檔案屬性中新增一個 notifications 區段 durableTask ,並以你選擇的名稱替換 <topic_name> 。 如果 durableTask or extensions 屬性不存在,請像這個範例一樣建立它們:
{
"version": "2.0",
"extensions": {
"durableTask": {
"notifications": {
"eventGrid": {
"topicEndpoint": "https://<topic_name>.westus2-1.eventgrid.azure.net/api/events",
"keySettingName": "EventGridKey"
}
}
}
}
}
Azure Event Grid 可能的設定屬性可在 host.json 文件中找到。 設定 host.json 檔案後,函式應用程式會將生命週期事件傳送到事件網格主題。 這個動作從你在本地和 Azure 執行函式應用程式時開始。
設定函數應用程式和 local.settings.json 的主題索引鍵應用程式設定。 以下 JSON 是使用 Azure Storage 模擬器進行本地除錯的範例 local.settings.json 。 請用主題鍵替換 <topic_key> 。
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"EventGridKey": "<topic_key>"
}
}
如果你用的是 Storage Emulator 而不是真正的 Azure Storage 帳號,請確保它正在運行。 執行前清除現有儲存資料是個好主意。
如果您使用真正的 Azure 儲存體帳戶,請用它的連接字串取代 local.settings.json 的 UseDevelopmentStorage=true。
使用受管理的身分設定事件網格發佈
Azure 中的受管理身份允許資源在不儲存憑證的情況下認證 Azure 服務,簡化了安全性與身份管理。 系統指派 的管理身份會在你啟用 Azure 資源時自動建立,並綁定到該資源的生命週期。 如果資源被刪除,該身份也會被移除。 使用者指派 的管理身份是作為獨立的 Azure 資源建立的,並可指派給多個資源。 它獨立於任何資源存在,提供共享存取與集中身份管理的彈性。 建議使用使用者指派身份,因為它不綁定應用程式的生命週期。
欲了解更多資訊,請參閱 「使用受管理身份於 App Service 與 Azure Functions」。
系統指派的身分識別
要設定系統指派身份,請遵循以下指示:
設定
開啟函數應用程式的系統指派識別碼
前往函數應用程式的 [身分識別] 區塊,並在 [系統指派] 索引標籤,將 [狀態] 開關切換為開啟。
在事件網格主題資源中,將函式應用程式賦予 EventGrid 資料發送者角色。
前往 存取控制(IAM) 區塊,點擊 + 新增。
選擇 EventGrid 資料發送 者角色,點擊 「下一步」。
在「指派存取權」區塊選擇「管理身份」,在「成員」區塊點選 + 選擇成員,再選擇管理身份,然後點選「審查+指派」。
應用程式設定
新增 EventGrid__topicEndpoint 一個應用程式設定,該值作為事件網格主題端點。
你可以使用以下指令: az functionapp config appsettings set --name <function app name> --resource-group <resource group name> --settings EventGrid__topicEndpoint="<topic endpoint>"
使用者指派的身分識別
要設定使用者指派的管理身份,請依照以下指示進行:
設定
建立使用者指派的受控身分識別。
在 Azure 入口網站的全域搜尋欄中搜尋 「受管理身份 」。
建立使用者指派的管理身份(UAMI),並選擇 檢視 + 建立。
將 UAMI 附加至功能應用程式資源
到函式應用程式的 身份(Identity )區塊,點選 新增 +。
選擇上方建立的 UAMI,然後點擊 新增。
將 UAMI 附加到事件網格主題資源上。
前往事件網格主題資源的 身份(Identity )區塊,選擇 「使用者指定 」標籤,然後點擊 「新增+」。 選擇使用者指派的管理身份,然後點 選新增。
建立一個事件網格訂閱並選擇端點。
在事件網格主題資源的 概覽 標籤中,選擇 + 事件訂閱,並建立事件訂閱。
根據您在端 點詳情中選擇的端點,您會看到一個「 交付管理身份 」區塊。 選擇「 使用者指派 」作為 管理身份 類型,並選擇 UAMI。
在事件網格主題資源中,將 事件網格資料發送 者角色指派給 UAMI。
前往 存取控制(IAM) 區塊,點擊 + 新增。
選擇 EventGrid 資料發送 者角色,點擊 「下一步」。
在「指派存取權」區塊選擇「管理身份」,在「成員」區塊點選 + 選擇成員,選擇 UAMI,然後點選「審查+指派」。
應用程式設定
- 新增
EventGrid__topicEndpoint一個應用程式設定,該值作為事件網格主題端點。 - 新增
EventGrid__credential一個 app 設定,值為managedidentity。 - 新增
EventGrid__clientId一個應用程式設定,裡面有使用者指派的管理身份客戶端 ID 值。
建立能監聽事件的函式
利用 Azure 入口網站,建立另一個函式應用程式來監聽由你的 Durable Functions 應用程式發佈的事件。 最好將它放在與事件網格主題相同的區域。
建立事件格觸發函式
在你的函式應用程式中,選擇 函數,然後選擇 + 新增
搜尋 事件網格,然後選擇 Azure 事件網格觸發 範本。
命名新觸發器,然後選擇 建立函式。
會建立一個包含以下程式碼的函式:
#r "Newtonsoft.Json" using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Microsoft.Extensions.Logging; public static void Run(JObject eventGridEvent, ILogger log) { log.LogInformation(eventGridEvent.ToString(Formatting.Indented)); }
新增事件網格訂閱
你現在可以為你所建立的事件網格主題新增一個活動網格訂閱。 欲了解更多資訊,請參閱 Azure 事件網格中的概念。
在你的新函式中,選擇整合,然後選擇事件網格觸發器(eventGridEvent)。
選擇 建立事件網格描述。
請為你的活動訂閱名稱,並選擇 活動網格主題 類型。
選取訂用帳戶。 然後,選擇你為事件網格主題建立的資源群組和資源。
選取 ,創建。
現在你準備好接收生命週期事件了。
執行 Durable Functions 應用程式來傳送事件
在您之前設定的 Durable Functions 專案中,開始在您的本地機器上除錯並啟動編排。 該應用程式會將耐用函數生命週期事件發佈到 Event Grid。 透過 Azure 入口網站的日誌確認事件網格是否觸發你建立的監聽器函式。
2019-04-20T09:28:21.041 [Info] Function started (Id=3301c3ef-625f-40ce-ad4c-9ba2916b162d)
2019-04-20T09:28:21.104 [Info] {
"id": "054fe385-c017-4ce3-b38a-052ac970c39d",
"subject": "durable/orchestrator/Running",
"data": {
"hubName": "DurableFunctionsHub",
"functionName": "Sample",
"instanceId": "055d045b1c8a415b94f7671d8df693a6",
"reason": "",
"runtimeStatus": "Running"
},
"eventType": "orchestratorEvent",
"eventTime": "2019-04-20T09:28:19.6492068Z",
"dataVersion": "1.0",
"metadataVersion": "1",
"topic": "/subscriptions/<your_subscription_id>/resourceGroups/eventResourceGroup/providers/Microsoft.EventGrid/topics/durableTopic"
}
2019-04-20T09:28:21.104 [Info] Function completed (Success, Id=3301c3ef-625f-40ce-ad4c-9ba2916b162d, Duration=65ms)
2019-04-20T09:28:37.098 [Info] Function started (Id=36fadea5-198b-4345-bb8e-2837febb89a2)
2019-04-20T09:28:37.098 [Info] {
"id": "8cf17246-fa9c-4dad-b32a-5a868104f17b",
"subject": "durable/orchestrator/Completed",
"data": {
"hubName": "DurableFunctionsHub",
"functionName": "Sample",
"instanceId": "055d045b1c8a415b94f7671d8df693a6",
"reason": "",
"runtimeStatus": "Completed"
},
"eventType": "orchestratorEvent",
"eventTime": "2019-04-20T09:28:36.5061317Z",
"dataVersion": "1.0",
"metadataVersion": "1",
"topic": "/subscriptions/<your_subscription_id>/resourceGroups/eventResourceGroup/providers/Microsoft.EventGrid/topics/durableTopic"
}
2019-04-20T09:28:37.098 [Info] Function completed (Success, Id=36fadea5-198b-4345-bb8e-2837febb89a2, Duration=0ms)
事件結構描述
以下列表說明生命週期事件架構:
-
id事件網格事件的唯一識別碼。 -
subject:前往事件主題的路徑。durable/orchestrator/{orchestrationRuntimeStatus}。{orchestrationRuntimeStatus}將為Running、Completed、Failed、Terminated。 -
data:耐用功能 特定參數。-
hubName: TaskHub 名稱。 -
functionName: 編排器函式名稱。 -
instanceId: Durable Functions 實例 ID。 -
reason:與追蹤事件相關的額外資料。 如需更多資訊,請參閱 耐用函式診斷(Azure Functions) -
runtimeStatus: 編排運行狀態。 正在運行,已完成,失敗,取消。
-
-
eventType:「orchestratorEvent」 -
eventTime: 事件時間(UTC)。 -
dataVersion:生命週期事件結構的版本。 -
metadataVersion:元資料版本。 -
topic: 事件網格主題資源。
如何在本地測試
要在本地測試,請閱讀 「用瀏覽器網頁應用程式進行本地測試」。