クイックスタート: Bicep で複数のリソース インスタンスを作成する
Bicep でさまざまな for
構文を使用して複数のリソース インスタンスを作成する方法について説明します。 この記事では、複数のリソース インスタンスの作成のみを示しますが、同じ方法を使用して、モジュール、変数、プロパティ、または出力のコピーも定義できます。 詳細については、Bicep のループに関する記事を参照してください。
この記事では、次のトピックを取り上げます。
前提条件
Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
Bicep の開発環境を設定するには、「Bicep ツールをインストールする」を参照してください。 これらの手順を完了すると、Visual Studio Code と Bicep 拡張機能を利用できるようになります。 また、最新の 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@2023-04-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@2023-04-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 つのストレージ アカウントが得られます。
range() 内では、最初の数値は開始番号、2 番目の数値はループが実行される回数です。 そのため range(3,2) に変更すると、2 つのストレージ アカウントも取得します。
前のサンプルの出力は、ループで作成されたリソースを参照する方法を示しています。 次のように出力されます。
"outputs": {
"names": {
"type": "Array",
"value": [
{
"name": "0storage52iyjssggmvue"
},
{
"name": "1storage52iyjssggmvue"
}
]
}
},
配列要素を使用する
配列をループ処理できます。 次のサンプルは、文字列の配列を示しています。
param rgLocation string = resourceGroup().location
param storageNames array = [
'contoso'
'fabrikam'
]
resource createStorages 'Microsoft.Storage/storageAccounts@2023-04-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@2023-04-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@2023-04-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@2023-04-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@2023-04-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