快速入門:使用 Bicep 調整使用 azd Python Web 範本部署的服務
Python Web azd
範本可讓您快速建立新的 Web 應用程式,並將其部署至 Azure。 這些 azd
範本的設計目的是使用低成本的 Azure 服務選項。 毫無疑問,您會想要針對您案例範本中定義的每個服務調整服務層級(或 SKU)。
在本快速入門中,您將更新適當的 bicep 範本檔案,以相應增加現有的服務,並將新的服務新增至您的部署。 然後,您將執行 azd provision
命令,並檢視對 Azure 部署所做的變更。
必要條件
Azure 訂用帳戶 - 建立免費帳戶
您必須在本機電腦上安裝下列專案:
- Azure Developer CLI
- Docker Desktop
- Visual Studio Code
- 開發容器延伸模組
- Visual Studio Code Bicep 此延伸模組可協助您撰寫 Bicep 語法。
部署範本
若要開始,您需要工作 azd
部署。 準備就緒之後,您就可以修改範本所產生的 azd
Bicep 檔案。
請遵循快速入門文章中的步驟 1 到 7。 在步驟 2 中
azure-django-postgres-flexible-appservice
,使用範本。 為了方便起見,以下是從命令行發出的完整命令序列:mkdir azdtest cd azdtest azd init --template azure-django-postgres-flexible-appservice azd auth login azd up
完成後
azd up
,開啟 Azure 入口網站,流覽至新資源群組中部署的 Azure App 服務,並記下 App Service 定價方案(請參閱 App Service 方案的 [概觀] 頁面、[基本資訊] 區段、[定價方案] 值)。在快速入門文章的步驟 1 中,您已指示建立 azdtest 資料夾。 在 Visual Studio Code 中開啟該資料夾。
在 [總管] 窗格中,流覽至 infra 資料夾。 觀察 infra 資料夾中的子資料夾和檔案。
main.bicep 檔案會協調在執行
azd up
或azd provision
時部署的所有服務建立。 它會呼叫其他檔案,例如 db.bicep 和 web.bicep,進而呼叫 \core 子資料夾中所包含的檔案。\core 子資料夾是深層巢狀資料夾結構,其中包含許多 Azure 服務的 bicep 範本。 \core 子資料夾中的一些檔案是由三個最上層 bicep 檔案參考的(main.bicep、db.bicep 和 web.bicep),有些則完全不會在此專案中使用。
藉由修改服務的 Bicep 屬性來調整服務
您可以變更其 SKU,以調整部署中的現有資源。 為了示範這一點,您將將App Service 方案從「基本服務方案」變更為「基本服務方案」(專為流量需求較低且不需要進階自動調整和流量管理功能的應用程式所設計)變更為「標準服務方案」,其專為執行生產工作負載而設計。
注意
事實之後,並非所有 SKU 變更都可以進行。 某些研究可能需要進一步瞭解您的調整選項。
開啟 web.bicep 檔案並找出
appService
模組定義。 特別是,尋找屬性設定:sku: { name: 'B1' }
將 值從
B1
變更為S1
,如下所示:sku: { name: 'S1' }
重要
由於這項變更,每小時的價格會略有增加。 您可以在 App Service 定價頁面上找到不同服務方案及其相關成本的詳細數據。
假設您已在 Azure 中部署應用程式,請使用下列命令,在未重新部署應用程式程式碼本身的同時,將變更部署至基礎結構。
azd provision
您不應該提示您輸入位置和訂用帳戶。 這些值會儲存在 .azure<environment-name.env> 檔案中,其中
<environment-name>
是您在 期間azd init
提供的環境名稱。完成時
azd provision
,請確認您的 Web 應用程式仍可運作。 另請尋找資源群組的 App Service 方案,並確認定價方案已設定為標準服務方案 (S1)。
使用 Bicep 新增服務定義
您可以藉由對專案中的 Bicep 進行較大的變更,將新的資源新增至您的部署。 為了示範這一點,您會將 Azure Cache for Redis 的實例新增至現有的部署,以備妥您計劃在未來新增的虛構新功能。
重要
由於這項變更,您將支付 Azure Cache for Redis 實例的費用,直到您刪除 Azure 入口網站 中的資源或使用 azd down
。 您可以在 Azure Cache for Redis 定價頁面上找到不同服務方案及其相關成本的詳細數據。
在名為 redis.bicep 的 infra 資料夾中建立新檔案。 將下列程式代碼複製並貼到新的檔案中:
param name string param location string = resourceGroup().location param tags object = {} param keyVaultName string param connStrKeyName string param passwordKeyName string param primaryKeyKeyName string @allowed([ 'Enabled' 'Disabled' ]) param publicNetworkAccess string = 'Enabled' @allowed([ 'C' 'P' ]) param skuFamily string = 'C' @allowed([ 0 1 2 3 4 5 6 ]) param skuCapacity int = 1 @allowed([ 'Basic' 'Standard' 'Premium' ]) param skuName string = 'Standard' param saveKeysToVault bool = true resource redis 'Microsoft.Cache/redis@2020-12-01' = { name: name location: location properties: { sku: { capacity: skuCapacity family: skuFamily name: skuName } publicNetworkAccess: publicNetworkAccess enableNonSslPort: true } tags: tags } resource keyVault 'Microsoft.KeyVault/vaults@2022-07-01' existing = { name: keyVaultName } resource redisKey 'Microsoft.KeyVault/vaults/secrets@2022-07-01' = if (saveKeysToVault) { name: primaryKeyKeyName parent: keyVault properties: { value: redis.listKeys().primaryKey } } resource redisConnStr 'Microsoft.KeyVault/vaults/secrets@2018-02-14' = if (saveKeysToVault) { name: connStrKeyName parent: keyVault properties: { value: '${name}.redis.cache.windows.net,abortConnect=false,ssl=true,password=${redis.listKeys().primaryKey}' } } resource redisPassword 'Microsoft.KeyVault/vaults/secrets@2018-02-14' = if (saveKeysToVault) { name: passwordKeyName parent: keyVault properties: { value: redis.listKeys().primaryKey } } output REDIS_ID string = redis.id output REDIS_HOST string = redis.properties.hostName
修改 main.bicep 檔案,以建立 “redis” 資源的實例。
在 main.bicep 檔案中,將下列程式代碼新增至與 Web 前端區段和秘密區段上方相關聯的結尾大括弧下方。
// Caching server module redis 'redis.bicep' = { name: 'redis' scope: resourceGroup params: { name: replace('${take(prefix, 19)}-rds', '--', '-') location: location tags: tags keyVaultName: keyVault.outputs.name connStrKeyName: 'RedisConnectionString' passwordKeyName: 'RedisPassword' primaryKeyKeyName: 'RedisPrimaryKey' publicNetworkAccess: 'Enabled' skuFamily: 'C' skuCapacity: 1 skuName: 'Standard' saveKeysToVault: true } }
將輸出值新增至檔案底部:
output REDIS_ID string = redis.outputs.REDIS_ID output REDIS_HOST string = redis.outputs.REDIS_HOST
確認整個 main.bicep 檔案與下列程式代碼相同:
targetScope = 'subscription' @minLength(1) @maxLength(64) @description('Name which is used to generate a short unique hash for each resource') param name string @minLength(1) @description('Primary location for all resources') param location string @secure() @description('DBServer administrator password') param dbserverPassword string @secure() @description('Secret Key') param secretKey string @description('Id of the user or app to assign application roles') param principalId string = '' var resourceToken = toLower(uniqueString(subscription().id, name, location)) var prefix = '${name}-${resourceToken}' var tags = { 'azd-env-name': name } resource resourceGroup 'Microsoft.Resources/resourceGroups@2021-04-01' = { name: '${name}-rg' location: location tags: tags } // Store secrets in a keyvault module keyVault './core/security/keyvault.bicep' = { name: 'keyvault' scope: resourceGroup params: { name: '${take(replace(prefix, '-', ''), 17)}-vault' location: location tags: tags principalId: principalId } } module db 'db.bicep' = { name: 'db' scope: resourceGroup params: { name: 'dbserver' location: location tags: tags prefix: prefix dbserverDatabaseName: 'relecloud' dbserverPassword: dbserverPassword } } // Monitor application with Azure Monitor module monitoring 'core/monitor/monitoring.bicep' = { name: 'monitoring' scope: resourceGroup params: { location: location tags: tags applicationInsightsDashboardName: '${prefix}-appinsights-dashboard' applicationInsightsName: '${prefix}-appinsights' logAnalyticsName: '${take(prefix, 50)}-loganalytics' // Max 63 chars } } // Web frontend module web 'web.bicep' = { name: 'web' scope: resourceGroup params: { name: replace('${take(prefix, 19)}-appsvc', '--', '-') location: location tags: tags applicationInsightsName: monitoring.outputs.applicationInsightsName keyVaultName: keyVault.outputs.name appCommandLine: 'entrypoint.sh' pythonVersion: '3.12' dbserverDomainName: db.outputs.dbserverDomainName dbserverUser: db.outputs.dbserverUser dbserverDatabaseName: db.outputs.dbserverDatabaseName } } // Caching server module redis 'redis.bicep' = { name: 'redis' scope: resourceGroup params: { name: replace('${take(prefix, 19)}-rds', '--', '-') location: location tags: tags keyVaultName: keyVault.outputs.name connStrKeyName: 'RedisConnectionString' passwordKeyName: 'RedisPassword' primaryKeyKeyName: 'RedisPrimaryKey' publicNetworkAccess: 'Enabled' skuFamily: 'C' skuCapacity: 1 skuName: 'Standard' saveKeysToVault: true } } var secrets = [ { name: 'DBSERVERPASSWORD' value: dbserverPassword } { name: 'SECRETKEY' value: secretKey } ] @batchSize(1) module keyVaultSecrets './core/security/keyvault-secret.bicep' = [for secret in secrets: { name: 'keyvault-secret-${secret.name}' scope: resourceGroup params: { keyVaultName: keyVault.outputs.name name: secret.name secretValue: secret.value } }] output AZURE_LOCATION string = location output AZURE_KEY_VAULT_ENDPOINT string = keyVault.outputs.endpoint output AZURE_KEY_VAULT_NAME string = keyVault.outputs.name output APPLICATIONINSIGHTS_NAME string = monitoring.outputs.applicationInsightsName output BACKEND_URI string = web.outputs.uri output REDIS_ID string = redis.outputs.REDIS_ID output REDIS_HOST string = redis.outputs.REDIS_HOST
請確定已儲存所有變更,然後使用下列命令來更新 Azure 上已布建的資源:
azd provision
注意
根據許多因素,將 Azure Cache for Redis 的實例新增至現有的部署可能需要很長的時間。 在測試中,我們經歷了超過 20 分鐘的運行時間。 只要您未看到任何錯誤,請允許程式繼續執行,直到完成為止。
完成時
azd provision
,請開啟 Azure 入口網站,流覽至部署的資源群組,然後在服務清單中確認您現在有 Azure Cache for Redis 的實例。
本快速入門總結為快速入門,不過有許多 Azure 服務可協助您建置更具延展性和生產環境就緒的應用程式。 一個絕佳的起點是瞭解 Azure API 管理、Azure Front Door、Azure CDN 和 Azure 虛擬網絡 等等。
清除資源
執行 azd down 命令,以清除範本所建立的資源。
azd down
此命令 azd down
會刪除 Azure 資源和 GitHub Actions 工作流程。 出現提示時,同意刪除與資源群組相關聯的所有資源。
您也可以刪除 azdtest 資料夾,或藉由修改專案的檔案作為您自己的應用程式基礎。
相關內容
- 深入瞭解 Python Web
azd
範本 - 深入瞭解
azd
命令。 - 了解專案中每個資料夾和檔案的用途,以及 您可以編輯或刪除哪些專案?
- 更新 Bicep 範本以新增或移除 Azure 服務。 不知道 Bicep 嗎? 嘗試此 學習路徑:Bicep 的基本概念
- 用來
azd
設定 GitHub Actions CI/CD 管線,以在合併至主要分支時重新部署 - 設定監視,讓您可以使用 Azure 開發人員 CLI 監視您的應用程式