ループを使用して複数のリソースをデプロイする

完了

多くの場合、よく似た複数のリソースをデプロイする必要があります。 Bicep ファイルにループを追加することで、リソースを繰り返し定義する必要がなくなります。 代わりに、デプロイするリソースのインスタンスの数を動的に設定できます。 インスタンスごとにプロパティをカスタマイズすることもできます。

この玩具会社の場合、新しいスマート テディ ベアの発売をサポートするために、いくつかの Azure SQL 論理サーバーを含むバックエンド インフラストラクチャをデプロイする必要があります。 おもちゃが手に入る国ごとのデータ保護法に準拠するため、各国に専用の論理サーバーをデプロイする必要があります。

場所を除けば、すべての論理サーバーを同じように構成します。 Bicep コードを使用して論理サーバーをデプロイし、パラメーターで論理サーバーをデプロイするリージョンを指定できるようにする必要があります。

このユニットでは、"コピー ループ" を使用してリソースの複数のインスタンスをデプロイする方法について学習します。

注意

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

コピー ループを使用する

Bicep テンプレートでリソースまたはモジュールを定義するときに、for キーワードを使用してループを作成できます。 リソース宣言に for キーワードを配置してから、ループ内で各項目を識別する方法を指定します。 通常、オブジェクトの配列をループ処理して、リソースの複数のインスタンスを作成します。 次の例では、複数のストレージ アカウントをデプロイし、その名前をパラメーター値として指定します。

param storageAccountNames array = [
  'saauditus'
  'saauditeurope'
  'saauditapac'
]

resource storageAccountResources 'Microsoft.Storage/storageAccounts@2021-09-01' = [for storageAccountName in storageAccountNames: {
  name: storageAccountName
  location: resourceGroup().location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
}]

この例のループでは、storageAccountNames 配列内の各項目を反復処理します。 Bicep によってループが処理されるたびに、現在の値が storageAccountName という特殊な変数に格納され、name プロパティの値として使用されます。 Bicep では、for キーワードの前に開始角かっこ ([) 文字を記述し、リソース定義の後に終了角かっこ (]) を記述する必要があることに注意してください。

この Bicep ファイルをデプロイすると、3 つのストレージ アカウントが作成され、それぞれに storageAccountNames 配列内の対応する項目で指定されている名前が設定されることがわかります。

カウントに基づいてループする

ソースとして配列を使用せず、特定の数のリソースを作成するためにループを使用することが必要になる場合があります。 Bicep には、数値の配列を作成する range() 関数があります。 たとえば、sa1 から sa4 まで 4 つのストレージ アカウントを作成する必要がある場合は、次のようなリソース定義を使用できます。

resource storageAccountResources 'Microsoft.Storage/storageAccounts@2021-09-01' = [for i in range(1,4): {
  name: 'sa${i}'
  location: resourceGroup().location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
}]

range() 関数を使用する場合は、開始の値と作成する値の数を指定します。 たとえば、sa0sa1sa2 という名前のストレージ アカウントを作成する場合は、関数 range(0,3) を使用します。

Note

range() 関数を使用するときは、2 つの引数を指定します。 1 つ目で開始の値を指定し、2 つ目で必要な値の数を示します。 たとえば、range(3,4) を使用すると、Bicep から値 3456 が返されます。 適切な数の値を要求してください (特に、開始の値として 0 を使用する場合)。

反復インデックスにアクセスする

Bicep では、配列を反復処理し、配列内の現在の要素のインデックスを取得できます。 たとえば、配列で指定されている各場所に論理サーバーを作成し、サーバーの名前を sqlserver-1sqlserver-2 などとするとします。 これは、次の Bicep コードを使用して実現できます。

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

resource sqlServers 'Microsoft.Sql/servers@2021-11-01-preview' = [for (location, i) in locations: {
  name: 'sqlserver-${i+1}'
  location: location
  properties: {
    administratorLogin: administratorLogin
    administratorLoginPassword: administratorLoginPassword
  }
}]

name プロパティに式 i+1 が含まれていることに注意してください。 i インデックス変数の最初の値は 0 なので、サーバー名を 1 から始めたい場合は、それに +1 を追加する必要があります。

ヒント

この例では、インデックス変数に i という名前を付けました。 これは Bicep での標準的な規則です。 ただし、任意の名前を使用できます。

ループで項目をフィルター処理する

状況によっては、コピー ループと条件を組み合わせて使用し、リソースをデプロイしたい場合があります。 これを行うには、if キーワードと for キーワードを組み合わせます。

次の例のコードでは、配列パラメーターを使用して論理サーバーのセットを定義しています。 条件とコピー ループを使用して、ループ オブジェクトの environmentName プロパティが Production と等しい場合にのみ、サーバーをデプロイします。

param sqlServerDetails array = [
  {
    name: 'sqlserver-we'
    location: 'westeurope'
    environmentName: 'Production'
  }
  {
    name: 'sqlserver-eus2'
    location: 'eastus2'
    environmentName: 'Development'
  }
  {
    name: 'sqlserver-eas'
    location: 'eastasia'
    environmentName: 'Production'
  }
]

resource sqlServers 'Microsoft.Sql/servers@2021-11-01-preview' = [for sqlServer in sqlServerDetails: if (sqlServer.environmentName == 'Production') {
  name: sqlServer.name
  location: sqlServer.location
  properties: {
    administratorLogin: administratorLogin
    administratorLoginPassword: administratorLoginPassword
  }
  tags: {
    environment: sqlServer.environmentName
  }
}]

前の例をデプロイすると、2 つの論理サーバー sqlserver-wesqlserver-eas は表示されますが、sqlserver-eus2 は、そのオブジェクトの environmentName プロパティが Production と一致しないため表示されません。