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

完了

コピー ループを使用してリソースの複数のインスタンスをデプロイする方法と、ループを使用してリソースのプロパティを設定する方法について学習しました。 Bicep では、変数と出力でループを使用することもできます。

この玩具会社では、複数の Azure リージョに同じサブネット構成で仮想ネットワークをデプロイする必要があります。 将来的には、仮想ネットワークにサブネットを追加する必要があるので、Bicep テンプレートでサブネット構成を柔軟に変更できるようにしたいと考えています。

また、Azure 環境に複数のストレージ アカウントをデプロイするため、ストレージ アカウントごとに出力としてエンドポイントを指定し、デプロイ パイプラインでこの情報を使用できるようにする必要があります。

このユニットでは、変数と出力でループを使用する方法について学習します。

Note

このユニットのコマンドは、概念を説明するために示されています。 コマンドはまだ実行しないでください。 ここで学習した内容をすぐに練習します。

変数ループ

変数ループを使用すると、配列を作成して、Bicep ファイルでそれを使用することができます。 他のループと同様に、変数ループを作成するには for キーワードを使用します。

var items = [for i in range(1, 5): 'item${i}']

この例では、値 item1item2item3item4item5 が含まれる配列が作成されます。

通常、変数ループを使用して、リソース宣言内で使用できるより複雑なオブジェクトを作成します。 変数ループを使用して subnets プロパティを作成する方法を次に示します。

param addressPrefix string = '10.10.0.0/16'
param subnets array = [
  {
    name: 'frontend'
    ipAddressRange: '10.10.0.0/24'
  }
  {
    name: 'backend'
    ipAddressRange: '10.10.1.0/24'
  }
]

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

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2021-08-01' = {
  name: 'teddybear'
  location: resourceGroup().location
  properties:{
    addressSpace:{
      addressPrefixes:[
        addressPrefix
      ]
    }
    subnets: subnetsProperty
  }
}

この例では、単純でわかりやすい値を持つパラメーターを、Azure リソースの必要な定義に相当するより複雑なオブジェクトに変換し、変数ループを効果的に使用する方法を示しています。 変数ループを使用して、リスト内の項目ごとに変わるキー情報のみをパラメーターで指定できるようにします。 その後で Bicep 式または既定値を使用して、リソースに必要なその他のプロパティを設定できます。

出力ループ

デプロイを開始したユーザーまたはツールにデプロイから情報を提供するには、Bicep の出力を使用できます。 出力ループを使用すると、ループの柔軟性と機能を出力内で利用できます。

他のループと同様に、出力ループを指定するには for キーワードを使用します。

var items = [
  'item1'
  'item2'
  'item3'
  'item4'
  'item5'
]

output outputItems array = [for i in range(0, length(items)): items[i]]

通常、出力ループは、テンプレート内で他のループと組み合わせて使用します。 たとえば、locations パラメーターによって指定された Azure リージョンにストレージ アカウントのセットをデプロイする Bicep ファイルを見てみましょう。

param locations array = [
  'westeurope'
  'eastus2'
  'eastasia'
]

resource storageAccounts 'Microsoft.Storage/storageAccounts@2021-09-01' = [for location in locations: {
  name: 'toy${uniqueString(resourceGroup().id, location)}'
  location: location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
}]

作成した各ストレージ アカウントに関する情報 (その名前や、それにアクセスするために使用できるエンドポイントなど) を返すことが必要な場合があります。 出力ループを使用すると、Bicep ファイル内でこの情報を取得できます。

Note

現在の Bicep では、ループ内で作成されたリソースを、出力ループ内から直接参照することはサポートされていません。 これは、次の例で示すように、配列インデクサーを使用してリソースにアクセスする必要があることを意味します。

output storageEndpoints array = [for i in range(0, length(locations)): {
  name: storageAccounts[i].name
  location: storageAccounts[i].location
  blobEndpoint: storageAccounts[i].properties.primaryEndpoints.blob
  fileEndpoint: storageAccounts[i].properties.primaryEndpoints.file
}]

注意事項

アクセス キーやパスワードなどのシークレットを返すために出力を使用しないでください。 出力はログに記録され、機密データを処理するようには設計されていません。