共用方式為


在 Azure 容器應用程式中裝載 Durable Functions 應用程式 (.NET 隔離式)

Azure Functions 提供整合式支援,可在 Azure Container Apps 上開發、部署及管理容器化函式應用程式。 當您需要與其他微服務、API、網站、工作流程或任何容器裝載程式相同的環境中執行時,請使用適用於 Functions 應用程式的 Azure Container Apps。 深入瞭解 如何在 Container Apps 中執行 Azure Functions

備註

雖然 Durable Functions 支援數個 記憶體提供者後端,但 Azure Container Apps 中裝載的自動調整應用程式僅適用於 Microsoft SQL (MSSQL) 後端。 如果使用另一個後端,您必須將最小復本計數設定為大於零。

在本文中,您將學會如何:

  • 從本機 Durable Functions 專案建立 Docker 映像。
  • 建立 Azure Container App 和相關資源。
  • 將映像部署至 Azure 容器應用程式並設定驗證。

先決條件

建立本機 Durable Functions 專案

在 Visual Studio Code 中, 建立設定為使用 MSSQL 後端的 .NET 隔離 Durable Functions 專案

在本機測試應用程式 ,並返回本文。

在專案根目錄中建立 Dockerfile ,描述在容器中執行函式應用程式所需的最低環境。

  1. 在專案根目錄中,建立名為 Dockerfile 的新檔案。

  2. 將下列內容複製/貼到 Dockerfile 中。

    FROM mcr.microsoft.com/dotnet/sdk:8.0 AS installer-env
    
    COPY . /src/dotnet-function-app
    RUN cd /src/dotnet-function-app && \
    mkdir -p /home/site/wwwroot && \
    dotnet publish *.csproj --output /home/site/wwwroot
    
    # To enable ssh & remote debugging on app service change the base image to the one below
    # FROM mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0-appservice
    FROM mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0
    ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
        AzureFunctionsJobHost__Logging__Console__IsEnabled=true
    
    COPY --from=installer-env ["/home/site/wwwroot", "/home/site/wwwroot"]
    
  3. 儲存檔案。

  4. 使用下列內容新增 .dockerignore 檔案:

    local.settings.json
    
  5. 儲存 .dockerignore 檔案。

建置容器映像

建置 Docker 映像。 在 Docker Hub 的 Microsoft Azure Functions Base 找到 Azure Functions 支援的完整基礎映像列表。

  1. 啟動 Docker 精靈。

  2. 使用 docker login 命令登入 Docker。

  3. 出現提示時,請使用您的使用者名稱和密碼登入。 「登入成功」訊息會確認您已登入。

  4. 流覽至您的專案根目錄。

  5. 執行下列命令來建置映像檔,將 <DOCKER_ID> 替換為您的 Docker Hub 帳戶 ID。

    dockerId=<DOCKER_ID>
    imageName=IMAGE_NAME>
    imageVersion=v1.0.0
    
    docker build --tag $dockerId/$imageName:$imageVersion .
    

    備註

    如果您是在 M 系列 Mac 上執行,請改用 --platform linux/amd64

  6. 將映射推送至 Docker:

    docker push $dockerId/$imageName:$imageVersion
    

    視網路速度而定,初始映射推送可能需要幾分鐘的時間。 在等候時,請繼續進行下一節。

建立 Azure 資源

在容器應用程式上建立執行 Durable Functions 所需的 Azure 資源。

  • Azure 資源群組: 包含所有已建立資源的資源群組。
  • Azure Container App 環境: 裝載容器應用程式的環境。
  • Azure 容器應用程式:包含 Durable Functions 應用程式的映像會部署到此應用程式。
  • Azure 儲存體帳戶: 函式應用需要此帳戶來儲存應用相關資料,如應用程式程式碼。

初始設定

  1. 在新終端機中,登入您的 Azure 訂用帳戶:

    az login  
    
    az account set -s <subscription_name>
    
  2. 執行必要的命令來設定 Azure Container Apps CLI 擴充功能:

    az upgrade
    
    az extension add --name containerapp --upgrade
    
    az provider register --namespace Microsoft.App
    
    az provider register --namespace Microsoft.OperationalInsights
    

工作負載配置檔會決定環境中部署之容器應用程式可用的計算和記憶體資源數量。 建立使用量工作負載設定檔,以提供調整至零支援和依使用量付費。

  1. 設定環境變數。

    location=<REGION>
    resourceGroup=<RESOURCE_GROUP_NAME>
    storage=<STORAGE_NAME>
    containerAppEnv=<CONTAINER_APP_ENVIRONMNET_NAME>
    functionApp=<APP_NAME>
    vnet=<VNET_NAME>
    
  2. 建立資源群組。

    az group create --name $resourceGroup --location $location
    
  3. 建立容器應用程式環境。

    az containerapp env create \
      --enable-workload-profiles \
      --resource-group $resourceGroup \
      --name $containerAppEnv \
      --location $location \
    
  4. 根據 Durable Functions 映像建立容器應用程式。

    az containerapp create --resource-group $resourceGroup \
    --name $functionApp \
    --environment $containerAppEnv \
    --image $dockerId/$imageName:$imageVersion \
    --ingress external \
    --kind functionapp \
    --query properties.outputs.fqdn
    
  5. 請記下應用程式 URL,其看起來應該類似 https://<APP_NAME>.<ENVIRONMENT_IDENTIFIER>.<REGION>.azurecontainerapps.io

建立資料庫

  1. 建立函式應用程式所需的 Azure 記憶體帳戶。

    az storage account create --name $storage --location $location --resource-group $resourceGroup --sku Standard_LRS
    
  2. 在 Azure 入口網站中, 建立 Azure SQL 資料庫 來保存狀態資訊。 在建立期間:

    • 啟用 Azure 服務與資源來存取此伺服器(在 [網路] 下)
    • 資料庫排序規則 的值(在 附加設定 中)設定為 Latin1_General_100_BIN2_UTF8

備註

請勿在生產環境中啟用 允許 Azure 服務和資源存取此伺服器 的設定。 生產應用程式應該實作更安全的方法,例如更強大的防火牆限制或虛擬網路設定。

設定身分識別型驗證

受控識別可藉由排除來自您應用程式的秘密,例如連接字串中的認證,讓您的應用程式更安全。 雖然您可以選擇 系統指派和使用者指派的受控識別,但建議使用使用者指派的受控識別,因為它不會繫結至應用程式生命週期。

在本節中,您會為 Azure 記憶體設定 使用者指派的受控識別

  1. 設定環境變數。

    subscription=<SUBSCRIPTION_ID>
    identity=<IDENTITY_NAME>
    
  2. 建立受控識別資源。

    echo "Creating $identity"
    az identity create -g $resourceGroup -n $identity --location "$location"
    
  3. 將使用者身分識別指派給容器應用程式。

    echo "Assigning $identity to app"
    az containerapp identity assign --resource-group $resourceGroup --name $functionApp --user-assigned $identity
    
  4. 設定角色型訪問控制 (RBAC) 權限的範圍。

    scope="/subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.Storage/storageAccounts/$storage"
    
  5. 取得使用者身分識別的 clientId

    # Get the identity's ClientId 
    clientId=$(az identity show --name $identity --resource-group $resourceGroup --query 'clientId' --output tsv)
    
  6. 指派角色儲存體 Blob 資料擁有者角色,以存取儲存體帳戶。

    echo "Assign Storage Blob Data Owner role to identity"
    az role assignment create --assignee "$clientId" --role "Storage Blob Data Owner" --scope "$scope"
    

設定應用程式設定

備註

在 Azure Container Apps 中裝載 Durable Functions 應用程式時,不支援使用受控識別向 MSSQL 資料庫進行驗證。 目前,本指南會使用連接字串進行驗證。

  1. 從 Azure 入口網站中的 SQL 資料庫資源,流覽至 [ 設定>連接字串 ] 以尋找連接字串。

    顯示資料庫連接字串的螢幕快照。

    連接字串的格式應該類似:

    dbserver=<SQL_SERVER_NAME>
    sqlDB=<SQL_DB_NAME>
    username=<DB_USER_LOGIN>
    password=<DB_USER_PASSWORD>
    
    connStr="Server=tcp:$dbserver.database.windows.net,1433;Initial Catalog=$sqlDB;Persist Security Info=False;User ID=$username;Password=$password;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
    

    如果您忘記先前資料庫建立步驟的密碼,您可以在 SQL Server 資源上重設密碼。

    顯示 [重設密碼] 按鈕的螢幕快照。

  2. 將 SQL 資料庫的連接字串儲存為容器應用程式中的一項機密資訊,並命名為 sqldbconnection

    az containerapp secret set \
    --resource-group $resourceGroup \
    --name $functionApp \
    --secrets sqldbconnection=$connStr
    
  3. 將下列設定新增至應用程式:

    az containerapp update \
    -n $functionApp \
    -g $resourceGroup \
    --set-env-vars SQLDB_Connection=secretref:sqldbconnection \
    AzureWebJobsStorage__accountName=$storage \
    AzureWebJobsStorage__clientId=$clientId \
    AzureWebJobsStorage__credential=managedidentity \
    FUNCTIONS_WORKER_RUNTIME=dotnet-isolated
    

本機測試

  1. 使用 HTTP 測試工具將要求傳送 POST 至 HTTP 觸發程式端點,這應該類似:

    https://<APP NAME>.<ENVIRONMENT_IDENTIFIER>.<REGION>.azurecontainerapps.io/api/DurableFunctionsOrchestrationCSharp1_HttpStart
    

    回應是 HTTP 函式的初始結果,讓您知道 Durable Functions 協調流程已成功啟動。 雖然回應包含一些有用的 URL,但它尚未顯示協調流程的結束結果。

  2. 將的 URL 值 statusQueryGetUri 複製/貼到瀏覽器的網址列中,然後執行。 或者,您也可以繼續使用 HTTP 測試工具來發出 GET 要求。

    此要求會查詢協調流程執行個體的狀態。 您應該會看到實例已完成,以及 Durable Functions 應用程式的輸出或結果。

    {
        "name":"HelloCities",
        "instanceId":"7f99f9474a6641438e5c7169b7ecb3f2",
        "runtimeStatus":"Completed",
        "input":null,
        "customStatus":null,
        "output":"Hello, Tokyo! Hello, London! Hello, Seattle!",
        "createdTime":"2023-01-31T18:48:49Z",
        "lastUpdatedTime":"2023-01-31T18:48:56Z"
    }
    

後續步驟

深入瞭解: