Ange namn och typ för underordnade resurser i Bicep

Underordnade resurser är resurser som bara finns inom kontexten för en annan resurs. Ett tillägg för virtuella datorer kan till exempel inte finnas utan en virtuell dator. Tilläggsresursen är underordnad den virtuella datorn.

Varje överordnad resurs accepterar endast vissa resurstyper som underordnade resurser. Hierarkin för resurstyper är tillgänglig i Bicep-resursreferensen.

Den här artikeln visar olika sätt att deklarera en underordnad resurs.

Träningsresurser

Om du hellre vill lära dig mer om underordnade resurser via stegvis vägledning kan du läsa Distribuera underordnade resurser och tilläggsresurser med hjälp av Bicep.

Namn och typmönster

I Bicep kan du ange den underordnade resursen antingen inom den överordnade resursen eller utanför den överordnade resursen. De värden som du anger för resursnamnet och resurstypen varierar beroende på hur du deklarerar den underordnade resursen. Det fullständiga namnet och typen matchar dock alltid samma mönster.

Det fullständiga namnet på den underordnade resursen använder mönstret:

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

Om du har fler än två nivåer i hierarkin fortsätter du att upprepa överordnade namn:

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

Den fullständiga typen av underordnad resurs använder mönstret:

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

Om du har fler än två nivåer i hierarkin fortsätter du att upprepa överordnade resurstyper:

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

Om du räknar segmenten mellan / tecken är antalet segment i typen alltid ett fler än antalet segment i namnet.

Inom överordnad resurs

I följande exempel visas den underordnade resursen som ingår i resursegenskapen för den överordnade resursen.

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

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

En kapslad resursdeklaration måste visas på den översta syntaxnivån för den överordnade resursen. Deklarationer kan kapslas godtyckligt djupt, så länge varje nivå är en underordnad typ av överordnad resurs.

När du har definierat i den överordnade resurstypen formaterar du typ- och namnvärdena som ett enda segment utan snedstreck. I följande exempel visas ett lagringskonto med en underordnad resurs för filtjänsten och filtjänsten har en underordnad resurs för filresursen. Filtjänstens namn är inställt default på och dess typ är inställd på fileServices. Filresursens namn har angetts exampleshare och dess typ är inställd på 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'
    }
  }
}

De fullständiga resurstyperna är fortfarande Microsoft.Storage/storageAccounts/fileServices och Microsoft.Storage/storageAccounts/fileServices/shares. Du anger Microsoft.Storage/storageAccounts/ inte eftersom det förutsätts från den överordnade resurstypen och versionen. Den kapslade resursen kan eventuellt deklarera en API-version med hjälp av syntaxen <segment>@<version>. Om den kapslade resursen utelämnar API-versionen används API-versionen för den överordnade resursen. Om den kapslade resursen anger en API-version används den angivna API-versionen.

De underordnade resursnamnen är inställda på default och exampleshare men de fullständiga namnen innehåller de överordnade namnen. Du anger examplestorage inte eller default eftersom de antas från den överordnade resursen.

En kapslad resurs kan komma åt egenskaper för den överordnade resursen. Andra resurser som deklareras i brödtexten i samma överordnade resurs kan referera till varandra med hjälp av de symboliska namnen. En överordnad resurs kanske inte kommer åt egenskaperna för de resurser som den innehåller. Det här försöket skulle orsaka ett cykliskt beroende.

Om du vill referera till en kapslad resurs utanför den överordnade resursen måste den kvalificeras med det innehållande resursnamnet och operatorn :: . Om du till exempel vill mata ut en egenskap från en underordnad resurs:

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

Extern överordnad resurs

I följande exempel visas den underordnade resursen utanför den överordnade resursen. Du kan använda den här metoden om den överordnade resursen inte distribueras i samma mall eller om du vill använda en loop för att skapa fler än en underordnad resurs. Ange den överordnade egenskapen för det underordnade objektet med värdet inställt på det symboliska namnet på den överordnade. Med den här syntaxen måste du fortfarande deklarera den fullständiga resurstypen, men namnet på den underordnade resursen är bara namnet på den underordnade resursen.

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>
}

När den definieras utanför den överordnade resursen formaterar du typen och med snedstreck för att inkludera den överordnade typen och namnet.

I följande exempel visas ett lagringskonto, en filtjänst och en filresurs som alla definieras på rotnivå.

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
}

Att referera till den underordnade resursens symboliska namn fungerar på samma sätt som att referera till den överordnade resursen.

Fullständigt resursnamn utanför överordnat

Du kan också använda det fullständiga resursnamnet och typen när du deklarerar den underordnade resursen utanför den överordnade resursen. Du anger inte den överordnade egenskapen för den underordnade resursen. Eftersom beroendet inte kan härledas måste du ange det explicit.

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
  ]
}

Viktigt

Att ange det fullständiga resursnamnet och typen är inte den rekommenderade metoden. Det är inte lika typsäkert som att använda någon av de andra metoderna. Mer information finns i Linter-regel: använd överordnad egenskap.

Nästa steg