Azure 容器應用程式 是唯一的主機選項,可在您使用Microsoft SQL (MSSQL) 儲存體提供者時,支援耐用函式的事件驅動自動調整 (縮放至零)。 如果你使用不同的儲存後端,必須將最小副本數設為大於零。
Tip
對於新專案,建議使用 Durable Task Scheduler,這是 Azure 管理的持久工作流程的推薦後端。 本指南專門介紹 MSSQL 後端。
想了解更多關於在容器應用程式中執行 Azure Functions 的資訊,請參閱 Azure 容器應用程式 的 Azure Functions 托管。
在本文中,您將學會如何:
- 從本機 Durable Functions 專案建立 Docker 映像。
- 建立 Azure Container App 和相關資源。
- 將映像部署至 Azure 容器應用程式並設定驗證。
先決條件
- Visual Studio Code已安裝。
- .NET 8.0 SDK。
- Docker 和 Docker 識別符
- Azure CLI2.47 版或更新版本。
- Azure Functions 核心工具
- 具有有效訂用帳戶的 Azure 帳戶。 免費註冊帳號。
- HTTP 測試工具,可保護您的數據安全。 如需詳細資訊,請參閱 HTTP 測試工具。
建立本機 Durable Functions 專案
本指南假設你已經配置了一個 .NET 隔離的 Durable Functions 專案,並以 MSSQL 作為後端配置。 如果你還沒有,請依照 MSSQL 快速入門 在本地建立並測試,然後回來這裡。
在繼續之前,請先確認:
- 你的專案目標是 .NET 8.0 並採用隔離工作者模型
- MSSQL 儲存提供者配置為
host.json - 能夠透過
func start順利執行該應用程式
新增 Docker 相關檔案
在專案根目錄中建立 Dockerfile ,描述在容器中執行函式應用程式所需的最低環境。
在專案根目錄中,建立名為 Dockerfile 的新檔案。
將下列內容複製/貼到 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"]儲存檔案。
使用下列內容新增 .dockerignore 檔案:
local.settings.json儲存 .dockerignore 檔案。
建置容器映像
建置 Docker 映像。 在 Docker Hub 的 Microsoft Azure Functions Base 找到 Azure Functions 支援的完整基礎映像列表。
啟動 Docker 精靈。
使用
docker login命令登入 Docker。出現提示時,請使用您的使用者名稱和密碼登入。 「登入成功」訊息會確認您已登入。
流覽至您的專案根目錄。
執行下列命令來建置映像檔,將
<DOCKER_ID>替換為您的 Docker Hub 帳戶 ID。dockerId=<DOCKER_ID> imageName=<IMAGE_NAME> imageVersion=v1.0.0 docker build --tag $dockerId/$imageName:$imageVersion .Note
如果您是在 M 系列 Mac 上執行,請改用
--platform linux/amd64。將映射推送至 Docker:
docker push $dockerId/$imageName:$imageVersion視網路速度而定,初始映射推送可能需要幾分鐘的時間。 在等候時,請繼續進行下一節。
創建 Azure 資源以用於 Durable Functions 在容器應用程式上
在容器應用程式上建立執行 Durable Functions 所需的 Azure 資源。
- Azure 資源群組: 包含所有已建立資源的資源群組。
- Azure Container App 環境: 裝載容器應用程式的環境。
- Azure 容器應用程式:包含 Durable Functions 應用程式的映像會部署到此應用程式。
- Azure 儲存體帳戶: 函式應用需要此帳戶來儲存應用相關資料,如應用程式程式碼。
初始設定
在新終端機中,登入您的 Azure 訂用帳戶:
az login az account set -s <subscription_name>執行必要的命令來設定 Azure 容器應用程式 CLI 擴充功能:
az upgrade az extension add --name containerapp --upgrade az provider register --namespace Microsoft.App az provider register --namespace Microsoft.OperationalInsights
建立容器應用程式和相關資源
工作負載配置檔會決定環境中部署之容器應用程式可用的計算和記憶體資源數量。 建立使用量工作負載設定檔,以提供調整至零支援和依使用量付費。
設定環境變數。
location=<REGION> resourceGroup=<RESOURCE_GROUP_NAME> storage=<STORAGE_NAME> containerAppEnv=<CONTAINER_APP_ENVIRONMNET_NAME> functionApp=<APP_NAME> vnet=<VNET_NAME>建立資源群組。
az group create --name $resourceGroup --location $location建立容器應用程式環境。
az containerapp env create \ --enable-workload-profiles \ --resource-group $resourceGroup \ --name $containerAppEnv \ --location $location \根據 Durable Functions 映像建立容器應用程式。
az containerapp create --resource-group $resourceGroup \ --name $functionApp \ --environment $containerAppEnv \ --image $dockerId/$imageName:$imageVersion \ --ingress external \ --kind functionapp \ --query properties.outputs.fqdn請記下應用程式 URL,其看起來應該類似
https://<APP_NAME>.<ENVIRONMENT_IDENTIFIER>.<REGION>.azurecontainerapps.io。
建立資料庫
建立函式應用程式所需的 Azure 記憶體帳戶。
az storage account create --name $storage --location $location --resource-group $resourceGroup --sku Standard_LRS在 Azure 入口網站中, 建立 Azure SQL 資料庫 來保存狀態資訊。 創建過程中:
- 啟用Azure服務與資源存取此伺服器(Networking)。 生產環境則建議使用 更強的防火牆限制或虛擬網路設定 。
- 將 資料庫排序規則 的值(在 附加設定 中)設定為
Latin1_General_100_BIN2_UTF8。
設定身分識別型驗證
受控識別可藉由從應用程式刪除祕密 (例如連接字串中的認證),讓應用程式更加安全。 雖然您可以選擇 系統指派和使用者指派的受控識別,但建議使用使用者指派的受控識別,因為它不會繫結至應用程式生命週期。
在本節中,您會為 Azure 記憶體設定 使用者指派的受控識別 。
設定環境變數。
subscription=<SUBSCRIPTION_ID> identity=<IDENTITY_NAME>建立受控識別資源。
echo "Creating $identity" az identity create -g $resourceGroup -n $identity --location "$location"將使用者身分識別指派給容器應用程式。
echo "Assigning $identity to app" az containerapp identity assign --resource-group $resourceGroup --name $functionApp --user-assigned $identity設定角色型訪問控制 (RBAC) 權限的範圍。
scope="/subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.Storage/storageAccounts/$storage"取得使用者身分識別的
clientId。# Get the identity's ClientId clientId=$(az identity show --name $identity --resource-group $resourceGroup --query 'clientId' --output tsv)指派角色儲存體 Blob 資料擁有者角色,以存取儲存體帳戶。
echo "Assign Storage Blob Data Owner role to identity" az role assignment create --assignee "$clientId" --role "Storage Blob Data Owner" --scope "$scope"
設定應用程式設定
Note
在 Azure 容器應用程式 中裝載 Durable Functions 應用程式時,不支援使用受控識別向 MSSQL 資料庫進行驗證。 目前,本指南會使用連接字串進行驗證。
從 Azure 入口網站中的 SQL 資料庫資源,流覽至 [ 設定>連接字串 ] 以尋找連接字串。
Azure 入口網站中的 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 資源上重設密碼。
將 SQL 資料庫的連接字串儲存為容器應用程式中的一項機密資訊,並命名為 sqldbconnection。
az containerapp secret set \ --resource-group $resourceGroup \ --name $functionApp \ --secrets sqldbconnection=$connStr將下列設定新增至應用程式:
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
測試已部署的 Durable Functions 應用程式
使用 HTTP 測試工具將要求傳送
POST至 HTTP 觸發程式端點,這應該類似:https://<APP NAME>.<ENVIRONMENT_IDENTIFIER>.<REGION>.azurecontainerapps.io/api/DurableFunctionsOrchestrationCSharp1_HttpStart回應是 HTTP 函式的初始結果,讓您知道 Durable Functions 協調流程已成功啟動。 雖然回應包含一些有用的 URL,但它尚未顯示協調流程的結束結果。
將的 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" }
下一步
- Azure Functions 的 Azure 容器應用程式裝載
- MSSQL 儲存提供者 架構、設定與工作負載行為
- Durable Task Scheduler — 推薦用於新耐用工作流程專案的 Azure 管理後端
- Durable Functions 概觀