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

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

各親リソースは、子リソースとして特定のリソースの種類のみを受け取ります。 リソースの種類の階層は、Bicep リソース リファレンスで確認できます。

この記事では、子リソースを宣言するさまざまな方法を示します。

トレーニング リソース

段階的なガイダンスを通じて子リソースの詳細を学習する場合は、「Bicep を使用して子と拡張機能のリソースをデプロイする」を参照してください。

名前と種類のパターン

Bicep では、親リソースの内側または外側に子リソースを指定できます。 リソースの名前とリソースの種類に指定する値は、子リソースを宣言する方法によって異なります。 ただし、完全な名前と種類は、常に同じパターンに解決されます。

子リソースの完全な名前では、次のパターンが使用されます。

{parent-resource-name}/{child-resource-name}

階層が 3 レベル以上ある場合は、次のように親名を繰り返します。

{parent-resource-name}/{child-level1-resource-name}/{child-level2-resource-name}

子リソースの完全な種類では、次のパターンが使用されます。

{resource-provider-namespace}/{parent-resource-type}/{child-resource-type}

階層が 3 レベル以上ある場合は、次のように親のリソースの種類を繰り返します。

{resource-provider-namespace}/{parent-resource-type}/{child-level1-resource-type}/{child-level2-resource-type}

/ 文字間のセグメントをカウントすると、種類のセグメント数は、常に名前のセグメント数より 1 つ多くなります。

親リソースの内側

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

resource <parent-resource-symbolic-name> '<resource-type>@<api-version>' = {
  <parent-resource-properties>

  resource <child-resource-symbolic-name> '<child-resource-type>' = {
    <child-resource-properties>
  }
}

入れ子になったリソース宣言は、親リソースの構文の最上位レベルに記述する必要があります。 各レベルが親リソースの子の種類である限りは、宣言を任意の深さで入れ子にすることができます。

親リソースの type 内に type と name の値を定義するときは、スラッシュを使わず 1 つのセグメントとして書式設定します。 次の例は、ファイル サービスの子リソースを持つストレージ アカウントを示しています。ファイル サービスには、ファイル共有の子リソースがあります。 ファイル サービスの名前は default に設定され、その種類は fileServices に設定されます。 ファイル共有の名前は exampleshare に設定され、その種類は shares に設定されます。

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

  resource service 'fileServices' = {
    name: 'default'

    resource share 'shares' = {
      name: 'exampleshare'
    }
  }
}

完全なリソースの種類は、Microsoft.Storage/storageAccounts/fileServicesMicrosoft.Storage/storageAccounts/fileServices/shares です。 Microsoft.Storage/storageAccounts/ は親リソースの種類とバージョンから想定されるため不要です。 必要に応じて、入れ子になったリソースを使用すれば、構文 <segment>@<version> を使用して、API バージョンを宣言できます。 入れ子になったリソースで API バージョンが省略される場合は、親リソースの API バージョンが使用されます。 入れ子になったリソースに API バージョンが指定される場合は、指定されたその API バージョンが使用されます。

子リソース名は defaultexampleshare に設定されますが、完全な名前には親名が含まれます。 examplestoragedefault は、親リソースから想定されるので指定する必要はありません。

入れ子になったリソースは、その親リソースのプロパティにアクセスできます。 同じ親リソースの本体内で宣言されたその他のリソースは、シンボリック名を使用することで互いに参照することができます。 親リソースは、それに含まれるリソースのプロパティにアクセスできない場合があり、この試行により循環依存関係が発生します。

親リソースの外部で入れ子になったリソースを参照するには、それを含むリソース名と :: 演算子で修飾する必要があります。 たとえば、子リソースからプロパティを出力します。

output childAddressPrefix string = VNet1::VNet1_Subnet1.properties.addressPrefix

親リソースの外側

次の例は、親リソースの外側の子リソースを示しています。 親リソースが同じテンプレート内にデプロイされていない場合、または複数の子リソースを作成するためにループを使う場合は、このアプローチを使用することがあります。 値を親のシンボリック名に設定して、子の親プロパティを指定します。 この構文では、完全なリソースの種類を宣言する必要がありますが、子リソースの名前は子リソースの名前のみです。

resource <parent-resource-symbolic-name> '<resource-type>@<api-version>' = {
  name: 'myParent'
  <parent-resource-properties>
}

resource <child-resource-symbolic-name> '<child-resource-type>@<api-version>' = {
  parent: <parent-resource-symbolic-name>
  name: 'myChild'
  <child-resource-properties>
}

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

次の例は、ルート レベルで定義されているストレージ アカウント、ファイル サービス、およびファイル共有を示しています。

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

resource service 'Microsoft.Storage/storageAccounts/fileServices@2022-09-01' = {
  name: 'default'
  parent: storage
}

resource share 'Microsoft.Storage/storageAccounts/fileServices/shares@2022-09-01' = {
  name: 'exampleshare'
  parent: service
}

子リソースのシンボリック名の参照は、親を参照する場合と同じように機能します。

親の外側の完全なリソース名

親の外側で子リソースを宣言するときにも、完全なリソース名と種類を使用できます。 子リソースに親プロパティは設定しません。 依存関係は推論できないため、明示的に設定する必要があります。

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

resource service 'Microsoft.Storage/storageAccounts/fileServices@2022-09-01' = {
  name: 'examplestorage/default'
  dependsOn: [
    storage
  ]
}

resource share 'Microsoft.Storage/storageAccounts/fileServices/shares@2022-09-01' = {
  name: 'examplestorage/default/exampleshare'
  dependsOn: [
    service
  ]
}

重要

完全なリソース名と種類を設定する方法は推奨されません。 他の方法の 1 つを使用するほどタイプ セーフではないからです。 詳細については、「リンター ルール: 親プロパティを使用する」を参照してください。

次の手順