執行 Azure 函式以回應 Blob 解除凍結事件

若要讀取封存層中的 Blob,您必須先將 Blob 解除凍結到經常性存取層或非經常性存取層。 解除凍結程式可能需要數小時才能完成。 您可以設定 Azure 事件方格 ,在 blob 解除凍結作業完成時引發事件,並在您的應用程式中處理此事件,而不會重複輪詢解除凍結作業的狀態。

當事件發生時,事件方格會透過端點將事件傳送至事件處理常式。 許多 Azure 服務都可作為事件處理常式,包括 Azure Functions。 Azure 函式是可在回應事件時執行的程式碼區塊。 此操作說明將逐步引導您完成開發 Azure 函式的程式,然後設定事件方格來執行該函式,以回應解除凍結 blob 時所發生的事件。

本文說明如何從 Visual Studio 使用 .NET 建立及測試 Azure 函數。 您可以從各種不同的本機開發環境,以及使用各種不同的程式設計語言來建立 Azure Functions。 如需 Azure Functions 支援語言的詳細資訊,請參閱 Azure Functions 中支援的語言。 如需 Azure Functions 之開發選項的詳細資訊,請參閱本機的程式 代碼和測試 Azure Functions

如需有關從封存層解除凍結 Blob 的詳細資訊,請參閱將 Blob 從封存層解除凍結的概觀 (部分機器翻譯)。

必要條件

本文說明如何使用 Visual Studio 2019 或更新版本,以 .NET 開發 Azure 函式。 您可以免費安裝 Visual Studio Community。 請確定您已設定使用 .net 進行 Azure 開發的 Visual Studio

若要在本機上對 Azure 函式進行錯錯,您將需要使用可傳送 HTTP 要求的工具,例如 Postman。

需要有效的 Azure 訂用帳戶。 如果您沒有帳戶,請在開始前建立免費帳戶

建立 Azure 函數應用程式

函數應用程式是一種 Azure 資源,可作為您 Azure Functions 的容器。 您可以使用新的或現有的函式應用程式來完成本文所述的步驟。

請遵循下列步驟來在 Azure 入口網站中建立函數應用程式:

  1. 在 Azure 入口網站中,搜尋函數應用程式。 選取函式 應用程式 圖示,以流覽至您訂用帳戶中的函式應用程式清單。

  2. 選取 [建立] 按鈕以建立新的函數應用程式。

  3. 在 [ 基本 ] 索引標籤上,指定資源群組,並為新的函數應用程式提供唯一的名稱。

  4. 請確定 [ 發行 ] 選項設定為 [程式 代碼]。

  5. 從 [ 執行時間堆疊 ] 下拉式清單中,選取 [ .net]。 [ 版本 ] 欄位會自動填入,以使用最新版本的 .net core。

  6. 選取新函數應用程式的區域。

    Screenshot showing how to create a new function app in Azure - Basics tab

  7. 當您完成 [ 基本 ] 索引標籤之後,請流覽至 [ 主機 ] 索引標籤。

  8. 在 [ 主機 ] 索引標籤上,選取將儲存 Azure 函數的儲存體帳戶。 您可以選擇現有儲存體帳戶或建立新的帳戶。

  9. 請確定 [作業系統] 欄位設定為 [ Windows]。

  10. 方案類型欄位中,選取 (無伺服器) 耗用量。 如需此計畫的詳細資訊,請參閱 Azure Functions 耗用量方案裝載

    Screenshot showing how to create a new function app in Azure - Hosting tab

  11. 選取 [ 審核 + 建立 ] 以建立新的函數應用程式。

若要深入瞭解如何設定函數應用程式,請參閱 Azure Functions 檔中的 管理函數應用程式

建立 Azure 函數作為事件方格觸發程式

接下來,建立將在特定儲存體帳戶中解除凍結 blob 時執行的 Azure 函式。 依照下列步驟,使用 C# 和 .net Core 在 Visual Studio 中建立 Azure 函式:

  1. 啟動 Visual Studio 2019,並建立 Azure Functions 專案。 如需詳細資料,請遵循建立函數應用程式專案中所述的指示。

  2. 在 [ 建立新的 Azure Functions 應用程式 ] 步驟中,選取下列值:

    • 根據預設,Azure Functions 執行時間會設定為 Azure Functions v3 (.Net Core) 。 Microsoft 建議使用這個版本的 Azure Functions 執行時間。
    • 從可能觸發程式的清單中,選取 [ 事件方格觸發程式]。 如需事件方格觸發程式為何是建議的觸發程式類型,以使用 Azure 函式來處理 Blob 儲存體事件的詳細資訊,請參閱使用函式做為事件方格事件的事件處理常式
    • 儲存體帳戶設定會指出 Azure 函數的儲存位置。 您可以選取現有的儲存體帳戶或建立一個新的。
  3. 選取 [建立],在 Visual Studio 中建立新專案。

  4. 接下來,重新命名類別和 Azure 函式,如 重新命名函數中所述。 選擇適合您案例的名稱。

  5. 在 Visual Studio 中,選取工具 | NuGet 封裝管理員 | 封裝管理員主控台,然後從主控台安裝下列套件:

    Install-Package Azure.Storage.Blobs
    Install-Package Microsoft.ApplicationInsights.WorkerService
    Install-Package Microsoft.Azure.WebJobs.Logging.ApplicationInsights
    
  6. 在 Azure 函數的類別檔案中,貼上下列 using 語句:

    using System;
    using System.IO;
    using System.Text;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.EventGrid.Models;
    using Microsoft.Azure.WebJobs.Extensions.EventGrid;
    using Microsoft.Extensions.Logging;
    using Azure;
    using Azure.Storage.Blobs;
    using Azure.Storage.Blobs.Models;
    
  7. 在類別檔案中找出 Run 方法。 這是發生事件時所執行的方法。 將下列程式碼貼入 Run 方法的主體中。 請記得以您自己的值取代角括號中的預留位置值:

    // When either Microsoft.Storage.BlobCreated or Microsoft.Storage.BlobTierChanged
    // event occurs, write the event details to a log blob in the same container
    // as the event subject (the blob for which the event occurred).
    
    // Create a unique name for the log blob.
    string logBlobName = string.Format("function-log-{0}.txt", DateTime.UtcNow.Ticks);
    
    // Populate connection string with your Shared Key credentials.
    const string ConnectionString = "DefaultEndpointsProtocol=https;AccountName=<account-name>;AccountKey=<account-key>;EndpointSuffix=core.windows.net";
    
    // Get data from the event.
    dynamic data = eventGridEvent.Data;
    string eventBlobUrl = Convert.ToString(data.url);
    string eventApi = Convert.ToString(data.api);
    
    // Build string containing log information.
    StringBuilder eventInfo = new StringBuilder();
    eventInfo.AppendLine(string.Format("{0} operation occurred.", eventApi));
    eventInfo.AppendLine(string.Format("Blob URL: {0}", eventBlobUrl));
    eventInfo.AppendLine($@"Additional event details:
        Id=[{eventGridEvent.Id}]
        EventType=[{eventGridEvent.EventType}]
        EventTime=[{eventGridEvent.EventTime}]
        Subject=[{eventGridEvent.Subject}]
        Topic=[{eventGridEvent.Topic}]");
    
    // If event was BlobCreated and API call was CopyBlob, respond to the event.
    bool copyBlobEventOccurred = (eventGridEvent.EventType == "Microsoft.Storage.BlobCreated") &&
                                 (eventApi == "CopyBlob");
    
    // If event was BlobTierChanged and API call was SetBlobTier, respond to the event.
    bool setTierEventOccurred = (eventGridEvent.EventType == "Microsoft.Storage.BlobTierChanged") &&
                                (eventApi == "SetBlobTier");
    
    // If one of these two events occurred, write event info to a log blob.
    if (copyBlobEventOccurred | setTierEventOccurred)
    {
        // Create log blob in same account and container.
        BlobUriBuilder logBlobUriBuilder = new BlobUriBuilder(new Uri(eventBlobUrl))
        {
            BlobName = logBlobName
        };
    
        BlobClient logBlobClient = new BlobClient(ConnectionString,
                                                  logBlobUriBuilder.BlobContainerName,
                                                  logBlobName);
    
        byte[] byteArray = Encoding.ASCII.GetBytes(eventInfo.ToString());
    
        try
        {
            // Write the log info to the blob.
            // Overwrite if the blob already exists.
            using (MemoryStream memoryStream = new MemoryStream(byteArray))
            {
                BlobContentInfo blobContentInfo =
                    logBlobClient.Upload(memoryStream, overwrite: true);
            }
        }
        catch (RequestFailedException e)
        {
            Console.WriteLine(e.Message);
            throw;
        }
    }
    

如需開發 Azure Functions 的詳細資訊,請參閱 開發 Azure Functions 的指引

若要深入瞭解將 Blob 儲存體事件發佈至事件處理常式時所包含的資訊,請參閱Azure Blob 儲存體作為事件方格來源

在本機的偵錯工具中執行 Azure 函數

若要在本機測試您的 Azure 函式程式碼,您需要手動傳送可觸發事件的 HTTP 要求。 您可以使用 Postman 之類的工具張貼要求。

在 Azure 函式的類別檔案頂端,您可以使用 URL 端點,在本機環境中進行測試。 使用這個 URL 張貼要求會觸發本機環境中的事件,讓您可以對程式碼進行偵錯工具。 URL 會使用下列格式:

http://localhost:7071/runtime/webhooks/EventGrid?functionName={functionname}

您傳送至此端點的要求是模擬要求。 它不會從您的 Azure 儲存體帳戶傳送或接收資料。

請遵循下列步驟來建立要求,並將其傳送到此端點。 此範例說明如何使用 Postman 傳送要求。

  1. 在 Postman 中,建立新的要求。

  2. 將上面顯示的 URL 貼到要求 URL 的欄位中,並將您的函式名稱取代為 {functionname} ,並移除大括弧。 確定已將 [要求] 動詞設定為 [取得]。

    Screenshot showing how to specify local URL for event trigger in Postman

  3. 新增 [Content-type] 標頭並將它設定為 application/json

  4. 新增 aeg-event-type 標頭,並將其設定為 [ 通知]。

    Screenshot showing header configuration for local request to trigger event

  5. 在 Postman 中,指定要求本文,並將主體類型設定為 JSON ,並將格式設定為 raw。 下列範例會模擬 複製 Blob 要求。 請記得以您自己的值取代角括號中的預留位置值。 請注意,您不需要變更日期/時間或識別碼值,因為這是模擬的要求:

    [{
      "topic": "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>",
      "subject": "/blobServices/default/containers/<container-name>/blobs/<blob-name>",
      "eventType": "Microsoft.Storage.BlobCreated",
      "id": "2bfb587b-501e-0094-2746-8b2884065d32",
      "data": {
        "api": "CopyBlob",
        "clientRequestId": "3d4dedc7-6c27-4816-9405-fdbfa806b00c",
        "requestId": "2bfb587b-501e-0094-2746-8b2884000000",
        "eTag": "0x8D9595DCA505BDF",
        "contentType": "text/plain",
        "contentLength": 48,
        "blobType": "BlockBlob",
        "url": "https://<storage-account>.blob.core.windows.net/<container-name>/<blob-name>",
        "sequencer": "0000000000000000000000000000201B00000000004092a5",
        "storageDiagnostics": {
          "batchId": "8a92736a-6006-0026-0046-8bd7f5000000"
        }
      },
      "dataVersion": "",
      "metadataVersion": "1",
      "eventTime": "2021-08-07T04:42:41.0730463Z"
    }]
    
  6. 在 Visual Studio 中,將任何想要的中斷點放在您的程式碼中,然後按F5執行偵錯工具。

  7. 在 Postman 中,選取 [ 傳送 ] 按鈕以將要求傳送至端點。

當您傳送要求時,事件方格會呼叫您的 Azure 函式,而且您可以正常地進行調試。 如需詳細資訊和範例,請參閱 Azure Functions 文件中的 手動 post 要求

系統會模擬觸發事件的要求,但在事件引發時執行的 Azure 函式會將記錄資訊寫入至儲存體帳戶中的新 Blob。 您可以驗證 Blob 的內容,並在 Azure 入口網站中查看上次修改的時間,如下圖所示:

Screenshot showing the contents of the log blob in the Azure portal

發佈 Azure Function

在本機測試 Azure 函式之後,下一個步驟是將 Azure 函式發佈至您先前建立的 Azure 函數應用程式。 必須發佈函式,您才能設定事件方格,將儲存體帳戶上發生的事件傳送至函式端點。

請遵循下列步驟來發佈您的函式。

  1. 在方案總管中,選取並按住 (或以滑鼠右鍵按一下 Azure Functions 專案) ,然後選擇 [ 發行]。

  2. 在 [ 發佈 ] 視窗中,選取 [ Azure ] 作為目標,然後選擇 [下一步]

  3. 選取 [ Azure 函數應用程式] (Windows) 作為特定目標,然後選擇[下一步]

  4. 在 [ 函數實例 ] 索引標籤上,從下拉式功能表中選取您的訂用帳戶,然後在可用的函式應用程式清單中找出您的 Azure 函數應用程式。

  5. 確認已選取 [ 從封裝檔案執行 ] 核取方塊。

  6. 選取 [完成] 以準備發佈函數。

  7. 在 [ 發佈 ] 頁面上,確認設定是否正確。 如果您看到一則警告,指出未設定 Application Insights 的服務相依性,您可以從這個頁面進行設定。

  8. 選取 [ 發佈 ] 按鈕,開始將 azure 函式發佈至您先前建立的 Azure 函數應用程式。

    Screenshot showing page to publish Azure Function from Visual Studio

每當您對 Azure 函式中的程式碼進行變更時,都必須將更新的函式發佈至 Azure。

從儲存體帳戶訂閱 blob 解除凍結事件

您現在有一個函式應用程式,其中包含可在回應事件時執行的 Azure 函數。 下一步是從您的儲存體帳戶建立事件訂用帳戶。 事件訂用帳戶會設定儲存體帳戶,以透過事件方格發佈事件,以回應儲存體帳戶中的 blob 上的作業。 然後,事件方格會將事件傳送至您所指定的事件處理常式端點。 在此案例中,事件處理常式是您在上一節中建立的 Azure 函數。

當您建立事件訂閱時,可以篩選要傳送至事件處理常式的事件。 從封存層解除凍結 Blob 時要捕捉的事件是Microsoft.Storage.BlobTierChanged,對應至設定 Blob 層作業,以及Microsoft.Storage.BlobCreated事件,對應至複製 Blob作業。 視您的案例而定,您可能只想要處理其中一個事件。

若要建立事件訂用帳戶,請遵循下列步驟:

  1. 在 Azure 入口網站中,瀏覽至包含要從封存層解除凍結之 Blob 的儲存體帳戶。

  2. 選取左側流覽窗格中的 [ 事件 ] 設定。

  3. 在 [ 事件 ] 頁面上,選取 [ 更多選項]。

  4. 選取 [建立事件訂用帳戶]

  5. 在 [ 建立事件訂閱 ] 頁面的 [ 事件訂閱詳細資料 ] 區段中,提供事件訂閱的名稱。

  6. 在 [ 主題詳細資料 ] 區段中,提供系統主題的名稱。 系統主題代表 Azure 儲存體所發佈的一或多個事件。 如需有關系統主題的詳細資訊,請參閱 Azure 事件方格中的系統主題

  7. 在 [ 事件種類 ] 區段中,選取已 建立的 Blobblob 層變更 的事件。 取決於您選擇從封存層解除凍結 Blob 的方式,這兩個事件其中之一將會引發。

    Screenshot showing how to select event types for blob rehydration events in the Azure portal

  8. 在 [ 端點詳細資料 ] 區段中,從下拉式功能表中選取 [ Azure Function ]。

  9. 選擇 [ 選取端點 ],以指定您在上一節中建立的函式。 在 [ 選取 azure 函式] 對話方塊中,為您的 Azure 函式選擇訂用帳戶、資源群組和函數應用程式。 最後,從下拉式清單中選取函數名稱,然後選擇 [ 確認選取專案]。

    Screenshot showing how to select an Azure Function as the endpoint for an Event Grid subscription

  10. 選取 [ 建立 ] 按鈕以建立事件訂用帳戶,並開始將事件傳送至 Azure Function 事件處理常式。

若要深入瞭解事件訂閱,請參閱 Azure 事件方格概念

測試 Azure 函數事件處理常式

若要測試 Azure 函式,您可以在儲存體帳戶中觸發包含事件訂用帳戶的事件。 您先前建立的事件訂用帳戶會篩選儲存體的兩個事件。BlobCreatedMicrosoft. 儲存體。BlobTierChanged。 當其中一個事件引發時,就會觸發您的 Azure 函式。

本文所顯示的 Azure 函式會在兩個案例中寫入記錄 blob:

  • 當事件為Microsoft 時儲存體。BlobCreated和 API 作業是複製 Blob
  • 當事件為 Microsoft.Storage.BlobTierChanged 和 API 作業是複製 Blob

若要瞭解如何藉由解除凍結 blob 來測試函式,請參閱下列兩個程式的其中一項:

解除凍結完成後,會將記錄 Blob 寫入與您所解除凍結之 Blob 相同的容器。 例如,在解除凍結具有複製作業的 Blob 之後,您可以在 Azure 入口網站中看到原始來源 Blob 保留在封存層中,完整解除凍結的目的地 Blob 會出現在目標線上層中,而 Azure 函式所建立的記錄 Blob 也會出現在清單中。

Screenshot showing the original blob in the archive tier, the rehydrated blob in the hot tier, and the log blob written by the event handler.

請記住,根據解除凍結優先權設定,解除凍結 blob 最多可能需要15小時的時間。 如果您將解除凍結優先權設為 High,解除凍結可能會在一小時內,針對大小小於 10 GB 的 blob 完成。 不過,高優先順序的解除凍結會產生較高的成本。 如需詳細資訊,請參閱將 Blob 從封存層解除凍結的概觀

提示

雖然此操作指南的目標是要在 Blob 解除凍結的內容中處理這些事件,但基於測試目的,觀察這些事件回應上傳 Blob 或變更線上 Blob 層 (例如,從經常性到非經常性) 也會有幫助,因為事件是立即引發的。

如需有關如何在事件方格中篩選事件的詳細資訊,請參閱 如何篩選 Azure 事件方格的事件

另請參閱