練習 - 使用變數和輸出迴圈

已完成

若是玩具公司,您需要在要推出泰迪熊的每個國家/地區部署虛擬網路。 開發人員也會要求您為所部署的每個區域 Azure SQL 邏輯伺服器提供完整網域名稱 (FQDN)。

在此練習中,您會將虛擬網路和其設定新增至 Bicep 程式碼,而您將會輸出邏輯伺服器 FQDN。

在此過程中,您將會:

  • 更新 Bicep 程式碼,以指定每個虛擬網路子網路的參數。
  • 新增變數迴圈來建立子網路陣列,您將在虛擬網路資源宣告中使用該陣列。
  • 新增輸出迴圈來建立邏輯伺服器 FQDN 的清單。
  • 部署 Bicep 檔,並確認部署。

將虛擬網路新增至 Bicep 檔案

  1. 開啟 main.bicep 檔案。

  2. 在參數宣告下方,新增下列參數:

    @description('The IP address range for all virtual networks to use.')
    param virtualNetworkAddressPrefix string = '10.10.0.0/16'
    
    @description('The name and IP address range for each subnet in the virtual networks.')
    param subnets array = [
      {
        name: 'frontend'
        ipAddressRange: '10.10.5.0/24'
      }
      {
        name: 'backend'
        ipAddressRange: '10.10.10.0/24'
      }
    ]
    
  3. 在參數底下新增空白行,然後新增 subnetProperties 變數迴圈:

    var subnetProperties = [for subnet in subnets: {
      name: subnet.name
      properties: {
        addressPrefix: subnet.ipAddressRange
      }
    }]
    
  4. 在檔案底部的 databases 模組迴圈下方,新增下列資源迴圈:

    resource virtualNetworks 'Microsoft.Network/virtualNetworks@2024-01-01' = [for location in locations: {
      name: 'teddybear-${location}'
      location: location
      properties:{
        addressSpace:{
          addressPrefixes:[
            virtualNetworkAddressPrefix
          ]
        }
        subnets: subnetProperties
      }
    }]
    

    注意

    此範例會針對所有虛擬網路使用相同的位址空間。 一般來說,建立多個虛擬網路時,您要為這些網路提供不同的位址空間,以防需要將其連接在一起的可能性。

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

將輸出新增至資料庫模組

  1. 開啟 modules/database.bicep 檔案。

  2. 在檔案底端,新增下列輸出:

    output serverName string = sqlServer.name
    output location string = location
    output serverFullyQualifiedDomainName string = sqlServer.properties.fullyQualifiedDomainName
    
  3. 儲存對檔案所做的變更。

透過父代 Bicep 檔案流程輸出

  1. 開啟 main.bicep 檔案。

  2. 在檔案底端,新增下列輸出迴圈:

    output serverInfo array = [for i in range(0, length(locations)): {
      name: databases[i].outputs.serverName
      location: databases[i].outputs.location
      fullyQualifiedDomainName: databases[i].outputs.serverFullyQualifiedDomainName
    }]
    
  3. 儲存對檔案所做的變更。

驗證 Bicep 檔案

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

@description('The Azure regions into which the resources should be deployed.')
param locations array = [
  'westeurope'
  'eastus2'
  'eastasia'
]

@secure()
@description('The administrator login username for the SQL server.')
param sqlServerAdministratorLogin string

@secure()
@description('The administrator login password for the SQL server.')
param sqlServerAdministratorLoginPassword string

@description('The IP address range for all virtual networks to use.')
param virtualNetworkAddressPrefix string = '10.10.0.0/16'

@description('The name and IP address range for each subnet in the virtual networks.')
param subnets array = [
  {
    name: 'frontend'
    ipAddressRange: '10.10.5.0/24'
  }
  {
    name: 'backend'
    ipAddressRange: '10.10.10.0/24'
  }
]

var subnetProperties = [for subnet in subnets: {
  name: subnet.name
  properties: {
    addressPrefix: subnet.ipAddressRange
  }
}]

module databases 'modules/database.bicep' = [for location in locations: {
  name: 'database-${location}'
  params: {
    location: location
    sqlServerAdministratorLogin: sqlServerAdministratorLogin
    sqlServerAdministratorLoginPassword: sqlServerAdministratorLoginPassword
  }
}]

resource virtualNetworks 'Microsoft.Network/virtualNetworks@2024-01-01' = [for location in locations: {
  name: 'teddybear-${location}'
  location: location
  properties:{
    addressSpace:{
      addressPrefixes:[
        virtualNetworkAddressPrefix
      ]
    }
    subnets: subnetProperties
  }
}]

output serverInfo array = [for i in range(0, length(locations)): {
  name: databases[i].outputs.serverName
  location: databases[i].outputs.location
  fullyQualifiedDomainName: databases[i].outputs.serverFullyQualifiedDomainName
}]

database.bicep 檔案看起來應該像下列範例:

@description('The Azure region into which the resources should be deployed.')
param location string

@secure()
@description('The administrator login username for the SQL server.')
param sqlServerAdministratorLogin string

@secure()
@description('The administrator login password for the SQL server.')
param sqlServerAdministratorLoginPassword string

@description('The name and tier of the SQL database SKU.')
param sqlDatabaseSku object = {
  name: 'Standard'
  tier: 'Standard'
}

@description('The name of the environment. This must be Development or Production.')
@allowed([
  'Development'
  'Production'
])
param environmentName string = 'Development'

@description('The name of the audit storage account SKU.')
param auditStorageAccountSkuName string = 'Standard_LRS'

var sqlServerName = 'teddy${location}${uniqueString(resourceGroup().id)}'
var sqlDatabaseName = 'TeddyBear'
var auditingEnabled = environmentName == 'Production'
var auditStorageAccountName = take('bearaudit${location}${uniqueString(resourceGroup().id)}', 24)

resource sqlServer 'Microsoft.Sql/servers@2023-08-01-preview' = {
  name: sqlServerName
  location: location
  properties: {
    administratorLogin: sqlServerAdministratorLogin
    administratorLoginPassword: sqlServerAdministratorLoginPassword
  }
}

resource sqlDatabase 'Microsoft.Sql/servers/databases@2023-08-01-preview' = {
  parent: sqlServer
  name: sqlDatabaseName
  location: location
  sku: sqlDatabaseSku
}

resource auditStorageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = if (auditingEnabled) {
  name: auditStorageAccountName
  location: location
  sku: {
    name: auditStorageAccountSkuName
  }
  kind: 'StorageV2'  
}

resource sqlServerAudit 'Microsoft.Sql/servers/auditingSettings@2023-08-01-preview' = if (auditingEnabled) {
  parent: sqlServer
  name: 'default'
  properties: {
    state: 'Enabled'
    storageEndpoint: environmentName == 'Production' ? auditStorageAccount.properties.primaryEndpoints.blob : ''
    storageAccountAccessKey: environmentName == 'Production' ? listKeys(auditStorageAccount.id, auditStorageAccount.apiVersion).keys[0].value : ''
  }
}

output serverName string = sqlServer.name
output location string = location
output serverFullyQualifiedDomainName string = sqlServer.properties.fullyQualifiedDomainName

如果不是,請複製範例或調整範本以符合範例。

將 Bicep 範本部署至 Azure

在 Visual Studio Code 終端機中,透過執行下列程式碼,將 Bicep 範本部署到 Azure。 此流程可能需要幾分鐘時間才能完成,然後您就會成功完成部署。

az deployment group create --template-file main.bicep

在 Visual Studio Code 終端機中,透過執行下列 Azure PowerShell 命令,將 Bicep 範本部署到 Azure。 此流程可能需要幾分鐘時間才能完成,然後您就會成功完成部署。

New-AzResourceGroupDeployment -TemplateFile main.bicep

警告

請務必使用您先前所用相同的登入和密碼,否則部署將無法成功完成。

等待部署完成。

檢查部署

部署完成之後,您會想要驗證是否已部署新的虛擬網路,以及是否已如預期般設定子網路。

  1. 前往 Azure 入口網站,並確定您在沙箱訂用帳戶中。

  2. 選取 [沙箱資源群組名稱]。

  3. 確認虛擬網路已部署至三個 Azure 位置。

    Azure 入口網站的螢幕擷取畫面,顯示部署後的虛擬網路清單。

  4. 選取名為 teddybear-eastasia 的虛擬網路。

  5. 在搜尋列中輸入 Subnets。 在 [設定] 下,選取 [子網路]。

    虛擬網路 Azure 入口網站介面的螢幕擷取畫面,顯示已輸入子網路的搜尋欄位。

  6. 確認已部署子網路具有 subnets 參數預設值中所指定的名稱和 IP 位址。

    Azure 入口網站的螢幕擷取畫面,顯示部署後的兩個虛擬網路子網路。

  7. 檢查部署命令的輸出。 其應該包含已部署的三個邏輯伺服器名稱和 FQDN,如下所示:

    部署輸出的螢幕擷取畫面,顯示邏輯伺服器的屬性。

  1. 前往 Azure 入口網站,並確定您在沙箱訂用帳戶中。

  2. 選取 [沙箱資源群組名稱]。

  3. 確認虛擬網路已部署至三個 Azure 位置。

    Azure 入口網站的螢幕擷取畫面,顯示部署後的虛擬網路清單。

  4. 選取名為 teddybear-eastasia 的虛擬網路。

  5. 在搜尋列中輸入 Subnets。 在 [設定] 下,選取 [子網路]。

    虛擬網路 Azure 入口網站介面的螢幕擷取畫面,顯示已輸入子網路的搜尋欄位。

  6. 確認已部署子網路具有 subnets 參數預設值中所指定的名稱和 IP 位址。

    Azure 入口網站的螢幕擷取畫面,顯示部署後的兩個虛擬網路子網路。

  7. 檢查部署命令的輸出。 其應該包含已部署的三個邏輯伺服器名稱和 FQDN,如下所示:

    部署輸出的螢幕擷取畫面,顯示邏輯伺服器的屬性。