教學課程:將 ASP.NET Core 和 Azure SQL Database 應用程式部署至 Azure App Service 中
在本教學課程中,您會了解如何將資料驅動的 ASP.NET Core 應用程式部署至 Azure App Service,並連線至 Azure SQL Database。 您也將部署 Azure Cache for Redis 以在應用程式中啟用快取程式碼。 Azure App Service 是高度可調整、自我修補的 Web 裝載服務,可輕鬆在 Windows 或 Linux 上部署應用程式。 雖然本教學課程使用 ASP.NET Core 8.0 應用程式,但流程與其他版本的 ASP.NET Core 相同。
在本教學課程中,您會了解如何:
- 建立預設安全的 App Service、SQL Database 和 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 Developer 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.執行範例
首先,您會將範例資料驅動的應用程式設定為起點。 為了方便起見,範例存放庫 (英文) 包含開發容器 (英文) 設定。 開發容器具有開發應用程式所需的全部內容,包括資料庫、快取,以及範例應用程式所需的所有環境變數。 開發容器可以在 GitHub codespace 中執行,這表示您可以在任何電腦上使用網頁瀏覽器執行範例。
第 1 步:在新的瀏覽器視窗中:
- 登入您的 GitHub 帳戶。
- 瀏覽至 https://github.com/Azure-Samples/msdocs-app-service-sqldb-dotnetcore/fork。
- 取消選取 [僅複製主分支]。 您需要所有分支。
- 選取 [建立派生]。
步驟 2:在 GitHub 分支中:
- 為起始分支選取 [主分支]> [starter-no-infra]。 此分支只包含範例專案,沒有與 Azure 相關的檔案或設定。
- 選取 [程式碼] > [在 starter-no-infra 上建立 codespace]。 設定 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 快取。 針對建立程序,您將指定:
- Web 應用程式的 [名稱]。 其會以
https://<app-name>-<hash>.<region>.azurewebsites.net
的形式作為您應用程式 DNS 名稱的一部分來使用。 - 要實際執行應用程式的區域。 其也會作為您應用程式的 DNS 名稱的一部分來使用。
- 應用程式的執行階段堆疊。 您可以在此處選取要用於應用程式的 .NET 版本。
- 應用程式的主控方案。 這是定價層,其中包含應用程式的一組功能和調整限度。
- 應用程式的 [資源群組]。 資源群組允許您將應用程式所需的所有 Azure 資源分組 (在邏輯容器中)。
登入 Azure 入口網站,遵循下列步驟建立您的 Azure App Service 資源。
步驟 1:在 Azure 入口網站中:
- 在 Azure 入口網站頂端的搜尋列中輸入「Web 應用程式資料庫」。
- 選取 [Marketplace] 標題下標示為 [Web 應用程式 + 資料庫] 的項目。 您也可以直接瀏覽至建立精靈。
步驟 2:在 [建立 Web 應用程式 + 資料庫] 頁面上,填寫表單,如下所示。
- [資源群組]:選取 [新建] 並使用 msdocs-core-sql-tutorial 的名稱。
- [區域]:您附近的任何 Azure 區域。
- [名稱]:msdocs-core-sql-XYZ,其中 XYZ 是任意三個隨機字元。 此名稱在整個 Azure 中必須是唯一的。
- [執行階段堆疊]:.NET 8 (LTS)。
- 引擎:SQLAzure。 Azure SQL Database 是完全受控的平台即服務 (PaaS) 資料庫引擎,一律會在最新穩定版本的 SQL Server 上執行。
- [新增 Azure Cache for Redis?]:[是]。
- [主控方案]:[基本]。 當一切就緒時,您可以擴大至生產定價層。
- 選取 [檢閱 + 建立]。
- 驗證完成時,選取 [建立]。
步驟 3:部署需要數分鐘的時間才能完成。 在部署完成時,選取 [前往資源] 按鈕。 系統會將您直接帶至 App Service 應用程式,但會建立下列資源:
- 資源群組:所有已建立資源的容器。
- App Service 方案:定義 App Service 的計算資源。 系統會建立基本層中的 Linux 方案。
- App Service:代表您的應用程式,並在 App Service 方案中執行。
- 虛擬網路:與 App Service 應用程式整合,並隔離後端網路流量。
- 私人端點:虛擬網路中的金鑰保存庫、資料庫伺服器和 Redis 快取的存取端點。
- 網路介面:代表私人 IP 位址,每個私人端點各有一個位址。
- Azure SQL Database 伺服器:僅可從其私人端點後端存取。
- Azure SQL Database:系統上為您建立的資料庫和使用者。
- Azure Cache for Redis:只能從其私人端點後方存取。
- 金鑰保存庫:只能從其私人端點後方存取。 用於管理 App Service 應用程式的秘密。
- 私人 DNS 區域:啟用虛擬網路中的金鑰保存庫、資料庫伺服器和 Redis 快取的 DNS 解析。
3.安全連線秘密
建立精靈已為您產生連線字串作為 .NET 連接字串和應用程式設定。 不過,安全性最佳做法是將祕密完全從 App Service 中移出。 您將利用服務連接器將您的祕密移至金鑰保存庫,並將您的應用程式設定變更為 Key Vault 參考。
提示
若要使用無密碼驗證,請參閱如何變更 SQL Database 連線以改用受控識別?
步驟 1:在 [App Service] 頁面中:
- 在左側功能表中,選取 [設定] > [環境變數] > [連接字串]。
- 選取 [AZURE_SQL_CONNECTIONSTRING]。
- 在 [新增/編輯連接字串] 的 [值] 欄位中,尋找位於字串結尾的 Password= 部分。
- 複製 Password= 後面的密碼字串,以供後續使用。 此連接字串可讓您連線至私人端點後方受保護的 SQL 資料庫。 密碼會直接儲存在 App Service 應用程式中,而這並非最佳方式。 同樣地,[應用程式設定] 索引標籤中的 Redis 快取連接字串會包含秘密。 您要變更此設定。
步驟 2:建立金鑰保存庫,以安全地管理秘密。
- 在頂端搜尋列中,輸入 "key vault",然後選取 [Marketplace] > [Key Vault]。
- 在 [資源群組] 中,選取 [msdocs-core-sql-tutorial]。
- 在 [金鑰保存庫名稱] 中,輸入只包含字母和數字的名稱。
- 在 [區域] 中,將它設定為作為資源群組的範例位置。
步驟 3:
- 選取 [網路] 索引標籤。
- 取消選取 [啟用公用存取]。
- 選取 [建立私人端點]。
- 在 [資源群組] 中,選取 [msdocs-core-sql-tutorial]。
- 在 [金鑰保存庫名稱] 中,輸入只包含字母和數字的名稱。
- 在 [區域] 中,將它設定為作為資源群組的範例位置。
- 在對話方塊的 [位置] 中,選取與 App Service 應用程式相同的位置。
- 在 [資源群組] 中,選取 [msdocs-core-sql-tutorial]。
- 在 [名稱] 中,輸入 msdocs-core-sql-XYZVvaultEndpoint。
- 在 [虛擬網路] 中,選取 [msdocs-core-sql-XYZVnet]。
- 在 [子網路] 中,輸入 msdocs-core-sql-XYZSubnet。
- 選取 [確定]。
- 選取 [檢閱 + 建立],然後選取 [建立]。 等候金鑰保存庫部署完成。 您應該會看到「您的部署已完成」。
步驟 4:
- 在頂端搜尋列中輸入 msdocs-core-sql,然後輸入名為 msdocs-core-sql-XYZ 的 App Service 資源。
- 在 App Service 頁面的左側功能表中,選取 [設定 > 服務連接器]。 已有兩個連接器,這是「應用程式建立精靈」為您建立的。
- 選取 SQL Database 連接器旁的核取方塊,然後選取 [編輯]。
- 選取 [驗證] 索引標籤。
- 在 [密碼] 中,貼上您先前複製的密碼。
- 選取 [在 Key Vault 中儲存秘密]。
- 在 [金鑰保存庫連線] 底下,選取 [新建]。 [建立連線] 對話方塊會在編輯對話方塊的頂端開啟。
步驟 5:在 Key Vault 連線的 [建立連線] 對話方塊中:
- 在 Key Vault 中:選取您稍早建立的金鑰保存庫。
- 選取 [檢閱 + 建立] 。 您應該會看到 [系統指派的受控識別] 設定為 [已選取]。
- 驗證完成時,選取 [建立]。
步驟 6:您會回到 defaultConnector 的編輯對話方塊中。
- 在 [驗證] 索引標籤中,等候建立金鑰保存庫連接器。 完成時,[Key Vault 連線] 下拉式清單會自動加以選取。
- 選取 [下一步:網路]。
- 選取 [設定防火牆規則以啟用對目標服務的存取權]。 應用程式建立精靈已使用私人端點保護 SQL 資料庫。
- 選取 [儲存]。 等到 [更新成功] 通知出現為止。
步驟 7:在 [服務連接器] 頁面中:
- 選取 Cache for Redis 連接器旁的核取方塊,然後選取 [編輯]。
- 選取 [驗證] 索引標籤。
- 選取 [在 Key Vault 中儲存秘密]。
- 在 [Key Vault 連線] 底下,選取您建立的金鑰保存庫。
- 選取 [下一步:網路]。
- 選取 [設定防火牆規則以啟用對目標服務的存取權]。 應用程式建立精靈已使用私人端點保護 SQL 資料庫。
- 選取 [儲存]。 等到 [更新成功] 通知出現為止。
步驟 8:確認您的變更:
- 在左側功能表中,再次選取 [環境變數] > [連接字串]。
- 在 AZURE_SQL_CONNECTIONSTRING 旁,選取 [顯示值]。 該值應該是
@Microsoft.KeyVault(...)
,這表示它是金鑰保存庫參考,因為現在已在金鑰保存庫中管理秘密。 - 若要確認 Redis 連接字串,請選取 [應用程式設定] 索引標籤。在 AZURE_REDIS_CONNECTIONSTRING 旁,選取 [顯示值]。 其值也應該是
@Microsoft.KeyVault(...)
。
4.部署範例程式碼
在此步驟中,請使用 GitHub Actions 來設定 GitHub 部署。 這只是部署至 App Service 的許多方式之一,但也是在部署程序中持續整合的絕佳方式。 根據預設,每次對您的 GitHub 存放庫執行 git push
都會開始建置和部署動作。
步驟 1:在左側功能表中選取 [部署] > [部署中心]。
步驟 2:在 [部署中心] 頁面中:
- 在 [來源] 中,選取 [GitHub]。 根據預設,系統會選取 GitHub Actions 作為組建提供者。
- 登入您的 GitHub 帳戶,並遵循提示來授權 Azure。
- 在 [組織] 中,選取您的帳戶。
- 在 [存放庫] 中,選取 msdocs-app-service-sqldb-dotnetcore。
- 在 [分支] 中,選取 [starter-no-infra]。 這是您搭配應用程式範例使用的相同分支,未包含任何 Azure 相關檔案或設定。
- 對於 [驗證類型],選取 [使用者指派的身分識別]。
- 在最上層的功能表中,選取 [儲存]。
App Service 會將工作流程檔案認可至
.github/workflows
目錄中選擇的 GitHub 存放庫。 根據預設,部署中心會為工作流程建立使用者指派的身分識別,以使用 Microsoft Entra 進行驗證 (OIDC 驗證)。 如需替代驗證選項,請參閱使用 GitHub Actions 部署至 App Service。
步驟 3:回到範例分支的 GitHub codespace 中,執行 git pull origin starter-no-infra
。
這會將新認可的工作流程檔案提取到您的 Codespace。
步驟 4 (選項 1:使用 GitHub Copilot):
- 選取 [聊天] 檢視,然後選取 +,即可啟動新的聊天工作階段。
- 問:「@workspace 應用程式如何連線至資料庫和快取?」Copilot 可能會提供有關
MyDatabaseContext
類別以及如何在 Program.cs 中進行設定的一些說明。 - 問:「在生產模式中,我希望應用程式對資料庫使用稱為 AZURE_SQL_CONNECTIONSTRING 的連接字串,並使用稱為 AZURE_REDIS_CONNECTIONSTRING* 的應用程式設定。」Copilot 可能會提供與下列選項 2:不使用 GitHub Copilot 步驟中的程式碼建議類似的程式碼建議,甚至告訴您在 Program.cs 檔案中進行變更。
- 在總管中開啟 Program.cs,然後新增程式碼建議。 GitHub Copilot 不會每次都提供相同的回應,而且這些回應不一定正確。 您可能需要詢問更多問題,以微調其回應。 如需提示,請參閱我可以在 Codespace 中使用 GitHub Copilot 執行哪些作業?。
步驟 4 (選項 2:不使用 GitHub Copilot):
- 在總管中開啟 Program.cs。
- 尋找已註解的程式碼 (第 12-21 行),並將其取消註解。
此程式碼會使用
AZURE_SQL_CONNECTIONSTRING
連線到資料庫,並使用應用程式設定AZURE_REDIS_CONNECTIONSTRING
連線到 Redis 快取。
步驟 5 (選項 1:使用 GitHub Copilot):
- 在總管中開啟 .github/workflows/starter-no-infra_msdocs-core-sql-XYZ。 此檔案是由 App Service 建立精靈所建立。
- 醒目提示
dotnet publish
步驟,然後選取 。 - 要求 Copilot:「安裝 dotnet ef,然後在相同的輸出資料夾中建立移轉套件組合。」
- 如果此建議是可接受的,請選取 [接受]。 GitHub Copilot 不會每次都提供相同的回應,而且這些回應不一定正確。 您可能需要詢問更多問題,以微調其回應。 如需提示,請參閱我可以在 Codespace 中使用 GitHub Copilot 執行哪些作業?。
步驟 5 (選項 2:不使用 GitHub Copilot):
- 在總管中開啟 .github/workflows/starter-no-infra_msdocs-core-sql-XYZ。 此檔案已由 App Service建立精靈建立。
- 在
dotnet publish
步驟下,新增步驟以使用命令dotnet tool install -g dotnet-ef --version 8.*
安裝 Entity Framework Core 工具。 - 在新步驟下,新增其他步驟以在部署套件中產生資料庫移轉套件組合:
dotnet ef migrations bundle --runtime linux-x64 -o ${{env.DOTNET_ROOT}}/myapp/migrationsbundle
。 移轉套件組合是獨立式可執行檔,您可在實際執行環境中執行,而不需要 .NET SDK。 App Service Linux 容器只有 .NET 執行階段,而不是 .NET SDK。
步驟 6:
- 選取 [原始檔控制] 延伸模組。
- 在文字方塊中,輸入提交訊息,例如
Configure Azure database and cache connections
。 或者,選取 並讓 GitHub Copilot 為您產生認可訊息。 - 選取 [認可],然後使用 [是] 來確認。
- 選取 [同步變更 1],然後使用 [確定] 來確認。
步驟 7:返回 Azure 入口網站的 [部署中心] 頁面:
- 選取 [記錄] 索引標籤,然後選取 [重新整理] 以查看新的部署執行。
- 在部署執行的記錄項目中,選取最新時間戳記的 [建置/部署記錄] 項目。
步驟 8:您會前往 GitHub 存放庫,並看到 GitHub 動作正在執行。 工作流程檔案會定義兩個不同的階段:建置和部署。 等候 GitHub 執行直到顯示 [成功] 狀態。 需要約 5 分鐘的時間。
5.產生資料庫結構
透過受虛擬網路保護的 SQL Database,執行 dotnet 資料庫移轉最簡單的方式是在 App Service 容器的 SSH 工作階段中進行。
步驟 1:回到 [App Service] 頁面上的左側功能表,選取 [部署工具] > [SSH],然後選取 [Go]。
步驟 2:在 SSH 終端機中:
- 執行
cd /home/site/wwwroot
。 此處是所有已部署的檔案。 - 使用
./migrationsbundle -- --environment Production
命令執行 GitHub 工作流程產生的移轉套件組合。 如果成功,App Service 已成功連線至 SQL Database。 請記住,--environment Production
對應於您在 Program.cs 中所做的程式碼變更。
在 SSH 工作階段中,只有 /home
中檔案的變更才能在應用程式重新啟動之後保存。 /home
以外的變更不會保存。
有問題嗎? 查看疑難排解區段。
6.瀏覽至應用程式
步驟 1:在 [App Service] 頁面中:
- 從左側功能表中選取 [概觀]。
- 選取應用程式的 URL。
第 2 步:將幾項工作新增至清單。 恭喜,您正在 Azure App Service 中執行資料驅動的安全 ASP.NET Core 應用程式。
提示
應用程式範例會實作另行快取模式。 當您第二次訪問資料檢視,或在進行資料變更後重新載入相同頁面時,網頁處理時間顯示的時間會較快,因為這是從快取載入資料而不是從資料庫載入。
7.資料流診斷記錄
Azure App Service 會擷取所有登入到主控台的訊息,以協助您診斷應用程式的問題。 樣本應用程式在其每個端點中輸出主控台記錄訊息,以展示此功能。
第 1 步:在 [App Service] 頁面中:
- 從左側功能表中,選取 [監視] > [App Service 記錄]。
- 在 [應用程式記錄] 底下,選取 [檔案系統],然後選取 [儲存]。
步驟 2:從左側功能表中,選取 [記錄串流]。 您會看到應用程式的記錄,包括平台記錄和來自容器內的記錄。
8.清除資源
完成後,您可以刪除資源群組,以從 Azure 訂用帳戶中刪除所有資源。
步驟 1:在 Azure 入口網站頂端的搜尋列中:
- 輸入資源群組名稱。
- 選取資源群組。
步驟 2:在資源群組頁面中,選取 [刪除資源群組]。
步驟 3:
- 輸入您確認要刪除的資源群組名稱。
- 選取 [刪除]。
2.建立 Azure 資源並部署應用程式範例
在此步驟中,您會建立 Azure 資源,並將範例應用程式部署至 Linux 上的 App Service。 本教學課程中使用的步驟會建立一組預設安全資源,其中包含 App Service、Azure SQL Database 和 Azure Cache for Redis。
開發容器已具備 Azure Developer CLI (AZD)。
從存放庫根路徑中執行
azd init
。azd init --template dotnet-app-service-sqldb-infra
出現提示時,請提供下列答案:
問題 回答 目前的目錄不是空的。 您是否要在「<您的目錄>」初始化專案? Y 您要對這些檔案執行什麼動作? 維持現有的檔案不變 輸入新的環境名稱 輸入唯一名稱。 AZD 範本會使用此名稱作為 Azure 中 Web 應用程式的 DNS 名稱一部分 ( <app-name>-<hash>.azurewebsites.net
)。 允許英數字元與連字號。執行
azd auth login
命令並遵循提示來登入 Azure:azd auth login
使用
azd up
命令建立必要的 Azure 資源,並部署應用程式程式碼。 請遵循提示選取 Azure 資源所需的訂用帳戶和位置。azd up
azd up
命令需要大約 15 分鐘才能完成 (時間多半用在 Redis 快取上)。 這也會編譯及部署您的應用程式程序代碼,但稍後會修改程序代碼以使用 App Service。 執行時,命令會提供佈建和部署程式的相關資訊,包括 Azure 中部署的連結。 完成時,命令也會顯示部署應用程式的連結。此 AZD 範本包含使用下列 Azure 資源產生預設安全架構的檔案 (azure.yaml 和 infra 目錄):
- 資源群組:所有已建立資源的容器。
- App Service 方案:定義 App Service 的計算資源。 系統會建立基本層中的 Linux 方案。
- App Service:代表您的應用程式,並在 App Service 方案中執行。
- 虛擬網路:與 App Service 應用程式整合,並隔離後端網路流量。
- 私人端點:虛擬網路中的金鑰保存庫、資料庫伺服器和 Redis 快取的存取端點。
- 網路介面:代表私人 IP 位址,每個私人端點各有一個位址。
- Azure SQL Database 伺服器:僅可從其私人端點後端存取。
- Azure SQL Database:系統上為您建立的資料庫和使用者。
- Azure Cache for Redis:只能從其私人端點後方存取。
- 金鑰保存庫:只能從其私人端點後方存取。 用於管理 App Service 應用程式的秘密。
- 私人 DNS 區域:啟用虛擬網路中的金鑰保存庫、資料庫伺服器和 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_SCOPE
AZURE_SQL_CONNECTIONSTRING
包含 Azure 中 SQL Database 的連接字串,AZURE_REDIS_CONNECTIONSTRING
則包含 Azure Redis 快取的連接字串。 您稍後必須在程式碼中使用這些連接字串。為了方便起見,AZD 範本會顯示應用程式的應用程式設定頁面直接連結。 尋找該連結,並在新的瀏覽器索引標籤中開啟該連結。
有問題嗎? 查看疑難排解區段。
4.修改範例程式碼並重新部署
在 GitHub codespace 中,選取 [聊天] 檢視,然後選取 + 以啟動新的聊天工作階段。
問:「@workspace 應用程式如何連線至資料庫和快取?」Copilot 可能會提供有關
MyDatabaseContext
類別以及如何在 Program.cs 中進行設定的一些說明。問:「在生產模式中,我希望應用程式對資料庫使用稱為 AZURE_SQL_CONNECTIONSTRING 的連接字串,並使用稱為 AZURE_REDIS_CONNECTIONSTRING* 的應用程式設定。」Copilot 可能會提供與下列選項 2:不使用 GitHub Copilot 步驟中的程式碼建議類似的程式碼建議,甚至告訴您在 Program.cs 檔案中進行變更。
在總管中開啟 Program.cs,然後新增程式碼建議。
GitHub Copilot 不會每次都提供相同的回應,而且這些回應不一定正確。 您可能需要詢問更多問題,以微調其回應。 如需提示,請參閱我可以在 Codespace 中使用 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,並在瀏覽器中導覽至目標。 輸出中看起來像這樣:
Open SSH session to App Service container at: https://<app-name>-<hash>.scm.azurewebsites.net/webssh/host
在 SSH 終端機中執行下列命令:
cd /home/site/wwwroot ./migrationsbundle -- --environment Production
如果成功,App Service 已成功連線至資料庫。 請記住,
--environment Production
對應於您在 Program.cs 中所做的程式碼變更。
在 SSH 工作階段中,只有 /home
中檔案的變更才能在應用程式重新啟動之後保存。 /home
以外的變更不會保存。
有問題嗎? 查看疑難排解區段。
6.瀏覽至應用程式
在 AZD 輸出中,尋找您應用程式的 URL,並在瀏覽器中瀏覽至目標。 AZD 輸出中 URL 看起來像這樣:
Deploying services (azd deploy) (✓) Done: Deploying service web - Endpoint: https://<app-name>-<hash>.azurewebsites.net/
將幾項工作新增至清單。
恭喜,您正在 Azure App Service 中執行 Web 應用程式,並安全地連線至 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: https://portal.azure.com/#@/resource/subscriptions/<subscription-guid>/resourceGroups/<group-name>/providers/Microsoft.Web/sites/<app-name>/logStream
在啟用適用於 .NET、Node.js、Python 和 Java 應用程式的 Azure 監視器 OpenTelemetry 系列中深入了解 .NET 應用程式中的記錄。
有問題嗎? 查看疑難排解區段。
8.清除資源
若要刪除目前部署環境中的所有 Azure 資源,請執行 azd down
並遵循提示。
azd down
疑難排解
- Azure SQL Database 的入口網站部署檢視顯示衝突狀態
- 在 Azure 入口網站中,Web 應用程式的記錄串流 UI 顯示網路錯誤
- 瀏覽器中的 SSH 工作階段顯示
SSH CONN CLOSED
- 入口網站記錄串流頁面顯示
Connected!
,但沒有記錄
Azure SQL Database 的入口網站部署檢視顯示衝突狀態
根據所選取的訂用帳戶和區域,您可能會看到 Azure SQL Database 的部署狀態為 Conflict
,且作業詳細資料中顯示下列訊息:
Location '<region>' is not accepting creation of new Windows Azure SQL Database servers at this time.
此錯誤很可能是由所選區域的訂用帳戶限制所造成。 請嘗試為部署選擇不同的區域。
在 Azure 入口網站中,Web 應用程式的記錄串流 UI 顯示網路錯誤
您可能會看見此錯誤:
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 連線以改用受控識別?
- 我沒有權限可建立使用者指派的身分識別
- 我可以在 Codespace 中使用 GitHub Copilot 執行哪些作業?
這設定會產生多少費用?
建立資源的定價如下:
- App Service 方案是在基本層中建立,並可擴大或縮小。 請參閱 App Service 定價。
- Azure SQL Database 是以最低核心標準系列硬體的一般用途無伺服器層級建立。 僅有少許成本,並可散發至其他區域。 您可透過減少其大小上限以將成本降至最低,或者也可透過調整服務層級、計算層級、硬體設定、核心數目、資料庫大小和區域備援來相應增加成本。 請參閱 Azure SQL Database 定價。
- Azure Cache for Redis 是以最低快取大小的基本層級建立。 與此層級相關的成本不高。 您可以擴大至較高的效能層級以取得高可用性、叢集和其他功能。 請參閱 Azure Cache for Redis 定價。
- 除非您設定額外的功能 (例如對等互連),否則虛擬網路不會產生費用。 請參閱 Azure 虛擬網路定價。
- 私人 DNS 區域會產生少量費用。 請參閱 Azure DNS 定價。
如何使用其他工具連線到虛擬網路後方受保護的 Azure SQL Database 伺服器?
- 若要從命令列工具進行基本存取,您可以從應用程式的 SSH 終端機執行
sqlcmd
。 應用程式的容器未隨附在sqlcmd
中,因此您必須手動安裝。 請記住,應用程式重新啟動後,已安裝的用戶端不會保存。 - 若要從 SQL Server Management Studio 用戶端或 Visual Studio 連線,您的機器必須位於虛擬網路內。 例如,該電腦可以是連線到其中一個子網路的 Azure VM,或內部部署網路中具有與 Azure 虛擬網路站對站 VPN 連線的電腦。
本機應用程式開發如何與 GitHub Actions 搭配運作?
以 App Service 自動產生的工作流程檔案為例,每個 git push
都會開始執行新的組建和部署。 從 GitHub 存放庫的本機複本,您會將所需的更新推送至 GitHub。 例如:
git add .
git commit -m "<some-message>"
git push origin main
如何在 GitHub Actions 部署期間偵測錯誤?
如果自動產生 GitHub 工作流程檔案的步驟失敗,請嘗試修改失敗的命令以產生更多詳細資訊輸出。 例如,您可透過新增 -v
選項以從任意 dotnet
命令取得更多輸出。 認可並推送您的變更以觸發 App Service 的其他部署。
我沒有權限可建立使用者指派的身分識別
請參閱透過部署中心設定 GitHub Actions 部署。
如何變更 SQL Database 連線以改用受控識別?
SQL 資料庫的預設連接字串由服務連接器管理,名稱為 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 資料庫。
提示
不想啟用公用網路連線? 如果訂用帳戶上具有擁有者角色指派,您可以從與虛擬網路整合的 Azure Cloud Shell 中執行命令來略過 az sql server update --enable-public-network true
。
若要向身分識別授與虛擬網路所保護資料庫的必要存取權,az webapp connection create sql
則需要使用 Entra ID 驗證直接連線到資料庫伺服器。 根據預設,Azure Cloud Shell 無法存取網路保護的資料庫。
我可以在 Codespace 中使用 GitHub Copilot 執行哪些作業?
您可能已經注意到建立 Codespace 時,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 參數似乎不受支援。
相關內容
前進到下一個教學課程,了解如何使用自訂網域和憑證保護您的應用程式。
或者,查看其他資源: