演習 - 変数ループと出力ループを使用する

完了

その玩具会社では、テディ ベアを発売する各国/地域に仮想ネットワークをデプロイする必要があります。 開発者は、デプロイした各リージョンの 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 portal に移動し、サンドボックス サブスクリプション内にいることを確認します。

  2. [サンドボックス リソース グループ名] を選択します。

  3. 仮想ネットワークが 3 つの Azure の場所にデプロイされていることを確認します。

    デプロイ後の仮想ネットワークの一覧が示されている Azure portal のスクリーンショット。

  4. teddybear-eastasia という名前の仮想ネットワークを選択します。

  5. 検索バーに「サブネット」と入力します。 [設定] で、 [サブネット] を選択します。

    「Subnets」と入力された検索フィールドが示されている、仮想ネットワークの Azure portal インターフェイスのスクリーンショット。

  6. デプロイされたサブネットの名前と IP アドレスが、subnets パラメーターの既定値で指定されているものになっていることを確認します。

    デプロイ後の 2 つの仮想ネットワーク サブネットを示す、Azure portal のスクリーンショット。

  7. デプロイ コマンドの出力を確認します。 次に示すように、デプロイされた 3 つの論理サーバーすべての名前と FQDN が含まれている必要があります。

    論理サーバーのプロパティが表示されている、デプロイの出力のスクリーンショット。

  1. Azure portal に移動し、サンドボックス サブスクリプション内にいることを確認します。

  2. [サンドボックス リソース グループ名] を選択します。

  3. 仮想ネットワークが 3 つの Azure の場所にデプロイされていることを確認します。

    デプロイ後の仮想ネットワークの一覧が示されている Azure portal のスクリーンショット。

  4. teddybear-eastasia という名前の仮想ネットワークを選択します。

  5. 検索バーに「サブネット」と入力します。 [設定] で、 [サブネット] を選択します。

    「Subnets」と入力された検索フィールドが示されている、仮想ネットワークの Azure portal インターフェイスのスクリーンショット。

  6. デプロイされたサブネットの名前と IP アドレスが、subnets パラメーターの既定値で指定されているものになっていることを確認します。

    デプロイ後の 2 つの仮想ネットワーク サブネットを示す、Azure portal のスクリーンショット。

  7. デプロイ コマンドの出力を確認します。 次に示すように、デプロイされた 3 つの論理サーバーすべての名前と FQDN が含まれている必要があります。

    論理サーバーのプロパティが表示されている、デプロイの出力のスクリーンショット。