本指南將示範如何在不建置或管理容器映像的情況下,將 Data API 建置器(DAB)部署到 Azure App 服務。 App Service 內建支援 TLS、自訂網域、擴展、監控及 Microsoft Entra 認證。
提示
如果你的環境使用容器,請參考 部署到 Azure 容器應用程式 或 部署到 Azure Kubernetes Service。
先決條件
- 一個有有效訂閱的 Azure 帳號。 免費註冊帳號。
- 數據 API 產生器 CLI。 安裝 CLI。
- Azure CLI。 安裝 Azure CLI。
- 安裝在本地開發或建置機上的 .NET 8 SDK 或更新版本。
- 一個 Azure 可以存取的現有支援資料庫。
Important
內建的 .NET 應用服務堆疊包含 .NET 執行環境,但不包含 .NET SDK。 還原 DAB 並在本地開發或建置機上組裝部署套件。 App 服務啟動時不要執行 dotnet tool restore 。
建置組態檔
建立一個 DAB 設定檔來連接你現有的資料庫。
在本地機器建立一個空白目錄來存放設定檔和部署產出物。
使用
dab init初始化新的基底組態檔。 用這個@env()函式參考DATABASE_CONNECTION_STRING環境變數,這樣憑證就不會被儲存在設定檔裡。dab init --database-type "<database-type>" --connection-string "@env('DATABASE_CONNECTION_STRING')"將至少一個資料庫實體新增至組態。 使用
dab add命令來設定實體。 重複dab add以符合您所需的實體次數。dab add "<entity-name>" --source "<schema>.<table>" --permissions "anonymous:*"開啟並檢閱 dab-config.json 檔案的內容。 請確認:
-
data-source.connection-string使用@env('DATABASE_CONNECTION_STRING') - 你的實體與權限正確無誤
Important
不要在
dab-config.json中嵌入字串或秘密。 使用這個@env()函式,讓值能在執行時從環境變數中解析出來。-
將 DAB 固定用於建置
使用本地的 .NET 工具清單,將 DAB 版本釘選到你的開發或建置機上。 清單讓建置可以重現,但它不包含還原的 DAB 二進位檔。 你會在本指南後面把這些二進位檔複製到部署套件裡。
在你的專案目錄中建立一個 .NET 本地工具清單。
dotnet new tool-manifest安裝特定的 Data API 建構器版本作為本地工具。 用你想部署的版本取代
<dab-version>,例如2.0.9。dotnet tool install microsoft.dataapibuilder --version "<dab-version>"確認清單是否存在於
.config/dotnet-tools.json。在開發或建置機器上還原已釘選的工具。
dotnet tool restore備註
還原操作會填充本地 NuGet 套件快取。 App Service 部署套件必須包含還原的執行時有效載荷;只
.config/dotnet-tools.json部署是不夠的。
本地測試
部署到 Azure 前,先確認執行時啟動且端點正常運作。
將 連接字串 設為本地環境變數。
$env:DATABASE_CONNECTION_STRING = "<your-connection-string>"在本地啟動 DAB 執行環境。
dotnet tool run dab start使用 Swagger 介面或發送請求至
/api/<entity-name>來測試 REST 端點。測試位於
/graphql的 GraphQL 端點。驗證所有端點後停止執行時。
建立 App Service 資源
建立 Azure 資源,以在 App Service 上架設 DAB。
建立新的資源群組。 你在本指南中使用這個資源群組來獲取所有新資源。
az group create --name "<resource-group-name>" --location "<location>"提示
考慮將資源群組命名為 msdocs-dab-appservice。
建立 App Service 方案。
az appservice plan create --name "<plan-name>" --resource-group "<resource-group-name>" --sku B1 --is-linux備註
本指南使用 Linux 上的 B1 (基礎)等級。
建立使用 .NET 8 執行環境和系統指派的管理身份的網頁應用程式。
az webapp create --name "<app-name>" --resource-group "<resource-group-name>" --plan "<plan-name>" --runtime "DOTNETCORE:8.0" --assign-identity "[system]"提示
使用
az webapp list-runtimes --os linux驗證你的計畫中可用的執行時環境。
設定 App 服務設定
設定 App Service 執行 DAB 所需的環境變數和啟動指令。
將資料庫的連接字串設為 App Service 應用程式的設定。
az webapp config appsettings set --name "<app-name>" --resource-group "<resource-group-name>" --settings DATABASE_CONNECTION_STRING="<your-connection-string>"提示
請使用不包含機密資訊的連接字串。 相反地,請使用受管理身份和 Microsoft Entra 認證來管理資料庫與 App Service 之間的存取。 如需詳細資訊,請參閱 使用受控識別的 Azure 服務。
設定 DAB 監聽的位址。
8080連接埠是內建 Linux App Service 堆疊的應用程式連接埠。az webapp config appsettings set --name "<app-name>" --resource-group "<resource-group-name>" --settings ASPNETCORE_URLS="http://0.0.0.0:8080"在第一次部署前啟用 Always On 和檔案系統日誌。 Always On 在本指南所用的 B1 層級可用。
az webapp config set --name "<app-name>" --resource-group "<resource-group-name>" --always-on true az webapp log config --name "<app-name>" --resource-group "<resource-group-name>" --application-logging filesystem --docker-container-logging filesystem --level information建立一個啟動腳本,啟動部署套件中包含的 DAB 執行時有效載荷。 在你的專案目錄中建立一個檔案
startup.sh名稱。#!/bin/sh set -eu exec dotnet ./dab/Microsoft.DataApiBuilder.dll start --config ./dab-config.jsonImportant
確保
startup.sh使用 LF(Unix)行尾,而非 CRLF。 Windows 編輯器預設可能以 CRLF 儲存,導致 Linux App Service 主機上的腳本失敗。在 App Service 裡設定啟動指令。
az webapp config set --name "<app-name>" --resource-group "<resource-group-name>" --startup-file "sh startup.sh"
設定 Azure SQL 的受控識別
如果你的資料來源是 Azure SQL,請在資料庫中授權網頁應用程式系統指派的管理身份。 如果你使用不同的資料庫或認證方式,請跳過這部分。
以 Microsoft Entra 管理員身份連接到目標資料庫。
建立供網頁應用程式身分識別使用的獨立資料庫使用者,並且僅授與 DAB 實體所需的權限。 以下範例支援讀寫操作。
CREATE USER [<app-name>] FROM EXTERNAL PROVIDER; ALTER ROLE [db_datareader] ADD MEMBER [<app-name>]; ALTER ROLE [db_datawriter] ADD MEMBER [<app-name>];備註
Microsoft Entra 的身份傳播在網頁應用程式建立後可能需要幾分鐘。 如果
CREATE USER無法立即解決身份,請等待並重試。將
DATABASE_CONNECTION_STRING設為 Azure SQL 受控識別的連接字串。az webapp config appsettings set --name "<app-name>" --resource-group "<resource-group-name>" --settings DATABASE_CONNECTION_STRING="Server=tcp:<sql-server-name>.database.windows.net,1433;Initial Catalog=<database-name>;Authentication=Active Directory Managed Identity;Encrypt=True;TrustServerCertificate=False;"
部署至「App Service」
將還原的 DAB 執行時複製到你的應用程式目錄,然後用 ZIP 部署該目錄。
建立一個包含 DAB 設定、啟動腳本及還原執行時有效載荷的應用程式目錄。
範例中使用 DAB 版本
2.0.9。 將版本設為與你在.config/dotnet-tools.json中釘選的版本相同。$dabVersion = "2.0.9" $globalPackages = (dotnet nuget locals global-packages --list) -replace '^global-packages:\s*', '' $dabPayload = Join-Path $globalPackages "microsoft.dataapibuilder/$dabVersion/tools/net8.0/any" $appDirectory = Join-Path (Get-Location) "app" Remove-Item $appDirectory -Recurse -Force -ErrorAction SilentlyContinue New-Item -ItemType Directory -Path (Join-Path $appDirectory "dab") -Force | Out-Null Copy-Item dab-config.json, startup.sh -Destination $appDirectory Copy-Item (Join-Path $dabPayload "*") -Destination (Join-Path $appDirectory "dab") -Recurse if (-not (Test-Path (Join-Path $appDirectory "dab/Microsoft.DataApiBuilder.dll"))) { throw "The restored DAB runtime payload wasn't found." }Important
在你還原固定 DAB 工具的同一台機器上執行這些指令。 如果您的環境覆寫了 NuGet 全域套件目錄,
dotnet nuget locals會解析該目錄的位置。建立具有可攜式
/項目分隔符的 ZIP。 歸檔根必須直接包含dab-config.json、startup.sh,以及dab/目錄。 不要壓縮父app目錄。Remove-Item deploy.zip -Force -ErrorAction SilentlyContinue tar.exe -a -c -f deploy.zip -C $appDirectory dab-config.json startup.sh dabWarning
在 Windows 上,
Compress-Archive可以儲存帶有\分隔符的巢狀條目。 Kudu ZIP 部署可能會以 HTTP 400 拒絕該封存檔。 使用會保留/分隔符號的 ZIP 工具,若部署後回傳 HTTP 400 且沒有詳細資訊,請檢查壓縮檔中的項目。將 ZIP 套件部署到 App Service。
az webapp deploy --resource-group "<resource-group-name>" --name "<app-name>" --src-path deploy.zip --type zip --clean true --restart false --timeout 600000部署完成後重新啟動網頁應用程式。
az webapp restart --resource-group "<resource-group-name>" --name "<app-name>"
驗證部署
部署後,確認 DAB 是否在 App Service 上成功啟動。
打開 App Service 網址。 根回應包含 DAB 狀態與版本。
https://<app-name>.azurewebsites.net用你在本地測試過的實體路徑測試 REST 和 GraphQL 端點。 部署後的應用程式使用相同的
dab-config.json,因此端點行為應該與你本地執行時相符。https://<app-name>.azurewebsites.net/api/<entity-name> https://<app-name>.azurewebsites.net/graphql備註
在生產模式下,當呼叫者未被授權查看完整健康報告時,
/health可以回傳 HTTP 403。 如果根端和授權實體端點成功返回,收到 403 回應/health並不代表啟動失敗。如果端點回傳意外錯誤,請檢視或下載應用程式日誌。 本指南中,已在部署前啟用記錄功能。
az webapp log tail --name "<app-name>" --resource-group "<resource-group-name>" az webapp log download --name "<app-name>" --resource-group "<resource-group-name>" --log-file appservice-logs.zip
設定驗證 (選擇性)
用 Microsoft Entra ID 保護你的 App Service 端點以供生產使用。
詳細步驟請參見 「配置 App Service 認證」。
啟用 App Service 認證後,設定 DAB 信任 App Service 注入的身份標頭。 在你的開發機器上執行這個指令,然後重建並重新部署 ZIP 套件。
dab configure --runtime.host.authentication.provider AppService
Important
AppService 中的 dab-config.json 認證提供者信任由 App Service 認證注入的標頭。 在生產環境中使用此服務提供者時,務必啟用 App Service 認證。 欲了解更多資訊,請參閱簡易認證(App Service)。
備註
App Service 認證保護端點的入口。 DAB 實體權限仍決定執行時允許的操作。 若要進行匿名示範,不要依賴 App Service 的身份標頭。 針對基於角色的存取,啟用 App Service 認證並更新實體權限,改用已認證或自訂的角色,而非 anonymous:*。
針對部署進行疑難排解
請參考以下症狀來識別常見的部署問題。
| 癥狀 | 原因和解決方案 |
|---|---|
| ZIP 部署回傳 HTTP 400 但未包含詳細資訊 | 檢查 ZIP 根目錄和項目分隔符號。 使用 / 分隔符重新建立 ZIP,並確保其中直接包含 dab-config.json、startup.sh 和 dab/。 |
應用程式回傳 HTTP 503,日誌包含 No .NET SDKs were found 或 The application 'tool' does not exist |
啟動指令正在嘗試執行 dotnet tool。 用還原的 DAB 有效載荷重建套件並直接呼叫 Microsoft.DataApiBuilder.dll 。 |
| 啟動程序已執行到使用者命令,但 App Service 預熱失敗 | 確認啟動指令碼使用 LF 行尾,使用 sh startup.sh,確認 DAB 有效載荷的路徑,並檢查日誌中的監聽 URL 和資料庫錯誤。 |
| DAB 啟動,但資料庫請求失敗 | 確認網頁應用程式的管理身份是否存在於資料庫使用者,且擁有設定實體所需的權限。 |
/health 回傳 HTTP 403,而 REST 或 GraphQL 則正常運作 |
DAB 正在運作,但來電者無權查看完整的健康報告。 請改為驗證根端點或已獲授權的實體端點。 |
| 較大的 ZIP 部署會回傳 HTTP 502 | 重試前請先查看部署歷史。 以同步方式部署,並明確指定逾時時間、停用隱式重新啟動,並在部署完成後重新啟動。 |
清理資源
當你不再需要網頁應用程式及其資源時,刪除資源群組。
az group delete --name "<resource-group-name>" --yes --no-wait
相關內容
- Easy Auth(App Service)認證
- 設定檔參考
- 執行時主機與認證設定
- 部署至 Azure 容器應用程式
- 與 Application Insights 整合