設定集模式

與其定義許多個別參數,您可以選擇建立值的預先定義集合。 在部署期間,選取要使用的值集合。

內容和問題

單一 Bicep 檔案通常會定義許多資源。 依您要部署的環境而定,每個資源可能需要使用不同的設定。 例如,您可能會建立 Bicep 檔案,藉以部署 App Service 方案和應用程式,以及儲存體帳戶。 這些資源都有多個選項會影響其成本、可用性和復原。 在生產環境中,您想使用一組設定來優先處理高可用性和復原。 對於非生產環境,您想使用另一組不同的設定,以降低成本為優先考量。

您可以為每個組態設定建立參數,但這有一些缺點:

  • 這種方法會對您的範本使用者造成負擔,因為他們需要了解每個資源所使用的值,以及設定每個參數的影響。
  • 範本中的參數數目會隨著您所定義的每個新資源而增加。
  • 使用者可能選取尚未經過測試或無法正常運作的參數值組合。

解決方案

建立單一參數來指定環境類型。 使用變數,依參數值自動選取各資源的設定。

注意

此方法有時稱為「T 恤尺寸」。 當您購買 T 恤時,不會有長度、寬度、有袖等許多選項。 您只需選擇 S、M 及 L 尺寸,而 T 恤設計師已根據該大小預先定義這些量值。

範例

假設您的範本可部署兩種環境類型:非生產和生產環境。 視環境類型而定,您需要的設定會有所不同:

屬性 非生產環境 實際執行環境
App Service 計劃
SKU 名稱 S2 P2V3
容量 (執行個體數目) 1 3
App Service 應用程式
永遠開啟 停用 啟用
儲存體帳戶
SKU 名稱 Standard_LRS Standard_ZRS

您可以使用此範本的設定集合模式。

接受表示環境類型的單一參數,例如:生產環境或非生產環境。 使用 @allowed 參數裝飾項目,以確保範本使用者僅提供預期的值:

@allowed([
  'Production'
  'NonProduction'
])
param environmentType string = 'NonProduction'

然後建立對應變數,這是根據環境類型來定義特定設定的物件。 請注意,該變數有名稱為 ProductionNonProduction 的兩個物件。 這些名稱符合上述範例中允許的參數值:

var environmentConfigurationMap = {
  Production: {
    appServicePlan: {
      sku: {
        name: 'P2V3'
        capacity: 3
      }
    }
    appServiceApp: {
      alwaysOn: false
    }
    storageAccount: {
      sku: {
        name: 'Standard_ZRS'
      }
    }
  }
  NonProduction: {
    appServicePlan: {
      sku: {
        name: 'S2'
        capacity: 1
      }
    }
    appServiceApp: {
      alwaysOn: false
    }
    storageAccount: {
      sku: {
        name: 'Standard_LRS'
      }
    }
  }
}

在您定義資源時,請使用設定對應來定義資源屬性:

resource appServicePlan 'Microsoft.Web/serverfarms@2022-09-01' = {
  name: appServicePlanName
  location: location
  sku: environmentConfigurationMap[environmentType].appServicePlan.sku
}

resource appServiceApp 'Microsoft.Web/sites@2022-09-01' = {
  name: appServiceAppName
  location: location
  properties: {
    serverFarmId: appServicePlan.id
    httpsOnly: true
    siteConfig: {
      alwaysOn: environmentConfigurationMap[environmentType].appServiceApp.alwaysOn
    }
  }
}

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: storageAccountName
  location: location
  kind: 'StorageV2'
  sku: environmentConfigurationMap[environmentType].storageAccount.sku
}

考量

  • 在您的對應變數中,考慮依資源將屬性分組,以簡化其定義。
  • 在對應變數中,您可定義個別屬性值 (如範例中的 alwaysOn 屬性),也可定義用於設定物件屬性的物件變數 (如範例中的 SKU 屬性)。
  • 請考慮使用具有資源條件的設定集。 如此您的 Bicep 程式碼便可針對特定環境部署特定資源,而非其他環境。

下一步

了解共用變數檔案模式。