子リソースの名前と種類の設定

子リソースとは、別のリソースのコンテキスト内でのみ存在するリソースのことです。 たとえば仮想マシン拡張機能は、仮想マシンなしでは存在できません。 この拡張機能リソースが仮想マシンの子です。

各親リソースは、子リソースとして特定のリソースの種類のみを受け取ります。 子リソースのリソースの種類には、親リソースのリソースの種類が含まれます。 たとえば、Microsoft.Web/sites/configMicrosoft.Web/sites/extensions は、どちらも Microsoft.Web/sites の子リソースです。 許容されるリソースの種類は、親リソースのテンプレート スキーマで指定されます。

Azure Resource Manager テンプレート (ARM テンプレート) では、親リソースの内側または外側に子リソースを指定できます。 リソースの名前とリソースの種類に指定する値は、子リソースが親リソースの内側で定義されているか、外側で定義されているかによって変わります。

ヒント

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

親リソースの内側

次の例は、親リソースの resources プロパティ内に追加された子リソースを示しています。

"resources": [
  {
    <parent-resource>
    "resources": [
      <child-resource>
    ]
  }
]

子リソースの定義の深さは 5 レベルまでです。

親リソースの type 内に type と name の値を定義するときは、スラッシュを使わず 1 つのセグメントとして書式設定します。

"type": "{child-resource-type}",
"name": "{child-resource-name}",

次に示したのは、サブネットを含んだ仮想ネットワークの例です。 仮想ネットワークの resources 配列内にサブネットが含まれていることがわかります。 name が Subnet1 に設定され、type が subnets に設定されています。 子リソースは、親リソースに依存するリソースとしてマークされています。子リソースをデプロイするためには、先に親リソースが存在していなければならないためです。

"resources": [
  {
    "type": "Microsoft.Network/virtualNetworks",
    "apiVersion": "2022-11-01",
    "name": "VNet1",
    "location": "[parameters('location')]",
    "properties": {
      "addressSpace": {
        "addressPrefixes": [
          "10.0.0.0/16"
        ]
      }
    },
    "resources": [
      {
        "type": "subnets",
        "apiVersion": "2022-11-01",
        "name": "Subnet1",
        "dependsOn": [
          "VNet1"
        ],
        "properties": {
          "addressPrefix": "10.0.0.0/24"
        }
      }
    ]
  }
]

完全なリソースの種類は、あくまで Microsoft.Network/virtualNetworks/subnets になります。 親リソースの種類から想定されるため、Microsoft.Network/virtualNetworks/ は不要です。

子リソースの名前は Subnet1 に設定されていますが、完全名には親の名前が含まれます。 VNet1 は、親リソースから引き継がれるので指定する必要はありません。

親リソースの外側

次の例は、親リソースの外側の子リソースを示しています。 親リソースが同じテンプレート内にデプロイされていない場合、または複数の子リソースを作成するために copy を使う場合は、このアプローチを使用することがあります。

"resources": [
  {
    <parent-resource>
  },
  {
    <child-resource>
  }
]

親リソースの外側に定義するときは、スラッシュを使って親の種類と名前を含めるように type と name の値を書式設定します。

"type": "{resource-provider-namespace}/{parent-resource-type}/{child-resource-type}",
"name": "{parent-resource-name}/{child-resource-name}",

次の例に示した仮想ネットワークとサブネットは、どちらもルート レベルで定義されています。 仮想ネットワークの resources 配列内にはサブネットが含まれていないことがわかります。 name が VNet1/Subnet1 に設定され、type が Microsoft.Network/virtualNetworks/subnets に設定されています。 子リソースは、親リソースに依存するリソースとしてマークされています。子リソースをデプロイするためには、先に親リソースが存在していなければならないためです。

"resources": [
  {
    "type": "Microsoft.Network/virtualNetworks",
    "apiVersion": "2022-11-01",
    "name": "VNet1",
    "location": "[parameters('location')]",
    "properties": {
      "addressSpace": {
        "addressPrefixes": [
          "10.0.0.0/16"
        ]
      }
    }
  },
  {
    "type": "Microsoft.Network/virtualNetworks/subnets",
    "apiVersion": "2022-11-01",
    "name": "VNet1/Subnet1",
    "dependsOn": [
      "VNet1"
    ],
    "properties": {
      "addressPrefix": "10.0.0.0/24"
    }
  }
]

次のステップ