Azure Resource Manager テンプレートでリソースまたはプロパティの複数のインスタンスをデプロイするDeploy more than one instance of a resource or property in Azure Resource Manager Templates

この記事では、リソースの複数のインスタンスを作成するために Azure Resource Manager テンプレートで反復処理する方法について説明します。This article shows you how to iterate in your Azure Resource Manager template to create more than one instance of a resource. リソースをデプロイするかどうかを指定する必要がある場合は、condition 要素に関する記述を参照してください。If you need to specify whether a resource is deployed at all, see condition element.

チュートリアルについては、「Resource Manager テンプレートを使用した複数のリソース インスタンスの作成」を参照してください。For a tutorial, see Tutorial: create multiple resource instances using Resource Manager templates.

注意

この記事は、新しい Azure PowerShell Az モジュールを使用するために更新されました。This article has been updated to use the new Azure PowerShell Az module. Az モジュールと AzureRM の互換性の詳細については、「Introducing the new Azure PowerShell Az module (新しい Azure PowerShell Az モジュールの概要)」を参照してください。To learn more about the new Az module and AzureRM compatibility, see Introducing the new Azure PowerShell Az module. インストール手順については、Azure PowerShell のインストール を参照してください。For installation instructions, see Install Azure PowerShell.

リソースの反復Resource iteration

デプロイ時に、リソースのインスタンスを 1 つまたは複数作成することを決定する必要がある場合は、リソースの種類に copy 要素を追加します。When you must decide during deployment to create one or more instances of a resource, add a copy element to the resource type. copy 要素には、そのループの反復回数と名前を指定します。In the copy element, you specify the number of iterations and a name for this loop. count 値は正の整数である必要がありますが、800 を超えることはできません。The count value must be a positive integer and can't be more than 800.

複数回作成するリソースは、次の形式を取ります。The resource to create several times takes the following format:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "apiVersion": "2016-01-01",
      "type": "Microsoft.Storage/storageAccounts",
      "name": "[concat(copyIndex(),'storage', uniqueString(resourceGroup().id))]",
      "location": "[resourceGroup().location]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "properties": {},
      "copy": {
        "name": "storagecopy",
        "count": 3
      }
    }
  ],
  "outputs": {}
}

各リソースの名前には、現在のループの反復を返す copyIndex() 関数が含まれます。Notice that the name of each resource includes the copyIndex() function, which returns the current iteration in the loop. copyIndex() は 0 から始まります。copyIndex() is zero-based. 次の例を見てください。So, the following example:

"name": "[concat('storage', copyIndex())]",

この場合、以下の名前が作成されます。Creates these names:

  • storage0storage0
  • storage1storage1
  • storage2storage2.

インデックス値をオフセットするには、copyIndex() 関数に値を渡します。To offset the index value, you can pass a value in the copyIndex() function. 実行する反復処理の数は copy 要素で指定されたままですが、copyIndex の値が指定された値でオフセットされます。The number of iterations to perform is still specified in the copy element, but the value of copyIndex is offset by the specified value. 次の例を見てください。So, the following example:

"name": "[concat('storage', copyIndex(1))]",

この場合、以下の名前が作成されます。Creates these names:

  • storage1storage1
  • storage2storage2
  • storage3storage3

コピー操作は、配列内の各要素に対して反復処理するため、配列で作業するときに便利です。The copy operation is helpful when working with arrays because you can iterate through each element in the array. 配列で反復回数を指定するには length 関数を使います。また、配列における現在のインデックスを取得するには copyIndex を使います。Use the length function on the array to specify the count for iterations, and copyIndex to retrieve the current index in the array. 次の例を見てください。So, the following example:

"parameters": { 
  "org": { 
    "type": "array", 
    "defaultValue": [ 
      "contoso", 
      "fabrikam", 
      "coho" 
    ] 
  }
}, 
"resources": [ 
  { 
    "name": "[concat('storage', parameters('org')[copyIndex()])]", 
    "copy": { 
      "name": "storagecopy", 
      "count": "[length(parameters('org'))]" 
    }, 
    ...
  } 
]

この場合、以下の名前が作成されます。Creates these names:

  • storagecontosostoragecontoso
  • storagefabrikamstoragefabrikam
  • storagecohostoragecoho

既定では、リソース マネージャーは並列でリソースを作成します。By default, Resource Manager creates the resources in parallel. それらが作成される順序は保証されません。The order in which they're created isn't guaranteed. しかし、リソースが順番にデプロイされるように指定したい場合もあります。However, you may want to specify that the resources are deployed in sequence. たとえば、運用環境を更新するとき、一度に特定の数だけ更新されるように更新時間をずらす必要がある場合があります。For example, when updating a production environment, you may want to stagger the updates so only a certain number are updated at any one time.

リソースの複数のインスタンスを連続的にデプロイするには、modeserial に、batchSize を一度にデプロイするインスタンスの数に設定します。To serially deploy more than one instance of a resource, set mode to serial and batchSize to the number of instances to deploy at a time. シリアル モードでは、Resource Manager はループ内で前のインスタンスへの依存関係を作成するので、前のバッチが完了するまで次のバッチは実行されません。With serial mode, Resource Manager creates a dependency on earlier instances in the loop, so it doesn't start one batch until the previous batch completes.

たとえば、ストレージ アカウントを一度に 2 つずつ、逐次的にデプロイするには、次のコマンドを使用します。For example, to serially deploy storage accounts two at a time, use:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "apiVersion": "2016-01-01",
      "type": "Microsoft.Storage/storageAccounts",
      "name": "[concat(copyIndex(),'storage', uniqueString(resourceGroup().id))]",
      "location": "[resourceGroup().location]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "properties": {},
      "copy": {
        "name": "storagecopy",
        "count": 4,
        "mode": "serial",
        "batchSize": 2
      }
    }
  ],
  "outputs": {}
}

mode プロパティでも parallel が既定値として使用されます。The mode property also accepts parallel, which is the default value.

入れ子になったテンプレートで copy を使用する方法については、「copy の使用」を参照してください。For information about using copy with nested templates, see Using copy.

プロパティの反復処理Property iteration

リソース上のプロパティの複数の値を作成するには、プロパティ要素に copy 配列を追加します。To create more than one value for a property on a resource, add a copy array in the properties element. この配列にはオブジェクトが含まれていて、各オブジェクトには次のプロパティがあります。This array contains objects, and each object has the following properties:

  • name - 複数の値を作成するプロパティの名前name - the name of the property to create several values for
  • count - 作成する値の数。count - the number of values to create. count 値は正の整数である必要がありますが、800 を超えることはできません。The count value must be a positive integer and can't be more than 800.
  • input - プロパティに割り当てる値を格納するオブジェクトinput - an object that contains the values to assign to the property

次の例は、仮想マシンで dataDisks プロパティに copy を適用する方法を示しています。The following example shows how to apply copy to the dataDisks property on a virtual machine:

{
  "name": "examplevm",
  "type": "Microsoft.Compute/virtualMachines",
  "apiVersion": "2017-03-30",
  "properties": {
    "storageProfile": {
      "copy": [{
        "name": "dataDisks",
        "count": 3,
        "input": {
          "lun": "[copyIndex('dataDisks')]",
          "createOption": "Empty",
          "diskSizeGB": "1023"
        }
      }],
      ...

プロパティの反復処理内で copyIndex を使用する場合、反復処理の名前を指定する必要があります。Notice that when using copyIndex inside a property iteration, you must provide the name of the iteration. リソースの反復処理で使用する場合には名前を指定する必要はありません。You don't have to provide the name when used with resource iteration.

Resource Manager はデプロイ中に copy 配列を展開します。Resource Manager expands the copy array during deployment. 配列の名前がプロパティの名前になります。The name of the array becomes the name of the property. 入力値がオブジェクトのプロパティになります。The input values become the object properties. デプロイされたテンプレートは次のようになります。The deployed template becomes:

{
  "name": "examplevm",
  "type": "Microsoft.Compute/virtualMachines",
  "apiVersion": "2017-03-30",
  "properties": {
    "storageProfile": {
      "dataDisks": [
        {
          "lun": 0,
          "createOption": "Empty",
          "diskSizeGB": "1023"
        },
        {
          "lun": 1,
          "createOption": "Empty",
          "diskSizeGB": "1023"
        },
        {
          "lun": 2,
          "createOption": "Empty",
          "diskSizeGB": "1023"
        }
      ],
      ...

copy 要素は配列であるため、リソースの複数のプロパティを指定できます。The copy element is an array so you can specify more than one property for the resource. 作成するプロパティごとにオブジェクトを追加します。Add an object for each property to create.

{
  "name": "string",
  "type": "Microsoft.Network/loadBalancers",
  "apiVersion": "2017-10-01",
  "properties": {
    "copy": [
      {
        "name": "loadBalancingRules",
        "count": "[length(parameters('loadBalancingRules'))]",
        "input": {
          ...
        }
      },
      {
        "name": "probes",
        "count": "[length(parameters('loadBalancingRules'))]",
        "input": {
          ...
        }
      }
    ]
  }
}

リソースの反復処理とプロパティの反復処理は同時に使用できます。You can use resource and property iteration together. プロパティの反復処理を名前で参照します。Reference the property iteration by name.

{
  "type": "Microsoft.Network/virtualNetworks",
  "name": "[concat(parameters('vnetname'), copyIndex())]",
  "apiVersion": "2018-04-01",
  "copy":{
    "count": 2,
    "name": "vnetloop"
  },
  "location": "[resourceGroup().location]",
  "properties": {
    "addressSpace": {
      "addressPrefixes": [
        "[parameters('addressPrefix')]"
      ]
    },
    "copy": [
      {
        "name": "subnets",
        "count": 2,
        "input": {
          "name": "[concat('subnet-', copyIndex('subnets'))]",
          "properties": {
            "addressPrefix": "[variables('subnetAddressPrefix')[copyIndex('subnets')]]"
          }
        }
      }
    ]
  }
}

変数の反復処理Variable iteration

変数のインスタンスを複数作成するには、variables セクション内で copy プロパティを使用します。To create multiple instances of a variable, use the copy property in the variables section. input プロパティの値から構築された要素の配列を作成します。You create an array of elements constructed from the value in the input property. copy プロパティは、変数内で使用することも、variables セクションの最上位レベルで使用することもできます。You can use the copy property within a variable, or at the top level of the variables section. 変数の反復処理内で copyIndex を使用するときは、反復処理の名前を指定する必要があります。When using copyIndex inside a variable iteration, you must provide the name of the iteration.

文字列値の配列を作成する簡単な例については、配列のコピーのテンプレートを参照してください。For a simple example of creating an array of string values, see copy array template.

次の例は、動的に構築された要素を持つ配列変数のさまざまな作成方法を示しています。The following example shows several different ways to create array variables with dynamically constructed elements. これを見ると、変数内で copy を使用して、オブジェクトと文字列の配列を作成する方法がわかります。It shows how to use copy inside a variable to create arrays of objects and strings. また、最上位レベルで copy を使用して、オブジェクト、文字列、および整数の配列を作成する方法もわかります。It also shows how to use copy at the top level to create arrays of objects, strings, and integers.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "variables": {
    "disk-array-on-object": {
      "copy": [
        {
          "name": "disks",
          "count": 5,
          "input": {
            "name": "[concat('myDataDisk', copyIndex('disks', 1))]",
            "diskSizeGB": "1",
            "diskIndex": "[copyIndex('disks')]"
          }
        },
        {
          "name": "diskNames",
          "count": 5,
          "input": "[concat('myDataDisk', copyIndex('diskNames', 1))]"
        }
      ]
    },
    "copy": [
      {
        "name": "top-level-object-array",
        "count": 5,
        "input": {
          "name": "[concat('myDataDisk', copyIndex('top-level-object-array', 1))]",
          "diskSizeGB": "1",
          "diskIndex": "[copyIndex('top-level-object-array')]"
        }
      },
      {
        "name": "top-level-string-array",
        "count": 5,
        "input": "[concat('myDataDisk', copyIndex('top-level-string-array', 1))]"
      },
      {
        "name": "top-level-integer-array",
        "count": 5,
        "input": "[copyIndex('top-level-integer-array')]"
      }
    ]
  },
  "resources": [],
  "outputs": {
    "exampleObject": {
      "value": "[variables('disk-array-on-object')]",
      "type": "object"
    },
    "exampleArrayOnObject": {
      "value": "[variables('disk-array-on-object').disks]",
      "type" : "array"
    },
    "exampleObjectArray": {
      "value": "[variables('top-level-object-array')]",
      "type" : "array"
    },
    "exampleStringArray": {
      "value": "[variables('top-level-string-array')]",
      "type" : "array"
    },
    "exampleIntegerArray": {
      "value": "[variables('top-level-integer-array')]",
      "type" : "array"
    }
  }
}

作成される変数の型は、入力オブジェクトによって決まります。The type of variable that gets created depends on the input object. たとえば、前の例の top-level-object-array という名前の変数は、次のものを返します。For example, the variable named top-level-object-array in the preceding example returns:

[
  {
    "name": "myDataDisk1",
    "diskSizeGB": "1",
    "diskIndex": 0
  },
  {
    "name": "myDataDisk2",
    "diskSizeGB": "1",
    "diskIndex": 1
  },
  {
    "name": "myDataDisk3",
    "diskSizeGB": "1",
    "diskIndex": 2
  },
  {
    "name": "myDataDisk4",
    "diskSizeGB": "1",
    "diskIndex": 3
  },
  {
    "name": "myDataDisk5",
    "diskSizeGB": "1",
    "diskIndex": 4
  }
]

また、top-level-string-array という名前の変数は、次のものを返します。And, the variable named top-level-string-array returns:

[
  "myDataDisk1",
  "myDataDisk2",
  "myDataDisk3",
  "myDataDisk4",
  "myDataDisk5"
]

ループ内のリソースへの依存Depend on resources in a loop

dependsOn 要素を使用することで、リソースを別のリソースの後にデプロイするよう指定することが可能です。You specify that a resource is deployed after another resource by using the dependsOn element. ループ内のリソースの集合に依存するリソースをデプロイするには、dependsOn 要素にコピー ループの名前を指定します。To deploy a resource that depends on the collection of resources in a loop, provide the name of the copy loop in the dependsOn element. 次の例では、仮想マシンをデプロイする前に 3 つのストレージ アカウントをデプロイする方法を示します。The following example shows how to deploy three storage accounts before deploying the Virtual Machine. 完全な仮想マシン定義は示されていません。The full Virtual Machine definition isn't shown. コピー要素の name が storagecopy に設定され、Virtual Machines の dependsOn 要素が storagecopy に設定されるよう注意してください。Notice that the copy element has name set to storagecopy and the dependsOn element for the Virtual Machines is also set to storagecopy.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "resources": [
    {
      "apiVersion": "2016-01-01",
      "type": "Microsoft.Storage/storageAccounts",
      "name": "[concat(copyIndex(),'storage', uniqueString(resourceGroup().id))]",
      "location": "[resourceGroup().location]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "properties": {},
      "copy": {
        "name": "storagecopy",
        "count": 3
      }
    },
    {
      "apiVersion": "2015-06-15", 
      "type": "Microsoft.Compute/virtualMachines", 
      "name": "[concat('VM', uniqueString(resourceGroup().id))]",  
      "dependsOn": ["storagecopy"],
      ...
    }
  ],
  "outputs": {}
}

子リソースの反復処理Iteration for a child resource

子リソースにコピー ループを使用することはできません。You can't use a copy loop for a child resource. 通常は別のリソース内で入れ子になっているように定義するリソースの複数のインスタンスを作成するには、代わりに、そのリソースを最上位のリソースとして作成する必要があります。To create more than one instance of a resource that you typically define as nested within another resource, you must instead create that resource as a top-level resource. type および name の各プロパティを使用して、親リソースとの関係を定義します。You define the relationship with the parent resource through the type and name properties.

たとえば、通常はデータ ファクトリ内の子リソースとしてデータセットを定義するとします。For example, suppose you typically define a dataset as a child resource within a data factory.

"resources": [
{
  "type": "Microsoft.DataFactory/datafactories",
  "name": "exampleDataFactory",
  ...
  "resources": [
    {
      "type": "datasets",
      "name": "exampleDataSet",
      "dependsOn": [
        "exampleDataFactory"
      ],
      ...
    }
  ]

複数のデータ セットを作成するには、それをデータ ファクトリの外部に移動します。To create more than one data set, move it outside of the data factory. データセットは、データ ファクトリと同じレベルである必要がありますが、今までどおりデータ ファクトリの子リソースです。The dataset must be at the same level as the data factory, but it's still a child resource of the data factory. type および name の各プロパティを使用して、データセットとデータ ファクトリの関係を保存します。You preserve the relationship between data set and data factory through the type and name properties. テンプレート内の位置から type を推論できなくなったため、{resource-provider-namespace}/{parent-resource-type}/{child-resource-type} の形式で完全修飾型を指定する必要があります。Since type can no longer be inferred from its position in the template, you must provide the fully qualified type in the format: {resource-provider-namespace}/{parent-resource-type}/{child-resource-type}.

データ ファクトリのインスタンスを使用して親子関係を確立するには、親リソースの名前を含むデータ セットの名前を指定します。To establish a parent/child relationship with an instance of the data factory, provide a name for the data set that includes the parent resource name. {parent-resource-name}/{child-resource-name} の形式で入力します。Use the format: {parent-resource-name}/{child-resource-name}.

次の例は、実装を示します。The following example shows the implementation:

"resources": [
{
  "type": "Microsoft.DataFactory/datafactories",
  "name": "exampleDataFactory",
  ...
},
{
  "type": "Microsoft.DataFactory/datafactories/datasets",
  "name": "[concat('exampleDataFactory', '/', 'exampleDataSet', copyIndex())]",
  "dependsOn": [
    "exampleDataFactory"
  ],
  "copy": {
    "name": "datasetcopy",
    "count": "3"
  },
  ...
}]

サンプル テンプレートExample templates

次の例は、リソースまたはプロパティの複数のインスタンスを作成するための一般的なシナリオを示しています。The following examples show common scenarios for creating more than one instance of a resource or property.

TemplateTemplate 説明Description
Copy storageCopy storage 名前にインデックス番号を含む複数のストレージ アカウントをデプロイします。Deploys more than one storage account with an index number in the name.
Serial copy storageSerial copy storage 複数のストレージ アカウントを一度に 1 つずつデプロイします。Deploys several storage accounts one at time. 名前にはインデックス番号が含まれます。The name includes the index number.
Copy storage with arrayCopy storage with array 複数のストレージ アカウントをデプロイします。Deploys several storage accounts. 名前には、配列からの値が含まれます。The name includes a value from an array.
VM deployment with a variable number of data disksVM deployment with a variable number of data disks 仮想マシンと共に複数のデータ ディスクをデプロイします。Deploys several data disks with a virtual machine.
Copy variablesCopy variables 変数を反復処理する各種の方法を示します。Demonstrates the different ways of iterating on variables.
Multiple security rulesMultiple security rules ネットワーク セキュリティ グループに複数のセキュリティ規則をデプロイします。Deploys several security rules to a network security group. セキュリティ規則はパラメーターから構築されます。It constructs the security rules from a parameter. パラメーターについては、複数の NSG パラメーター ファイルに関するページを参照してください。For the parameter, see multiple NSG parameter file.

次の手順Next steps