在這個教學中,你將學習如何將資料驅動的 ASP.NET Core 應用程式部署到 Azure App Service,並連接到 Azure SQL Database。 你也會部署 Redis 快取,讓應用程式中的快取程式碼得以啟用。 Azure App Service 是一個高度可擴展、自我修補的網頁主機服務,能輕鬆部署 Windows 或 Linux 上的應用程式。 雖然本教學使用 ASP.NET Core 8.0 應用程式,但其他版本的 ASP.NET Core 流程相同。
這很重要
Azure Cache for Redis 宣布了所有 SKU 的淘汰時間表。 我們建議盡快將現有的 Azure Cache for Redis 實例移至 Azure Managed Redis 上。
遷移指引:
有關退休的更多詳細資訊:
在本教學課程中,您會了解如何:
- 建立預設安全的 App Service、SQL 資料庫和 Redis 快取架構。
- 利用受管理身份和 Key Vault 參考來保護連線秘密。
- 從 GitHub 倉庫部署一個範例 ASP.NET Core 應用程式到 App Service。
- 存取應用程式程式代碼中的App Service 連接字串和應用程式設定。
- 進行更新並重新部署應用程式程式碼。
- 上傳移轉套件組合來產生資料庫結構描述。
- 從 Azure 串流診斷日誌。
- 在 Azure 入口網站管理應用程式。
- 使用相同的架構配置並使用 Azure Developer CLI 部署。
- 用 GitHub Codespaces 和 GitHub Copilot 優化你的開發工作流程。
必要條件
- 一個有有效訂閱的 Azure 帳號。 如果你沒有Azure帳號,可以免費建立一個。
- 一個 GitHub 帳號。 您也可以 免費取得一個。
- 具備 ASP.NET Core 開發知識。
- (可選) 要試試GitHub Copilot,可以申請一個GitHub Copilot帳號。 有 30 天免費試用版可用。
- 一個有有效訂閱的 Azure 帳號。 如果你沒有Azure帳號,可以免費建立一個。
- Azure 開發者 CLI 已安裝。 你可以按照 Azure Cloud Shell 的步驟操作,因為它已經安裝了 Azure Developer CLI。
- 具備 ASP.NET Core 開發知識。
- (可選) 要試試GitHub Copilot,可以申請一個GitHub Copilot帳號。 有 30 天免費試用版可用。
跳到結尾
如果你只是想看到這個教學中的範例應用程式在Azure中運行,只要在Azure Cloud Shell執行以下指令,並依照提示操作:
dotnet tool install --global dotnet-ef
mkdir msdocs-app-service-sqldb-dotnetcore
cd msdocs-app-service-sqldb-dotnetcore
azd init --template msdocs-app-service-sqldb-dotnetcore
azd up
1.執行範例
首先,您會將範例資料驅動的應用程式設定為起點。 為了方便起見,sample repository 包含 dev 容器 配置。 開發容器具有開發應用程式所需的全部內容,包括資料庫、快取,以及範例應用程式所需的所有環境變數。 開發容器可以在 GitHub codespace 執行,這表示你可以在任何有網頁瀏覽器的電腦上執行這個範例。
第 1 步:在新的瀏覽器視窗中:
- 登入你的 GitHub 帳號。
- 導航到https://github.com/Azure-Samples/msdocs-app-service-sqldb-dotnetcore/fork。
- 取消選取 [僅複製主分支]。 您想要所有分支。
- 選取 [建立派生]。
步驟 2:在 GitHub 分支中:
- 為起始分支選取 [主分支]> [starter-no-infra]。 此分支僅包含範例專案,且不包含與 Azure 相關的檔案或設定。
- 選取 Code>Codespaces>在 starter-no-infra 上建立程式代碼空間。 設定 Codespace 需要幾分鐘的時間。
步驟 3:在 codespace 終端機中:
- 使用
dotnet ef database update執行資料庫移轉。 - 使用
dotnet run執行應用程式。 - 當您看到通知
Your application running on port 5093 is available.時,請選取 [在瀏覽器中開啟]。 您應該會在新的瀏覽器索引標籤中看到應用程式範例。若要停止應用程式,請鍵入Ctrl+C。
有問題嗎? 查看疑難排解區段。
2. 建立 App Service(應用服務)、資料庫和快取
在這個步驟中,你會建立 Azure 資源。 本教學中使用的步驟是建立一組預設安全的資源,包括 App Service、Azure SQL Database 和 Azure Cache。 在創建過程中,您將指定:
- Web 應用程式的 [名稱]。 它用來做為應用程式的 DNS 名稱的一部分。
- 要實際執行應用程式的區域。 其也會作為您應用程式的 DNS 名稱的一部分來使用。
- 應用程式的執行階段堆疊。 就是你選擇 .NET 版本來用於你的應用程式。
- 應用程式的託管方案。 這是包含應用程式功能組合和擴展能力的一個價格層級。
- 應用程式的 [資源群組]。 資源群組讓你可以(在邏輯容器中)將應用程式所需的所有 Azure 資源分組。
登入 Azure 入口網站,並依照以下步驟建立您的Azure App Service資源。
步驟1: 在Azure傳送門中:
- 在頂端搜尋列中,輸入 App Service。
- 請在 [服務] 標題下選取標示為 App Service 的項目。
- 選取 [建立>Web 應用程式]。 你也可以直接進入 creation wizard。
步驟 2: 在 [ 建立 Web 應用程式 ] 頁面中,填寫表單,如下所示。
- 名稱: msdocs-core-sql-XYZ。 系統會為您產生名為 msdocs-core-sql-XYZ_group 的資源群組。
- Runtime stack: .NET 8 (LTS).
- 作系統: Linux。
- 區域:您慣用的區域。
- Linux 方案: 新建 並使用 msdocs-core-sql-XYZ 名稱。
- 定價方案:基本 B1。 準備好時,您可以 升級 至不同的定價層。
步驟 3:
- 選取 資料庫 索引標籤。
- 選取 [建立資料庫]。
- 在 [引擎] 中,選取 [SQLAzure]。
- 建立 Redis 快取。
- 在 [ 名稱 ] 中(在 [快取] 底下,輸入快取的名稱。
- 在 [SKU] 中,選取 [ 基本]。
步驟 4:
- 選取 [部署] 索引標籤。
- 啟用 持續部署。
- 在 Organization 中,選擇你的GitHub別名。
- 在 [存放庫] 中,選取 msdocs-app-service-sqldb-dotnetcore。
- 在 [分支] 中,選取 [starter-no-infra]。
- 請確定 已停用基本身份驗證 。
- 選取 [檢閱 + 建立]。
- 驗證完成時,選取 [建立]。
步驟 5: 部署需要幾分鐘的時間才能完成。 在部署完成時,選取 [前往資源] 按鈕。 系統會將您直接帶至 App Service 應用程式,但會建立下列資源:
- 資源群組:所有已建立資源的容器。
- App Service 方案:定義 App Service 的計算資源。 在基本層中已建立一個 Linux 方案。
- App Service:代表您的應用程式,並在 App Service 方案中執行。
- 虛擬網路:與 App Service 應用程式整合,並隔離後端網路流量。
- 私人端點:虛擬網路中的金鑰保存庫、資料庫伺服器和 Redis 快取的存取端點。
- 網路介面:代表私人 IP 位址,每個私人端點各有一個位址。
- Azure SQL Database server:僅能從其私有端點背後存取。
- Azure SQL Database:伺服器上會為你建立資料庫和使用者。
- Redis:只能從其私有端點背後存取。
- 金鑰保存庫:只能從其私人端點後方存取。 用於管理 App Service 應用程式的秘密。
- Private DNS zones:啟用虛擬網路中金鑰庫、資料庫伺服器及 Redis 快取的 DNS 解析。
3.安全連線秘密
建立精靈已經為你產生了連接變數,分別是 .NET 連線字串 以及 app settings。 不過,安全性最佳做法是將祕密完全從 App Service 中移出。 你會將秘密移到金鑰保存庫,並透過服務連接器把應用程式設定改成金鑰保存庫參考。
秘訣
若要使用無密碼驗證,請參閱如何變更 SQL Database 連線以改用受控識別?
步驟 1:取回現有的 connection string
- 在 App Service 頁面的左側功能表中,選取 [>>]。
- 選取 AZURE_SQL_CONNECTIONSTRING。
- 在 Add/Edit connection string,Value欄位中,找到字串末尾的 Password=部分。
- 複製 Password= 後面的密碼字串,以供後續使用。 這個 connection string 讓你能連接到由私人端點保護的 SQL 資料庫。 不過,秘密會直接儲存在App Service 應用程式中,這不是最好的。 同樣地,App settings 分頁中的 Redis 快取連接字串也包含一個秘密。 您要變更此設定。
步驟 2:建立金鑰保存庫以安全地管理秘密
- 在搜尋欄頂端輸入「key vault」,然後選擇Marketplace>Key Vault。
- 在 [資源群組] 中,選取 [msdocs-core-sql-XYZ_group]。
- 在 [金鑰保存庫名稱] 中,輸入只包含字母和數字的名稱。
- 在 [區域] 中,將它設定為與資源群組相同的位置。
步驟 3:使用私人端點保護金鑰保存庫
- 選擇 [網路] 標籤。
- 取消勾選 啟用公用存取。
- 選取 [建立私人端點]。
- 在 [資源群組] 中,選取 msdocs-core-sql-XYZ_group。
- 在對話方塊的 [位置] 中,選取與 App Service 應用程式相同的位置。
- 在 [名稱] 中,輸入 msdocs-core-sql-XYZVvaultEndpoint。
- 在 [虛擬網络] 中,選取 msdocs-core-sql-XYZ_group 群組中的虛擬網络。
- 在 [子網] 中,選取可用的兼容子網。 為了方便起見,Web 應用程式精靈已建立它。
- 選擇 [確定]。
- 選取檢視 + 建立,然後選取建立。 等候金鑰保存庫部署完成。 您應該會看到「您的部署已完成」。
步驟 4:
- 在頂端搜尋列中輸入 msdocs-core-sql,然後輸入名為 msdocs-core-sql-XYZ 的 App Service 資源。
- 在 App Service 頁面的左側功能表中,選取 [設定 > 服務連接器]。 已有兩個連接器,這是「應用程式建立精靈」為您建立的。
- 選取 SQL Database 連接器旁的核取方塊,然後選取 [編輯]。
- 選取「驗證」頁籤。
- 在 [密碼] 中,貼上您先前複製的密碼。
- 選擇在密鑰保管庫中儲存密碼。
- 在 Key Vault 連線 下,選擇 建立新。 [建立連線] 對話方塊會在編輯對話方塊的頂端開啟。
步驟5:建立Key Vault連線
- 在 Key Vault 連線的建立連線對話方塊中,於 Key Vault 中選取您稍早建立的金鑰保存庫。
- 選取 [檢閱 + 建立]。
- 驗證完成時,選取 [建立]。
步驟 6:完成 SQL 資料庫 連接器設定
- 您回到預設連接器的編輯對話框中。 在 [驗證] 索引標籤中,等候建立金鑰保存庫連接器。 完成後,Key Vault Connection下拉選單會自動選出。
- 選取 下一步:網路。
- 選取 [設定防火牆規則以啟用對目標服務的存取權]。 應用程式建立精靈已使用私人端點保護 SQL 資料庫。
- 選擇 [儲存]。 等到 [更新成功] 通知出現為止。
步驟7:設定 Redis 連接器使用 Key Vault 機密
- 在 [服務連接器] 頁面中,選取 [Redis 快取] 連接器旁的複選框,然後選取 [ 編輯]。
- 選取「驗證」頁籤。
- 選擇在密鑰保管庫中儲存密碼。
- 在 Key Vault Connection 下,選擇你建立的key vault。
- 選取 下一步:網路。
- 選取 [設定防火牆規則以啟用對目標服務的存取權]。
- 選擇 [儲存]。 等到 [更新成功] 通知出現為止。
步驟8:驗證Key Vault整合
- 從左側功能表中,再次選取 [設定>環境變數連接字串>]。
- 在 AZURE_SQL_CONNECTIONSTRING 旁,選取 [顯示值]。 值應該是
@Microsoft.KeyVault(...),表示它是 金鑰保存庫參考,因為密鑰現在已經在金鑰保存庫中管理。 - 要驗證 Redis connection string,請選擇 App settings 標籤。在AZURE_REDIS_CONNECTIONSTRING旁邊,選擇顯示值。 數值也應該是
@Microsoft.KeyVault(...)。
總結來說,確保您的連接密鑰的過程包括:
- 從 App Service 應用程式的環境變數擷取連線秘密。
- 建立金鑰保存庫。
- 建立與系統指派的管理身份的 Key Vault 連線。
- 更新服務連接器以將秘密儲存在金鑰保存庫中。
4.部署範例程式碼
在此步驟中,你會使用 GitHub Actions 配置 GitHub 部署。 這只是部署至 App Service 的許多方式之一,但也是在部署程序中持續整合的絕佳方式。 根據預設,每次對您的 GitHub 存放庫執行 git push 都會觸發組建和部署動作。
Step 1: 回到你範例分支的GitHub程式碼空間,執行 git pull origin starter-no-infra。
這會將新認可的工作流程檔案提取到 Codespace。
步驟2(選項1:GitHub Copilot):
- 選取 [聊天] 檢視,然後選取 +,即可啟動新的聊天工作階段。
- 問問「@workspace 應用程式如何連接資料庫和快取?」Copilot可能會解釋
MyDatabaseContext類別,以及它在 Program.cs 中的配置方式。 - 問:「在生產環境中,我希望應用程式使用名為 AZURE_SQL_CONNECTIONSTRING 的資料庫連接字串,及應用程式設定名為 AZURE_REDIS_CONNECTIONSTRING。」Copilot 可能會展示與後續步驟中 選項 2:沒有 GitHub Copilot 的程式碼建議 類似的程式碼建議,甚至告訴你要在 Program.cs 檔案中進行變更。
- 在總管中開啟 Program.cs,然後新增程式碼建議。 GitHub Copilot 不會每次都給你相同的回應,而且也不一定每次都正確。 您可能需要詢問更多問題,以微調其回應。 關於技巧,請參見 我可以用我的程式碼空間中的GitHub Copilot做什麼?。
步驟2(選項2:無GitHub Copilot):
- 在檔案總管中開啟 Program.cs。
- 尋找程式碼中已註解的部分(第 12-21 行),並去除註解。
此程式碼會使用
AZURE_SQL_CONNECTIONSTRING連線到資料庫,並使用應用程式設定AZURE_REDIS_CONNECTIONSTRING連線到 Redis 快取。
步驟3(選項1:搭配GitHub Copilot):
- 在總管中開啟 .github/workflows/starter-no-infra_msdocs-core-sql-XYZ。 是 App Service 建立精靈創建此檔案。
- 醒目提示
dotnet publish步驟,然後選取
。 - Ask Copilot,「安裝dotnet ef,然後接著於相同的輸出資料夾中建立遷移包。」
- 如果此建議是可接受的,請選取 [接受]。 GitHub Copilot 不會每次都給你相同的回應,而且也不一定每次都正確。 您可能需要詢問更多問題,以微調其回應。 關於技巧,請參見 我可以用我的程式碼空間中的GitHub Copilot做什麼?。
步驟3(選項2:無GitHub Copilot):
- 在總管中開啟 .github/workflows/starter-no-infra_msdocs-core-sql-XYZ。 App Service 建立精靈建立了這個檔案
- 在
dotnet publish步驟下,新增一個步驟,使用 指令安裝dotnet tool install -g dotnet-ef --version 8.*。 - 在新步驟下,新增其他步驟以在部署套件中產生資料庫移轉套件組合:
dotnet ef migrations bundle --runtime linux-x64 -o ${{env.DOTNET_ROOT}}/myapp/migrationsbundle。 遷移套件是一個自包含的可執行檔,你可以在生產環境中執行,不需要 .NET SDK。 App Service 的 Linux 容器只有 .NET 執行環境,沒有 .NET SDK。
步驟 4:
- 選取 版本控制 擴充套件。
- 在文字框中輸入一個提交訊息,例如
Configure Azure database and cache connections。 或者,選擇
,讓 GitHub Copilot 幫你產生一個提交訊息。 - 選取 [認可],然後使用 [是] 來確認。
- 選取 [同步變更 1],然後使用 [確定] 來確認。
步驟5: 回到Azure入口的部署中心頁面:
- 選取 [記錄] 索引標籤,然後選取 [重新整理] 以查看新的部署執行。
- 在部署執行的記錄項目中,選取具有最新時間戳記的 建置/部署記錄 項目。
步驟 6: 你會被帶到GitHub倉庫,看到 GitHub 動作正在執行。 工作流程檔案會定義兩個不同的階段:建置和部署。 請等待 GitHub 執行狀態顯示為 Success。 需要約 5 分鐘的時間。
有問題嗎? 查看疑難排解區段。
5.產生資料庫結構
透過受虛擬網路保護的 SQL 資料庫,執行 dotnet 資料庫移轉最簡單的方式是在 App Service 中與 Linux 容器的 SSH 會話中。
第 1 步:回到 App Service 頁面後,在左側選單中,
- 選取 [開發工具>SSH]。
- 選取 [執行]。 (啟動需要幾分鐘的時間。
步驟 2: 在 SSH 會話中:
- 執行
cd /home/site/wwwroot。 此處是所有已部署的檔案。 - 執行 GitHub 工作流程產生的遷移套件,並搭配指令
./migrationsbundle -- --environment Production。 如果成功,App Service 已成功連線至 SQL Database。 請記住,--environment Production對應於您在 Program.cs 中所做的程式碼變更。
在 SSH 工作階段中,只有 /home 中檔案的變更才能在應用程式重新啟動之後保存。
/home 以外的變更不會保存。
有問題嗎? 查看疑難排解區段。
6.瀏覽至應用程式
步驟 1:在 [App Service] 頁面中:
- 從左側功能表中選取 [概觀]。
- 選取應用程式的 URL。
第 2 步:將幾項工作新增至清單。 恭喜你,你正在使用 Azure App Service 運行一個網頁應用程式,並且能安全連接 Azure SQL Database。
秘訣
應用程式範例會實作緩取模式。 當你第二次造訪資料檢視,或在資料變更後重新載入同一頁面時,網頁上的 處理時間 顯示較快,因為它是從快取載入資料,而非資料庫。
7.資料流診斷記錄
Azure App Service 會擷取所有主控台日誌,幫助你診斷應用程式的問題。 範例應用程式會在其每個端點中包含記錄程序代碼,以示範這項功能。
步驟 1:在 [App Service] 頁面中:
- 從左側功能表中,選取 [監視]> [App Service 記錄]。
- 在 [應用程式記錄] 下,選取 [檔案系統]。
- 在最上層的功能表中,選取 [儲存]。
步驟 2:從左側功能表中,選取 [記錄串流]。 您會看到應用程式的記錄,包括平台記錄和來自容器內的記錄。
8.清除資源
完成後,你可以刪除 Azure 訂閱中的所有資源,刪除資源群組。
步驟1: 在Azure入口網站頂端的搜尋欄中:
- 輸入資源群組名稱。
- 選取資源群組。
步驟 2:在資源群組頁面中,選取 [刪除資源群組]。
步驟 3:
- 輸入您確認要刪除的資源群組名稱。
- 選取 [刪除]。
2. 建立 Azure 資源並部署範例應用程式
在這個步驟中,你會建立 Azure 資源,並將範例應用程式部署到 App Service on Linux。 本教學步驟建立一組預設安全的資源,包括 App Service、Azure SQL 資料庫與 Redis 快取。
開發容器已經有 Azure 開發 CLI(AZD)。
從存放庫根路徑中執行
azd init。azd init --template dotnet-app-service-sqldb-infra出現提示時,請提供下列答案:
問題 回答 目前的目錄並非空白。 您是否要在「<您的目錄>」初始化專案? Y 您要對這些檔案執行什麼動作? 維持現有的檔案不變 輸入新的環境名稱 輸入唯一名稱。 AZD 範本會將這個名稱作為您在 Azure 中網頁應用程式的 DNS 名稱的一部分( <app-name>-<hash>.azurewebsites.net)。 允許英數字元與連字號。請執行
azd auth login指令並依照提示登入 Azure:azd auth login建立必要的Azure資源,並使用
azd up指令部署應用程式程式碼。 依照提示選擇 Azure 資源所需的訂閱與位置。azd upazd up命令需要大約 15 分鐘才能完成 (時間多半用在 Redis 快取上)。 這也會編譯及部署您的應用程式程式碼,但稍後會修改程式碼以便使用 App Service。 執行時,指令會提供關於配置與部署流程的訊息,包括 Azure 部署的連結。 完成時,命令也會顯示部署應用程式的連結。此 AZD 範本包含檔案(azure.yaml 及 infra 目錄),產生預設安全架構,包含以下Azure資源:
- 資源群組:所有已建立資源的容器。
- App Service 方案:定義 App Service 的計算資源。 在基本層中已建立一個 Linux 方案。
- App Service:代表您的應用程式,並在 App Service 方案中執行。
- 虛擬網路:與 App Service 應用程式整合,並隔離後端網路流量。
- 私人端點:虛擬網路中的金鑰保存庫、資料庫伺服器和 Redis 快取的存取端點。
- 網路介面:代表私人 IP 位址,每個私人端點各有一個位址。
- Azure SQL Database server:僅能從其私有端點背後存取。
- Azure SQL Database:伺服器上會為你建立資料庫和使用者。
- Redis:只能從其私有端點背後存取。
- 金鑰保存庫:只能從其私人端點後方存取。 用於管理 App Service 應用程式的秘密。
- Private DNS zones:啟用虛擬網路中金鑰庫、資料庫伺服器及 Redis 快取的 DNS 解析。
當指令第一次建立資源並部署應用程式碼後,部署的範例應用程式還無法運作,因為你必須做些小修改才能讓它連接到 Azure 的資料庫。
有問題嗎? 查看疑難排解區段。
3.驗證連接字串
秘訣
預設的 SQL 資料庫連接字串使用 SQL 驗證。 如需更安全的無密碼驗證,請參閱如何變更 SQL Database 連線以改用受控識別?
您使用的 AZD 範本已為您產生連線變數作為應用程式設定,並將其輸出至終端機以方便使用。 應用程式設定是將連線秘密保留在程式碼存放庫外部的一個方法。
在 AZD 輸出中,尋找設定
AZURE_SQL_CONNECTIONSTRING與AZURE_REDIS_CONNECTIONSTRING。 只會顯示設定名稱。 它們在 AZD 輸出中看起來是這樣的:App Service app has the following connection strings: - AZURE_SQL_CONNECTIONSTRING - AZURE_REDIS_CONNECTIONSTRING - AZURE_KEYVAULT_RESOURCEENDPOINT - AZURE_KEYVAULT_SCOPEAZURE_SQL_CONNECTIONSTRING包含 Azure 中 SQL 資料庫的connection string,AZURE_REDIS_CONNECTIONSTRING包含 Azure Redis 快取的connection string。 您稍後必須在程式碼中使用它們。為了方便起見,AZD 範本會顯示應用程式的應用程式設定頁面直接連結。 尋找該連結,並在新的瀏覽器索引標籤中開啟該連結。
有問題嗎? 查看疑難排解區段。
4.修改範例程式碼並重新部署
在GitHub的程式碼空間中,選擇 Chat 視圖,然後選擇 + 來啟動新的聊天會話。
問問「@workspace 應用程式如何連接資料庫和快取?」Copilot可能會解釋
MyDatabaseContext類別,以及它在 Program.cs 中的配置方式。問:「在生產模式下,我希望應用程式使用名為 AZURE_SQL_CONNECTIONSTRING 的資料庫連接字串,以及名為 AZURE_REDIS_CONNECTIONSTRING* 的應用程式設定。」Copilot 可能會給你類似 選項 2:沒有 GitHub Copilot 的後續程式碼建議,甚至告訴你要在 Program.cs 檔案中進行變更。
在總管中開啟 Program.cs,然後新增程式碼建議。
GitHub Copilot 不會每次都給你相同的回應,而且也不一定每次都正確。 您可能需要詢問更多問題,以微調其回應。 關於技巧,請參見 我可以用我的程式碼空間中的GitHub Copilot做什麼?。
部署這些變更之前,您仍然需要產生移轉套件組合。
有問題嗎? 查看疑難排解區段。
5.產生資料庫結構
透過受虛擬網路保護的 SQL Database,執行資料庫移轉最簡單的方式是使用 App Service 容器在 SSH 工作階段中進行。 不過,App Service 的 Linux 容器沒有 .NET SDK,所以執行資料庫遷移最簡單的方式是上傳一個自包含的遷移套件。
使用下列命令為您的專案產生移轉套件組合:
dotnet ef migrations bundle --runtime linux-x64 -o migrationsbundle秘訣
範例應用程式(參見 DotNetCoreSqlDb.csproj)設定包含此 migrationsbundle 檔案。 在
azd package階段中,migrationsbundle 將會新增至部署套件。使用
azd up部署所有變更。azd up在 AZD 輸出結果中,尋找 SSH 工作階段的 URL,並在瀏覽器中開啟該 URL。 輸出中看起來像這樣:
Open SSH session to App Service container at: <URL>
在 SSH 工作階段中,執行下列命令:
cd /home/site/wwwroot ./migrationsbundle -- --environment Production如果成功,App Service 已成功連線至資料庫。 請記住,
--environment Production對應於您在 Program.cs 中所做的程式碼變更。附註
只有
/home中檔案的變更才能在應用程式重新開機之後保存。/home以外的變更不會保存。
有問題嗎? 查看疑難排解區段。
6.瀏覽至應用程式
在 AZD 的輸出中,找到您應用程式的 URL,並在瀏覽器中打開它。 AZD 輸出中 URL 看起來像這樣:
Deploying services (azd deploy) (✓) Done: Deploying service web - Endpoint: <URL>
將幾項工作新增至清單。
恭喜你,你正在使用 Azure App Service 運行一個網頁應用程式,並且能安全連接 Azure SQL Database。
有問題嗎? 查看疑難排解區段。
7.資料流診斷記錄
Azure App Service 可以擷取主控台日誌,幫助你診斷應用程式的問題。 為了方便起見,AZD 範本已啟用記錄至本機檔案系統,並將記錄傳送至 Log Analytics 工作區。
如下列程式碼片段所示,應用程式範例包含可示範這項功能的標準記錄陳述式:
public async Task<IActionResult> Index()
{
var todoItems = await _cache.GetAsync(_TodoItemsCacheKey);
if (todoItems != null)
{
_logger.LogInformation("Data from cache.");
var todoList = JsonConvert.DeserializeObject<List<Todo>>(Encoding.UTF8.GetString(todoItems));
return View(todoList);
}
else
{
_logger.LogInformation("Data from database.");
var todoList = await _context.Todo.ToListAsync();
var serializedTodoList = JsonConvert.SerializeObject(todoList);
await _cache.SetAsync(_TodoItemsCacheKey, Encoding.UTF8.GetBytes(serializedTodoList));
return View(todoList);
}
}
在 AZD 輸出的結果中,尋找串流 App Service 記錄的連結,並使用瀏覽器開啟該連結。 連結在 AZD 輸出中看起來像這樣:
Stream App Service logs at: <URL>
如需深入了解 .NET 應用程式中的記錄,請參閱為 .NET、Node.js、Python 和 Java 應用程式啟用 Azure 監視器 OpenTelemetry系列文章。
有問題嗎? 查看疑難排解區段。
8.清除資源
要刪除目前部署環境中的所有Azure資源,請執行 azd down 並依照提示操作。
azd down
疑難排解
- Azure SQL Database 的入口部署檢視顯示衝突狀態
- 在Azure入口網站中,網頁應用程式的日誌串流介面顯示網路錯誤
-
瀏覽器中的 SSH 會話顯示
SSH CONN CLOSED -
入口網站記錄串流頁面顯示
Connected!,但沒有記錄
Azure SQL Database 的 portal 部署檢視顯示衝突狀態
根據你的訂閱和你選擇的地區,你可能會看到Azure SQL Database部署狀態為 Conflict,並在營運細節中顯示以下訊息:
Location '<region>' is not accepting creation of new Windows Azure SQL Database servers at this time.
此錯誤很可能是由所選區域的訂用帳戶限制所造成。 請嘗試為部署選擇不同的區域。
在 Azure 入口網站中,網頁應用程式的日誌串流介面顯示網路錯誤
您可能會看見此錯誤:
Unable to open a connection to your app. This may be due to any network security groups or IP restriction rules that you have placed on your app. To use log streaming, please make sure you are able to access your app directly from your current network.
這通常是應用程式第一次啟動時的暫時性錯誤。 請等候幾分鐘後再檢查一次。
瀏覽器中的 SSH 工作階段顯示 SSH CONN CLOSED
啟動 Linux 容器需要花幾分鐘的時間。 請等候幾分鐘後再檢查一次。
門戶日誌流頁面顯示 Connected!,但沒有日誌
設定診斷記錄之後,應用程式會重新啟動。 您可能需要重新整理頁面,變更才會在瀏覽器中生效。
常見問題集
- 這設定會產生多少費用?
- 我該如何用其他工具連接到被虛擬網路保護的Azure SQL Database伺服器?
- 本地應用程式開發如何與GitHub Actions進行?
- 我該如何在GitHub Actions部署期間除錯?
- 如何變更 SQL Database 連線以改用受控識別?
- 我沒有權限可建立使用者指派的身分識別
- 我可以用我的程式碼空間裡的GitHub Copilot做什麼?
這設定會產生多少費用?
建立資源的定價如下:
- App Service 方案是在基本層中建立,並可擴大或縮小。 請參閱 App Service 定價。
- Azure SQL Database 以通用無伺服器層級在標準系列硬體上建立,核心數量極少。 僅有少許成本,並可散發至其他區域。 您可以透過減少其最大尺寸來進一步降低成本,或通過調整服務層級、計算層級、硬體配置、核心數目、資料庫大小和區域備援來提升系統規模。 請參見Azure SQL Database價格。
- Azure Cache for Redis 在Basic層級建立,並且使用最小的快取大小。 與此層級相關的成本不高。 您可以擴大至較高的效能層級以取得高可用性、叢集和其他功能。 請參見Azure Cache for Redis價格。 欲了解更多資訊,請參閱 Azure Managed Redis 定價。
- 除非您設定額外的功能 (例如對等互連),否則虛擬網路不會產生費用。 請參見Azure Virtual Network價格。
- 私人 DNS 區域會產生少量費用。 請參見 Azure DNS 價格。
我要如何連接到那台由虛擬網路保護、並搭配其他工具保護的 Azure SQL Database 伺服器?
- 若要從命令列工具進行基本存取,您可以從應用程式的 SSH 終端機執行
sqlcmd。 應用程式的容器未隨附在sqlcmd中,因此您必須手動安裝。 請記住,應用程式重新啟動後,已安裝的用戶端不會保存。 - 若要從 SQL Server Management Studio 用戶端或 Visual Studio 連線,您的機器必須位於虛擬網路內。 例如,可能是連接到某個子網的Azure虛擬機,或是本地網路中與Azure虛擬網路有site-to-site-VPN連線的機器。
本地應用程式開發如何與 GitHub Actions 合作?
以 App Service 自動產生的工作流程檔案為例,每個 git push 都會開始執行新的組建和部署。 從 GitHub 儲存庫的本地複製品中,你進行所需的更新,然後推送到 GitHub。 例如:
git add .
git commit -m "<some-message>"
git push origin main
我該如何在 GitHub Actions 部署期間除錯?
如果自動產生的 GitHub 工作流程檔案中某步驟失敗,試著修改失敗的指令,讓輸出更詳細。 例如,您可透過新增 dotnet 選項以從任意 -v 命令取得更多輸出。 認可並推送您的變更以觸發 App Service 的其他部署。
我沒有權限可建立使用者指派的身分識別
如何變更 SQL Database 連線以改用受控識別?
Service Connector 管理 SQL 資料庫的預設connection string,名稱為 defaultConnector,並使用 SQL 認證。 若要將其取代為使用受控識別的連線,請在取代預留位置之後,在 Cloud Shell 中執行下列命令:
az extension add --name serviceconnector-passwordless --upgrade
az sql server update --enable-public-network true
az webapp connection delete sql --connection defaultConnector --resource-group <group-name> --name <app-name>
az webapp connection create sql --connection defaultConnector --resource-group <group-name> --name <app-name> --target-resource-group <group-name> --server <database-server-name> --database <database-name> --client-type dotnet --system-identity --config-connstr true
az sql server update --enable-public-network false
根據預設,命令 az webapp connection create sql --client-type dotnet --system-identity --config-connstr 會執行下列動作:
- 將使用者設定為 SQL 資料庫伺服器的 Microsoft Entra ID 管理員。
- 建立系統指派的受控識別,並向其授與資料庫存取權。
- 會產生名為
AZURE_SQL_CONNECTIONGSTRING的無密碼連接字串,而你的應用程式在教學結束時已經在使用此連接字串。
您的應用程式現在應該能夠連線到 SQL 資料庫。 欲了解更多資訊,請參閱 教學:使用受控身分識別從 App Service 無需密鑰連接到 Azure 資料庫。
秘訣
不想啟用公用網路連線? 如果您的訂用帳戶具有az sql server update --enable-public-network true角色指派,可以從與您虛擬網路整合的 Azure Cloud Shell 執行命令,以略過 。
為了讓該身份取得虛擬網路保護的資料庫存取權,az webapp connection create sql 需要直接與資料庫伺服器Entra ID認證連線。 預設情況下,Azure 雲端外殼沒有這種網路安全資料庫的存取權限。
我在我的程式碼空間裡可以用 GitHub Copilot 做些什麼?
你可能注意到,當你建立程式碼空間時,GitHub Copilot 聊天視窗已經存在了。 為了方便起見,我們在容器定義中包含了GitHub Copilot聊天擴充功能(參見 .devcontainer/devcontainer.json)。 不過,你需要一個GitHub Copilot帳號(提供30天免費試用)。
與 GitHub Copilot 交談時,給你幾個建議:
- 在單一聊天工作階段中,問題和答案相互關聯,您可以調整問題來微調取得的答案。
- 預設情況下,GitHub Copilot 無法存取你儲存庫中的任何檔案。 若要詢問檔案相關問題,請先在編輯器中開啟檔案。
- 為了讓GitHub Copilot在準備答案時能存取資料庫中的所有檔案,請以
@workspace開頭。 如需詳細資訊,請參閱Use the @workspace agent。 - 在聊天室裡,GitHub Copilot可以建議修改,甚至(用
@workspace)在哪裡修改,但不允許替你做修改。 您可以自行新增建議的變更並加以測試。
您可以述說以下一些其他內容來微調取得的答案:
- 我希望此程式碼只能在生產模式中執行。
- 我希望這段程式碼只在 Azure App Service 執行,而不是本地。
- --output-path 參數似乎不受支援。
相關內容
前進到下一個教學課程,了解如何使用自訂網域和憑證保護您的應用程式。
或者,查看其他資源: