分享方式:


教學課程:使用 Azure Functions 和 Blob 儲存體來上傳和分析檔案

在本教學課程中,您將了解如何使用 Azure Functions 和電腦視覺,將影像上傳至 Azure Blob 儲存體並進行處理。 您也將了解如何在此程序中實作 Azure 函式觸發程序和繫結。 這些服務會一起分析包含文字的上傳影像、擷取其中的文字,然後將文字儲存在資料庫資料列中,以供稍後進行分析或其他用途。

Azure Blob 儲存體是 Microsoft 針對雲端所推出的可大幅調整物件儲存體解決方案。 Blob 儲存體專門設計來儲存影像和文件、串流媒體檔案、管理備份和封存資料等等。 您可以在概觀頁面上深入了解 Blob 儲存體。

Azure Functions 是無伺服器的電腦解決方案,可讓您將小型程式碼區塊撰寫為可高度調整、無伺服器、事件驅動的函式並加以執行。 您可以在概觀頁面上深入了解 Azure Functions。

在本教學課程中,您將了解如何:

  • 將影像和檔案上傳至 Blob 儲存體
  • 使用 Azure 函式事件觸發程序來處理上傳至 Blob 儲存體的資料
  • 使用 Azure AI 服務來分析影像
  • 使用 Azure 函式輸出繫結將資料寫入到資料表儲存體

必要條件

建立儲存體帳戶和容器

第一個步驟是建立儲存體帳戶來保存上傳的 Blob 資料,在此案例中為包含文字的影像。 儲存體帳戶會提供數個不同的服務,但本教學課程會利用 Blob 儲存體和資料表儲存體。

登入 Azure 入口網站

  1. 在入口網站頂端的搜尋列中,搜尋儲存體,然後選取標示為儲存體帳戶的結果。

  2. 在 [儲存體帳戶] 頁面上,選取左上方的 [+ 建立]

  3. 在 [建立儲存體帳戶] 頁面上,輸入下列值:

    • 訂用帳戶:選擇您想要的訂用帳戶。
    • 資源群組:選取 [新建],並輸入 msdocs-storage-function 的名稱,然後選擇 [確定]
    • 儲存體帳戶名稱:輸入 msdocsstoragefunction 的值。 儲存體帳戶名稱在 Azure 中必須是唯一的,因此您可能需要在名稱之後加上數字,例如 msdocsstoragefunction123
    • 區域:選取與您最接近的區域。
    • 效能:選擇 [標準]
    • 備援:讓預設值保持選取狀態。

    顯示如何在 Azure 中建立記憶體帳戶的螢幕快照。

  4. 選取底部的 [檢閱 + 建立],Azure 便會驗證您輸入的資訊。 驗證過設定後,選擇 [建立],Azure 便會開始佈建儲存體帳戶,這可能需要一些時間。

建立容器

  1. 佈建好儲存體帳戶之後,請選取 [移至資源]。 下一個步驟是在帳戶內建立儲存體容器,以保存上傳的影像以供分析。

  2. 在瀏覽面板上,選擇 [容器]

  3. 在 [容器] 頁面上,選取頂端的 [+ 容器]。 在滑出面板中,輸入 imageanalysis 作為 [名稱],並確定 [公用存取層級] 設定為 [Blob (僅限 Blob 的匿名讀取存取)]。 然後選取建立

    顯示建立新儲存體容器方式的螢幕擷取畫面。

您應該會看到您的新容器出現在容器清單中。

擷取連接字串

最後一個步驟是擷取儲存體帳戶的連接字串。

  1. 在左側瀏覽面板上,選取 [存取金鑰]

  2. 在 [存取金鑰] 頁面上,選取 [顯示金鑰]。 複製 [key1] 區段底下的 [連接字串] 值,然後將此值貼到某處以供稍後使用。 您也可以記下儲存體帳戶名稱 msdocsstoragefunction 以供稍後使用。

    顯示如何存取記憶體容器的螢幕快照。

當我們需要將 Azure 函式連線到此儲存體帳戶時,就需要這些值。

建立電腦視覺服務

接下來,建立電腦視覺服務帳戶,以處理上傳的檔案。 電腦視覺是 Azure AI 服務的一部分,並提供各種功能以從影像中擷取出資料。 您可以在概觀頁面上深入了解電腦視覺。

  1. 在入口網站頂端的搜尋列中,搜尋電腦,然後選取標示為電腦視覺的結果。

  2. 在 [電腦視覺] 頁面上,選取 [+ 建立]

  3. 在 [建立電腦視覺] 頁面上,輸入下列值:

    • 訂用帳戶:選擇您想要的訂用帳戶。
    • 資源群組:使用您稍早建立的 msdocs-storage-function 資源群組。
    • 區域:選取與您最接近的區域。
    • 名稱:輸入 msdocscomputervision 的名稱。
    • 定價層:如果可用,請選擇 [免費],否則請選擇 [標準 S1]
    • 如果您同意條款,請核取 [負責任 AI 注意事項] 方塊

    顯示如何建立新 電腦視覺 服務的螢幕快照。

  4. 選取底部的 [檢閱 + 建立]。 Azure 會花一點時間驗證您輸入的資訊。 驗證過設定後,選擇 [建立],Azure 便會開始佈建電腦視覺服務,這可能需要一些時間。

  5. 作業完成時,請選取 [移至資源]

擷取金鑰

接下來,我們需要尋找電腦視覺服務的秘密金鑰和端點 URL 以便在 Azure 函式應用程式中使用。

  1. 在 [電腦視覺] 概觀頁面上,選取 [金鑰和端點]

  2. 在 [金鑰和端點] 頁面上,複製 [金鑰 1] 值和 [端點] 值,並將其貼到某處以供稍後使用。

    顯示如何擷取 電腦視覺 服務的金鑰和 URL 端點的螢幕快照。

下載並設定範例專案

本教學課程中使用的 Azure 函式程式碼可在此 GitHub 存放庫中找到。 您也可以使用下列命令來複製專案。

git clone https://github.com/Azure-Samples/msdocs-storage-bind-function-service.git \
cd msdocs-storage-bind-function-service/dotnet

範例專案程式碼會完成下列工作:

  • 擷取環境變數以連線到儲存體帳戶和電腦視覺服務
  • 接受上傳的檔案以作為 Blob 參數
  • 使用電腦視覺服務來分析 Blob
  • 使用輸出繫結將分析出的影像文字傳送到新的資料表資料列

下載並開啟專案之後,主要的 Run 方法中會有一些需要了解的基本概念,如下所示。 Azure 函式會利用觸發程序和輸出繫結,這些項目會使用方法套用到 Run 方法簽章上。

Table 屬性會使用兩個參數。 第一個參數會指定資料表的名稱,以寫入函式所傳回的剖析影像文字值。 第二個 Connection 參數會從環境變數提取資料表儲存體連接字串,以便 Azure 函式能夠擁有其存取權。

BlobTrigger 屬性可用來將函式繫結至 Blob 儲存體中的上傳事件,並將該上傳的 Blob 提供給 Run 函式。 Blob 觸發程序自己有兩個參數 - 一個參數用於要監視上傳的 Blob 容器名稱,另一個參數再次用於儲存體帳戶的連接字串。

// Azure Function name and output Binding to Table Storage
[FunctionName("ProcessImageUpload")]
[return: Table("ImageText", Connection = "StorageConnection")]
// Trigger binding runs when an image is uploaded to the blob container below
public async Task<ImageContent> Run([BlobTrigger("imageanalysis/{name}", 
        Connection = "StorageConnection")]Stream myBlob, string name, ILogger log)
{
    // Get connection configurations
    string subscriptionKey = Environment.GetEnvironmentVariable("ComputerVisionKey");
    string endpoint = Environment.GetEnvironmentVariable("ComputerVisionEndpoint");
    string imgUrl = $"https://{ Environment.GetEnvironmentVariable("StorageAccountName")}
                        .blob.core.windows.net/imageanalysis/{name}";

    ComputerVisionClient client = new ComputerVisionClient(
        new ApiKeyServiceClientCredentials(subscriptionKey)) { Endpoint = endpoint };

    // Get the analyzed image contents
    var textContext = await AnalyzeImageContent(client, imgUrl);

    return new ImageContent { 
        PartitionKey = "Images",
        RowKey = Guid.NewGuid().ToString(), Text = textContext 
    };
}

public class ImageContent
{
    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
    public string Text { get; set; }
}

此程式碼也會從環境變數擷取基本設定值,例如儲存體帳戶連接字串和電腦視覺金鑰。 我們會在部署 Azure 函式環境之後,將這些環境變數新增至這個 Azure 函式環境。

ProcessImage 函式也會利用名為 AnalyzeImage 的第二個方法,如下所示。 此程式碼會使用電腦視覺帳戶的 URL 端點和金鑰,向該伺服器提出處理影像的要求。 此要求會傳回在影像中探索到的所有文字,然後使用 Run 方法上的輸出繫結,將這些文字寫入到資料表儲存體。

static async Task<string> ReadFileUrl(ComputerVisionClient client, string urlFile)
{
    // Analyze the file using Computer Vision Client
    var textHeaders = await client.ReadAsync(urlFile);
    string operationLocation = textHeaders.OperationLocation;
    Thread.Sleep(2000);
    
    // Complete code omitted for brevity, view in sample project
    
    return text.ToString();
}

在本機執行

如果您想要在本機執行專案,可以使用 local.settings.json 檔案來填入環境變數。 在此檔案內,以您稍早在建立 Azure 資源時所儲存的值來填入到預留位置值。

雖然 Azure 函式程式碼會在本機執行,但其仍會連線到 Azure 上的即時服務,而不會使用任何本機模擬器。

{
    "IsEncrypted": false,
    "Values": {
      "AzureWebJobsStorage": "UseDevelopmentStorage=true",
      "FUNCTIONS_WORKER_RUNTIME": "dotnet",
      "StorageConnection": "your-storage-account-connection-string",
      "StorageAccountName": "your-storage-account-name",
      "ComputerVisionKey": "your-computer-vision-key",
      "ComputerVisionEndPoint":  "your-computer-vision-endpoint"
    }
}

將程式碼部署到 Azure Functions

您現在已準備好使用 Visual Studio 將應用程式部署到 Azure。 您也可以在部署程序進行的同時,於 Azure 中建立 Azure Functions 應用程式。

  1. 若要開始,請以滑鼠右鍵按一下 [ProcessImage] 專案節點,然後選取 [發佈]

  2. 在 [發佈] 對話方塊畫面上,選取 [Azure],然後選擇 [下一步]

    顯示如何選取 Azure 作為部署目標的螢幕快照。

  3. 在下一個畫面上選取 [Azure 函式應用程式 (Windows)] 或 [Azure 函式應用程式 (Linux)],然後再次選擇 [下一步]

    顯示如何選擇 Azure Functions 作為特定部署目標的螢幕快照。

  4. 在 [函式執行個體] 步驟中,請務必選擇您想要作為部署目的地的訂用帳戶。 接下來,選取對話方塊右側的綠色 + 符號。

  5. 隨即會開啟新的對話方塊。 為新的函式應用程式輸入下列值。

    • 名稱:輸入 msdocsprocessimage 或類似名稱。
    • 訂用帳戶名稱:選擇您想要使用的任意訂用帳戶。
    • 資源群組:選擇您稍早建立的 msdocs-storage-function 資源群組。
    • 方案類型:選取 [使用量]
    • 位置:選擇最接近您所在地的區域。
    • Azure 儲存體:選取您稍早建立的儲存體帳戶。

    顯示如何在 Azure 中建立新函式應用程式的螢幕快照。

  6. 填入所有這些值之後,請選取 [建立]。 Visual Studio 和 Azure 將會開始佈建所要求的資源,這需要一些時間才能完成。

  7. 此程序完成後,請選取 [完成] 以關閉對話方塊工作流程。

  8. 部署 Azure 函式的最後一個步驟是選取畫面右上方的 [發佈]。 發佈函式可能需要一些時間才能完成。 完成後,您的應用程式便會在 Azure 上執行。

連接服務

Azure 函式已成功完成部署,但還無法連線到我們的儲存體帳戶和電腦視覺服務。 您必須先將正確的金鑰和連接字串新增至 Azure Functions 應用程式的組態設定。

  1. 在 Azure 入口網站頂端搜尋函式,並從結果中選取 [函式應用程式]

  2. 在 [函式應用程式] 畫面上,選取您在 Visual Studio 中建立的函式應用程式。

  3. 在 [函式應用程式] 概觀頁面上,選取左側導覽上的 [設定]。 這會開啟一個頁面,讓我們可以管理應用程式的各類組態設定。 目前,我們有興趣了解 [應用程式設定] 區段。

  4. 下一個步驟是為儲存體帳戶名稱和連接字串、電腦視覺秘密金鑰和電腦視覺端點新增設定。

  5. 在 [應用程式設定] 索引標籤上,選取 [+ 新增應用程式設定]。 在出現的飛出視窗中,輸入下列值:

    • 名稱:輸入 ComputerVisionKey 的值。
    • :貼上您稍早儲存的電腦視覺金鑰。
  6. 按一下 [確定] 將此設定新增至您的應用程式。

    顯示如何將新應用程式設定新增至 Azure 函式的螢幕快照。

  7. 接下來,讓我們使用下列值,針對電腦視覺服務的端點重複此程序:

    • 名稱:輸入 ComputerVisionEndpoint 的值。
    • :貼上您稍早儲存的端點 URL。
  8. 使用下列值,再次為儲存體帳戶連線重複此步驟:

    • 名稱:輸入 StorageConnection 的值。
    • :貼上您稍早儲存的連接字串。
  9. 最後,使用下列值,再為儲存體帳戶名稱重複此程序一次:

    • 名稱:輸入 StorageAccountName 的值。
    • :輸入所建立儲存體帳戶的名稱。
  10. 在新增完這些應用程式設定之後,請務必選取設定頁面頂端的 [儲存]。 儲存程序完成時,您也可以按一下 [重新整理],確定系統已取得這些設定。

要將 Azure 函式連線到不同服務所需的所有環境變數目前均已備妥。

將影像上傳至 Blob 儲存體

您現在已做好準備,可以開始測試我們的應用程式了! 您可以將 Blob 上傳至容器,然後確認影像中的文字已儲存至資料表儲存體。

  1. 首先,在 Azure 入口網站頂端搜尋儲存體,然後選取 [儲存體帳戶]。 在 [儲存體帳戶] 頁面上,選取您稍早建立的帳戶。

  2. 接下來,選取左側導覽上的 [容器],然後瀏覽至您稍早建立的 [ImageAnalysis] 容器。 您可以從這裡直接在瀏覽器內上傳測試影像。

    顯示如何瀏覽至記憶體容器的螢幕快照。

  3. 您可以在可下載範例專案的根目錄中,找到一些包含在 images 資料夾內的範例影像,或者您也可以使用自己的影像。

  4. 在 [ImageAnalysis] 頁面頂端,選取 [上傳]。 在開啟的飛出視窗中,選取右側的資料夾圖示以開啟檔案瀏覽器。 選擇您想要上傳的影像,然後選取 [上傳]

    顯示如何將 Blob 上傳至記憶體容器的螢幕快照。

  5. 檔案應該會出現在 Blob 容器內。 接下來,您可以確認上傳是否觸發了 Azure 函式,而且影像中的文字已正確分析並儲存至資料表儲存體。

  6. 使用頁面頂端的階層連結,瀏覽到儲存體帳戶中的上一層。 找出並選取左側導覽上的 [儲存體瀏覽器],然後選取 [資料表]

  7. ImageText 資料表現在應該可供使用。 按一下資料表以預覽其中的資料列。 您應該會看到上傳的已處理影像文字項目。 您可以使用時間戳記來進行確認,也可以檢視 [文字] 資料行的內容來進行確認。

    顯示 Azure 表格記憶體中文字項目的螢幕快照。

恭喜! 您已成功使用 Azure Functions 和電腦視覺處理上傳至 Blob 儲存體的影像。

清除資源

如果您不打算繼續使用此應用程式,則可以移除資源群組來刪除所建立的資源。

  1. 從主導覽畫面選取 [資源群組]
  2. 從清單中選取 msdocs-storage-function 資源群組。
  3. 選取資源群組概觀頁面頂端的 [刪除資源群組] 按鈕。
  4. 在確認對話方塊中輸入資源群組名稱 msdocs-storage-function
  5. 選取刪除。 刪除資源群組的流程可能需要幾分鐘的時間才能完成。