次の方法で共有


ARM テンプレートでのプロパティの反復処理

この記事では、Azure Resource Manager テンプレート (ARM テンプレート) でプロパティの複数のインスタンスを作成する方法について説明します。 テンプレート内のリソースのプロパティ セクションにコピー ループを追加することで、デプロイ時にプロパティの項目数を動的に設定できます。 また、テンプレート構文を繰り返す必要も回避できます。

コピー ループは、プロパティにコピー ループを適用する場合でも、最上位レベルのリソースでのみ使用できます。 子リソースを最上位のリソースに変更する方法については、「 子リソースのイテレーション」を参照してください。

リソース変数、出力でコピー ループ使用することもできます。

ヒント

ARM テンプレートと同じ機能を備え、構文も使いやすいため、Bicep をお勧めします。 詳細については、 ループを参照してください。

構文

copy要素をテンプレートの resources セクションに追加して、プロパティの項目数を設定します。 copy 要素の一般的な形式は次のとおりです。

"copy": [
  {
    "name": "<name-of-property>",
    "count": <number-of-iterations>,
    "input": <values-for-the-property>
  }
]

nameの場合は、作成するリソース プロパティの名前を指定します。

count プロパティは、プロパティに対して必要な反復回数を指定します。

input プロパティは、繰り返すプロパティを指定します。 input プロパティの値から構築された要素の配列を作成します。

コピーの制限

カウントは 800 を超えることはできません。

カウントを負の数にすることはできません。 最新バージョンの Azure CLI、PowerShell、または REST API を使用してテンプレートをデプロイする場合は、ゼロにすることができます。 具体的には、次を使用する必要があります。

  • Azure PowerShell 2.6 以降
  • Azure CLI 2.0.74 以降
  • REST API バージョン 2019-05-10 以降
  • リンクされたデプロイでは、 デプロイ リソースの種類に API バージョン 2019-05-10 以降を使用する必要があります

以前のバージョンの PowerShell、CLI、および REST API では、カウントの 0 はサポートされていません。

プロパティの反復処理

次の例は、仮想マシンの dataDisks プロパティにコピー ループを適用する方法を示しています。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "numberOfDataDisks": {
      "type": "int",
      "minValue": 0,
      "maxValue": 16,
      "defaultValue": 3,
      "metadata": {
        "description": "The number of dataDisks to create."
      }
    },
    ...
  },
  "resources": [
    {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2022-11-01",
      ...
      "properties": {
        "storageProfile": {
          ...
          "copy": [
            {
              "name": "dataDisks",
              "count": "[parameters('numberOfDataDisks')]",
              "input": {
                "lun": "[copyIndex('dataDisks')]",
                "createOption": "Empty",
                "diskSizeGB": 1023
              }
            }
          ]
        }
        ...
      }
    }
  ]
}

プロパティイテレーション内で copyIndex を 使用する場合は、イテレーションの名前を指定する必要があることに注意してください。 プロパティの反復処理では、オフセット引数もサポートされます。 オフセットは、 copyIndex('dataDisks', 1)など、イテレーションの名前の後に配置する必要があります。

デプロイされたテンプレートは次のようになります。

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

コピー操作は、配列内の各要素を反復処理できるため、配列を操作するときに役立ちます。 配列の length 関数を使用して反復回数を指定し、配列内の現在のインデックスを取得 copyIndex

次のテンプレート例では、配列として渡されるデータベースのフェールオーバー グループを作成します。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "primaryServerName": {
      "type": "string"
    },
    "secondaryServerName": {
      "type": "string"
    },
    "databaseNames": {
      "type": "array",
      "defaultValue": [
        "mydb1",
        "mydb2",
        "mydb3"
      ]
    }
  },
  "variables": {
    "failoverName": "[format('{0}/{1}failovergroups', parameters('primaryServerName'), parameters('primaryServerName'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Sql/servers/failoverGroups",
      "apiVersion": "2015-05-01-preview",
      "name": "[variables('failoverName')]",
      "properties": {
        "readWriteEndpoint": {
          "failoverPolicy": "Automatic",
          "failoverWithDataLossGracePeriodMinutes": 60
        },
        "readOnlyEndpoint": {
          "failoverPolicy": "Disabled"
        },
        "partnerServers": [
          {
            "id": "[resourceId('Microsoft.Sql/servers', parameters('secondaryServerName'))]"
          }
        ],
        "copy": [
          {
            "name": "databases",
            "count": "[length(parameters('databaseNames'))]",
            "input": "[resourceId('Microsoft.Sql/servers/databases', parameters('primaryServerName'), parameters('databaseNames')[copyIndex('databases')])]"
          }
        ]
      }
    }
  ],
  "outputs": {
  }
}

copy要素は配列であるため、リソースに複数のプロパティを指定できます。

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

リソースとプロパティの反復処理を一緒に使用できます。 プロパティの反復処理を名前で参照します。

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

サンプル テンプレート

次の例は、プロパティに複数の値を作成する一般的なシナリオを示しています。

テンプレート 説明
可変数のデータ ディスクを使用した VM のデプロイ 仮想マシンを使用して複数のデータ ディスクをデプロイします。

次のステップ