練習 - 在 Bicep 範本中新增參數和變數

已完成

在此練習中,您將更新先前建立的 Bicep 範本,使其:

  • 接受資源位置和名稱的參數。
  • 使用商務規則來選取所要部署資源的正確 SKU。

在此過程中,您將會:

  • 更新範本以包含 location 參數。
  • 更新範本以包含資源名稱的參數和變數。
  • 使用運算式來設定參數的預設值。
  • 更新範本以包含每個資源 SKU 的變數。
  • 測試部署以確定範本有效。

新增位置和資源名稱參數

  1. 在 Visual Studio Code 的 main.bicep 檔案中,於檔案頂端新增下列程式碼:

    param location string = 'eastus'
    param storageAccountName string = 'toylaunch${uniqueString(resourceGroup().id)}'
    param appServiceAppName string = 'toylaunch${uniqueString(resourceGroup().id)}'
    
    var appServicePlanName = 'toy-product-launch-plan'
    

    Bicep linter 會在每個參數和變數名稱底下新增黃色波浪線,以指出它們不會用在範本中。 您很快就會解決此問題。

    請注意,您要使用包含字串插補、uniqueString() 函式的運算式來定義預設參數值。 部署此範本的人可以在部署時指定值來覆寫預設參數值,但其無法覆寫變數值。

    也請注意,您針對 Azure App Service 方案的名稱使用變數,但針對其他名稱則使用參數。 儲存體帳戶和 App Service 應用程式需要全域唯一的名稱,但 App Service 方案名稱只需要在其資源群組中是唯一的就可以。 這項差異表示,只要部署全都進入不同的資源群組,就可以在不同的部署中使用相同的 App Service 方案名稱。

    提示

    您指定的 location 參數應設為 westus3。 一般而言,您會使用 resourceGroup().location 屬性,在與資源群組相同的位置建立資源。 但當您使用 Microsoft Learn 沙箱時,則須使用與資源群組位置不符的特定 Azure 區域。

  2. 在資源定義內找出 locationname 屬性的設定所在之處,並予以更新為使用參數值。 完成之後,Bicep 檔案內的資源定義看起來應該像這樣:

    resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = {
      name: storageAccountName
      location: location
      sku: {
        name: 'Standard_LRS'
      }
      kind: 'StorageV2'
      properties: {
        accessTier: 'Hot'
      }
    }
    
    resource appServicePlan 'Microsoft.Web/serverfarms@2023-12-01' = {
      name: appServicePlanName
      location: location
      sku: {
        name: 'F1'
      }
    }
    
    resource appServiceApp 'Microsoft.Web/sites@2023-12-01' = {
      name: appServiceAppName
      location: location
      properties: {
        serverFarmId: appServicePlan.id
        httpsOnly: true
      }
    }
    
  3. 儲存對檔案所做的變更。

自動設定每個環境類型的 SKU

  1. 在 Visual Studio Code 中的 main.bicep 檔案中,將下列 Bicep 參數新增至您在上一個工作中建立的參數底下:

    @allowed([
      'nonprod'
      'prod'
    ])
    param environmentType string
    

    請注意,您要定義有一組允許值的參數,而不是指定此參數的預設值。

  2. 在宣告 appServicePlanName 變數的那一行下方,新增下列變數定義:

    var storageAccountSkuName = (environmentType == 'prod') ? 'Standard_GRS' : 'Standard_LRS'
    var appServicePlanSkuName = (environmentType == 'prod') ? 'P2v3' : 'F1'
    

    請注意,您要設定這些變數的值,方法是使用三元運算子來表達某些 if/then/else 邏輯。

  3. 在資源定義內找出 sku 屬性的設定所在之處,並將其更新為使用參數值。 完成之後,Bicep 檔案內的資源定義看起來應該像這樣:

    resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = {
      name: storageAccountName
      location: location
      sku: {
        name: storageAccountSkuName
      }
      kind: 'StorageV2'
      properties: {
        accessTier: 'Hot'
      }
    }
    
    resource appServicePlan 'Microsoft.Web/serverfarms@2023-12-01' = {
      name: appServicePlanName
      location: location
      sku: {
        name: appServicePlanSkuName
      }
    }
    
    resource appServiceApp 'Microsoft.Web/sites@2023-12-01' = {
      name: appServiceAppName
      location: location
      properties: {
        serverFarmId: appServicePlan.id
        httpsOnly: true
      }
    }
    

    請注意,您尚未將一切項目參數化。 您已在資源定義中直接設定一些屬性,因為您知道這些值不會隨著部署而變更。

  4. 儲存對檔案所做的變更。

驗證 Bicep 檔案

完成上述所有變更之後,main.bicep 檔案看起來應該像下列範例:

param location string = 'eastus'
param storageAccountName string = 'toylaunch${uniqueString(resourceGroup().id)}'
param appServiceAppName string = 'toylaunch${uniqueString(resourceGroup().id)}'

@allowed([
  'nonprod'
  'prod'
])
param environmentType string

var appServicePlanName = 'toy-product-launch-plan'
var storageAccountSkuName = (environmentType == 'prod') ? 'Standard_GRS' : 'Standard_LRS'
var appServicePlanSkuName = (environmentType == 'prod') ? 'P2v3' : 'F1'

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: storageAccountSkuName
  }
  kind: 'StorageV2'
  properties: {
    accessTier: 'Hot'
  }
}

resource appServicePlan 'Microsoft.Web/serverfarms@2023-12-01' = {
  name: appServicePlanName
  location: location
  sku: {
    name: appServicePlanSkuName
  }
}

resource appServiceApp 'Microsoft.Web/sites@2023-12-01' = {
  name: appServiceAppName
  location: location
  properties: {
    serverFarmId: appServicePlan.id
    httpsOnly: true
  }
}

如果您的檔案不符,請複製範例,或是將您的檔案調整為與範例相符。

部署更新後的 Bicep 範本

在終端中執行下列 Azure CLI 命令。

az deployment group create \
  --template-file main.bicep \
  --parameters environmentType=nonprod

在終端內執行下列 Azure PowerShell 命令。

New-AzResourceGroupDeployment `
  -TemplateFile main.bicep `
  -environmentType nonprod

請注意,當您執行部署時,您會明確指定 environmentType 參數的值。 因為參數值具有效的預設值,所以不需要再指定其他參數值。

檢查您的部署

  1. 在瀏覽器中,返回 Azure 入口網站並移至您的資源群組。 您仍會看到一個成功的部署,因為此部署使用的名稱與第一個部署相同。

  2. 選取 [1 個成功] 連結。

  3. 選取名為 main 的部署,然後選取 [部署詳細資料],以展開已部署的資源清單。

    Screenshot of the Azure portal interface for the specific deployment, with storage account and App Service resources listed with generated names.

  4. 請注意,新的 App Service 應用程式和儲存體帳戶已使用隨機產生的名稱進行部署。