Share via


クイックスタート: Bicep で複数のリソース インスタンスを作成する

Bicep でさまざまな for 構文を使用して複数のリソース インスタンスを作成する方法について説明します。 この記事では、複数のリソース インスタンスの作成のみを示しますが、同じ方法を使用して、モジュール、変数、プロパティ、または出力のコピーも定義できます。 詳細については、Bicep のループに関する記事を参照してください。

この記事では、次のトピックを取り上げます。

前提条件

Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。

Bicep の開発環境を設定するには、「Bicep ツールをインストールする」を参照してください。 これらの手順を完了すると、Visual Studio CodeBicep 拡張機能を利用できるようになります。 また、最新の Azure CLI または最新の Azure PowerShell モジュールを用意します。

1 つのインスタンスを作成する

このセクションでは、ストレージ アカウントを作成するための Bicep ファイルを定義し、その Bicep ファイルをデプロイします。 以降のセクションでは、さまざまな for 構文の Bicep のサンプルを紹介します。 同じデプロイ方法を使用して、これらのサンプルをデプロイして試すことができます。 デプロイが失敗した場合、次の 2 つの原因のいずれかが考えられます。

  • ストレージ アカウント名が長すぎます。 ストレージ アカウント名の長さは 3 から 24 文字である必要があり、数字と小文字のみを使用できます。
  • ストレージ アカウント名が一意ではありません。 ストレージ アカウント名は Azure 内で一意である必要があります。

次の Bicep ファイルでは、1 つのストレージ アカウントを定義します。

param rgLocation string = resourceGroup().location

resource createStorage 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: 'storage${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}

Bicep ファイルをローカルに保存し、その Bicep ファイルを Azure CLI または Azure PowerShell を使用してデプロイします。

resourceGroupName = "{provide-a-resource-group-name}"
templateFile="{provide-the-path-to-the-bicep-file}"

az group create --name $resourceGroupName --location eastus

az deployment group create --resource-group $resourceGroupName --template-file $templateFile

整数インデックスを使用する

次のサンプルでは、インデックスを伴う for ループを使用して、2 つのストレージ アカウントを作成します。

param rgLocation string = resourceGroup().location
param storageCount int = 2

resource createStorages 'Microsoft.Storage/storageAccounts@2022-09-01' = [for i in range(0, storageCount): {
  name: '${i}storage${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}]

output names array = [for i in range(0,storageCount) : {
  name: createStorages[i].name
} ]

インデックス番号は、ストレージ アカウント名の一部として使用します。 Bicep ファイルをデプロイすると、次のような 2 つのストレージ アカウントが得られます。

0 を開始番号とした整数インデックスを使用する

range() 内では、最初の数値は開始番号、2 番目の数値はループが実行される回数です。 そのため range(3,2) に変更すると、2 つのストレージ アカウントも取得します。

3 を開始番号とした整数インデックスを使用する

前のサンプルの出力は、ループで作成されたリソースを参照する方法を示しています。 次のように出力されます。

"outputs": {
  "names": {
    "type": "Array",
    "value": [
      {
        "name": "0storage52iyjssggmvue"
      },
      {
        "name": "1storage52iyjssggmvue"
      }
    ]
  }
},

配列要素を使用する

配列をループ処理できます。 次のサンプルは、文字列の配列を示しています。

param rgLocation string = resourceGroup().location
param storageNames array = [
  'contoso'
  'fabrikam'
]

resource createStorages 'Microsoft.Storage/storageAccounts@2022-09-01' = [for name in storageNames: {
  name: '${name}str${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}]

ループでは、配列内のすべての文字列がストレージ アカウント名の一部として使用されます。 この場合、次の 2 つのストレージ アカウントが作成されます。

文字列の配列を使用する

オブジェクトの配列をループ処理することもできます。 ループでは、ストレージ アカウント名をカスタマイズするだけでなく、SKU も構成します。

param rgLocation string = resourceGroup().location
param storages array = [
  {
    name: 'contoso'
    skuName: 'Standard_LRS'
  }
  {
    name: 'fabrikam'
    skuName: 'Premium_LRS'
  }
]

resource createStorages 'Microsoft.Storage/storageAccounts@2022-09-01' = [for storage in storages: {
  name: '${storage.name}obj${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: storage.skuName
  }
  kind: 'StorageV2'
}]

ループによって 2 つのストレージ アカウントが作成されます。 fabrikam で始まる名前のストレージ アカウントの SKUは Premium_LRS です。

文字列の配列を使用する

配列とインデックスを使用する

同じケースで、配列ループをインデックス ループと組み合わせることもできます。 次のサンプルは、名前付け規則で配列とインデックス番号を使用する方法を示しています。

param rgLocation string = resourceGroup().location
param storageNames array = [
  'contoso'
  'fabrikam'
]

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

前のサンプルをデプロイした後に、次のような 2 つのストレージ アカウントを作成します。

文字列の配列とインデックス番号を使用する

辞書オブジェクトを使用する

辞書オブジェクト内の要素を反復処理するには、items 関数を使用します。これにより、オブジェクトが配列に変換されます。 value プロパティを使用して、オブジェクトのプロパティを取得します。

param rgLocation string = resourceGroup().location

param storageConfig object = {
  storage1: {
    name: 'contoso'
    skuName: 'Standard_LRS'
  }
  storage2: {
    name: 'fabrikam'
    skuName: 'Premium_LRS'
  }
}

resource createStorages 'Microsoft.Storage/storageAccounts@2022-09-01' = [for config in items(storageConfig): {
  name: '${config.value.name}${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: config.value.skuName
  }
  kind: 'StorageV2'
}]

ループによって 2 つのストレージ アカウントが作成されます。 fabrikam で始まる名前のストレージ アカウントの SKUは Premium_LRS です。

辞書オブジェクトを使用する

条件判定を伴うループ

リソースとモジュールの場合は、ループ構文を含む if 式を追加して、条件に応じてコレクションを展開できます。

param rgLocation string = resourceGroup().location
param storageCount int = 2
param createNewStorage bool = true

resource createStorages 'Microsoft.Storage/storageAccounts@2022-09-01' = [for i in range(0, storageCount): if(createNewStorage) {
  name: '${i}storage${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}]

詳細については、「Bicep における条件付きデプロイ」を参照してください。

リソースをクリーンアップする

Azure リソースが不要になったら、Azure CLI か Azure PowerShell のどちらかのモジュールを使用してクイックスタート リソース グループを削除します。

resourceGroupName = "{provide-the-resource-group-name}"

az group delete --name $resourceGroupName

次のステップ