共用方式為


快速入門:使用 Bicep 調整使用 azd Python Web 範本部署的服務

Python Web azd 範本可讓您快速建立新的 Web 應用程式,並將其部署至 Azure。 這些 azd 範本的設計目的是使用低成本的 Azure 服務選項。 毫無疑問,您會想要針對您案例範本中定義的每個服務調整服務層級(或 SKU)。

在本快速入門中,您將更新適當的 bicep 範本檔案,以相應增加現有的服務,並將新的服務新增至您的部署。 然後,您將執行 azd provision 命令,並檢視對 Azure 部署所做的變更。

必要條件

Azure 訂用帳戶 - 建立免費帳戶

您必須在本機電腦上安裝下列專案:

部署範本

若要開始,您需要工作 azd 部署。 準備就緒之後,您就可以修改範本所產生的 azd Bicep 檔案。

  1. 請遵循快速入門文章中的步驟 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 方案的 [概觀] 頁面、[基本資訊] 區段、[定價方案] 值)。

  2. 在快速入門文章的步驟 1 中,您已指示建立 azdtest 資料夾。 在 Visual Studio Code 中開啟該資料夾。

  3. 在 [總管] 窗格中,流覽至 infra 資料夾。 觀察 infra 資料夾中的子資料夾和檔案。

    main.bicep 檔案會協調在執行 azd upazd provision時部署的所有服務建立。 它會呼叫其他檔案,例如 db.bicep 和 web.bicep,進而呼叫 \core 子資料夾中所包含的檔案。

    \core 子資料夾是深層巢狀資料夾結構,其中包含許多 Azure 服務的 bicep 範本。 \core 子資料夾中的一些檔案是由三個最上層 bicep 檔案參考的(main.bicep、db.bicepweb.bicep),有些則完全不會在此專案中使用。

藉由修改服務的 Bicep 屬性來調整服務

您可以變更其 SKU,以調整部署中的現有資源。 為了示範這一點,您將將App Service 方案從「基本服務方案」變更為「基本服務方案」(專為流量需求較低且不需要進階自動調整和流量管理功能的應用程式所設計)變更為「標準服務方案」,其專為執行生產工作負載而設計。

注意

事實之後,並非所有 SKU 變更都可以進行。 某些研究可能需要進一步瞭解您的調整選項。

  1. 開啟 web.bicep 檔案並找出appService模組定義。 特別是,尋找屬性設定:

       sku: {
          name: 'B1'
       }
    

    將 值從 B1 變更為 S1 ,如下所示:

       sku: {
          name: 'S1'
       }
    

    重要

    由於這項變更,每小時的價格會略有增加。 您可以在 App Service 定價頁面上找到不同服務方案及其相關成本的詳細數據。

  2. 假設您已在 Azure 中部署應用程式,請使用下列命令,在未重新部署應用程式程式碼本身的同時,將變更部署至基礎結構。

    azd provision
    

    您不應該提示您輸入位置和訂用帳戶。 這些值會儲存在 .azure<environment-name.env> 檔案中,其中 <environment-name> 是您在 期間azd init提供的環境名稱。

  3. 完成時 azd provision ,請確認您的 Web 應用程式仍可運作。 另請尋找資源群組的 App Service 方案,並確認定價方案已設定為標準服務方案 (S1)。

使用 Bicep 新增服務定義

您可以藉由對專案中的 Bicep 進行較大的變更,將新的資源新增至您的部署。 為了示範這一點,您會將 Azure Cache for Redis 的實例新增至現有的部署,以備妥您計劃在未來新增的虛構新功能。

重要

由於這項變更,您將支付 Azure Cache for Redis 實例的費用,直到您刪除 Azure 入口網站 中的資源或使用 azd down。 您可以在 Azure Cache for Redis 定價頁面上找到不同服務方案及其相關成本的詳細數據。

  1. 在名為 redis.bicepinfra 資料夾中建立新檔案。 將下列程式代碼複製並貼到新的檔案中:

    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
    
  2. 修改 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
      }
    }
    
  3. 將輸出值新增至檔案底部:

    output REDIS_ID string = redis.outputs.REDIS_ID
    output REDIS_HOST string = redis.outputs.REDIS_HOST
    
  4. 確認整個 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
    
  5. 請確定已儲存所有變更,然後使用下列命令來更新 Azure 上已布建的資源:

    azd provision
    

    注意

    根據許多因素,將 Azure Cache for Redis 的實例新增至現有的部署可能需要很長的時間。 在測試中,我們經歷了超過 20 分鐘的運行時間。 只要您未看到任何錯誤,請允許程式繼續執行,直到完成為止。

  6. 完成時azd provision,請開啟 Azure 入口網站,流覽至部署的資源群組,然後在服務清單中確認您現在有 Azure Cache for Redis 的實例。

本快速入門總結為快速入門,不過有許多 Azure 服務可協助您建置更具延展性和生產環境就緒的應用程式。 一個絕佳的起點是瞭解 Azure API 管理Azure Front DoorAzure CDNAzure 虛擬網絡 等等。

清除資源

執行 azd down 命令,以清除範本所建立的資源。

azd down

此命令 azd down 會刪除 Azure 資源和 GitHub Actions 工作流程。 出現提示時,同意刪除與資源群組相關聯的所有資源。

您也可以刪除 azdtest 資料夾,或藉由修改專案的檔案作為您自己的應用程式基礎。