Naam en type instellen voor onderliggende resources in Bicep

Onderliggende resources zijn resources die alleen bestaan binnen de context van een andere resource. Een virtuele-machineextensie kan bijvoorbeeld niet bestaan zonder een virtuele machine. De extensieresource is een onderliggend element van de virtuele machine.

Elke bovenliggende resource accepteert alleen bepaalde resourcetypen als onderliggende resources. De hiërarchie van resourcetypen is beschikbaar in de Bicep-resourcereferentie.

In dit artikel worden verschillende manieren beschreven waarop u een onderliggende resource kunt declareren.

Training en bronnen

Zie Onderliggende resources en extensieresources implementeren met bicep als u liever meer wilt weten over onderliggende resources via stapsgewijze instructies.

Naam- en typepatroon

In Bicep kunt u de onderliggende resource opgeven binnen de bovenliggende resource of buiten de bovenliggende resource. De waarden die u opgeeft voor de resourcenaam en het resourcetype variëren afhankelijk van hoe u de onderliggende resource declareert. De volledige naam en het type worden echter altijd omgezet in hetzelfde patroon.

De volledige naam van de onderliggende resource gebruikt het patroon:

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

Als u meer dan twee niveaus in de hiërarchie hebt, herhaalt u bovenliggende namen:

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

Het volledige type van de onderliggende resource gebruikt het patroon:

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

Als u meer dan twee niveaus in de hiërarchie hebt, herhaalt u bovenliggende resourcetypen:

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

Als u de segmenten tussen / tekens telt, is het aantal segmenten in het type altijd één meer dan het aantal segmenten in de naam.

Binnen bovenliggende resource

In het volgende voorbeeld ziet u de onderliggende resource die is opgenomen in de eigenschap resources van de bovenliggende resource.

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

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

Een geneste resourcedeclaratie moet worden weergegeven op het hoogste syntaxisniveau van de bovenliggende resource. Declaraties kunnen willekeurig diep worden genest, zolang elk niveau een onderliggend type van de bovenliggende resource is.

Wanneer deze is gedefinieerd binnen het bovenliggende resourcetype, formatteert u het type en de naamwaarden als één segment zonder schuine streepjes. In het volgende voorbeeld ziet u een opslagaccount met een onderliggende resource voor de bestandsservice en de bestandsservice heeft een onderliggende resource voor de bestandsshare. De naam van de bestandsservice is ingesteld op default en het type is ingesteld op fileServices. De naam van de bestandsshare is ingesteld exampleshare en het type is ingesteld op 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 volledige resourcetypen zijn nog steeds Microsoft.Storage/storageAccounts/fileServices en Microsoft.Storage/storageAccounts/fileServices/shares. U geeft niet op Microsoft.Storage/storageAccounts/ omdat dit wordt verondersteld van het bovenliggende resourcetype en de bovenliggende versie. De geneste resource kan desgewenst een API-versie declareren met behulp van de syntaxis <segment>@<version>. Als de geneste resource de API-versie weglaat, wordt de API-versie van de bovenliggende resource gebruikt. Als de geneste resource een API-versie opgeeft, wordt de opgegeven API-versie gebruikt.

De onderliggende resourcenamen zijn ingesteld op default en, exampleshare maar de volledige namen bevatten de bovenliggende namen. U geeft examplestorage niet op of default omdat ze worden verondersteld van de bovenliggende resource.

Een geneste resource heeft toegang tot eigenschappen van de bovenliggende resource. Andere resources die in de hoofdtekst van dezelfde bovenliggende resource zijn gedeclareerd, kunnen naar elkaar verwijzen met behulp van de symbolische namen. Een bovenliggende resource heeft mogelijk geen toegang tot eigenschappen van de resources die deze bevat. Deze poging zou een cyclische afhankelijkheid veroorzaken.

Als u wilt verwijzen naar een geneste resource buiten de bovenliggende resource, moet deze worden gekwalificeerd met de naam van de betreffende resource en de :: operator. Als u bijvoorbeeld een eigenschap van een onderliggende resource wilt uitvoeren:

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

Externe bovenliggende resource

In het volgende voorbeeld ziet u de onderliggende resource buiten de bovenliggende resource. U kunt deze methode gebruiken als de bovenliggende resource niet in dezelfde sjabloon is geïmplementeerd of als u een lus wilt gebruiken om meer dan één onderliggende resource te maken. Geef de bovenliggende eigenschap op het onderliggende item op met de waarde ingesteld op de symbolische naam van het bovenliggende item. Met deze syntaxis moet u nog steeds het volledige resourcetype declareren, maar de naam van de onderliggende resource is alleen de naam van het onderliggende resourcetype.

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

Wanneer deze is gedefinieerd buiten de bovenliggende resource, formatteert u het type en met slashes zodat het bovenliggende type en de naam worden opgenomen.

In het volgende voorbeeld ziet u een opslagaccount, bestandsservice en bestandsshare die allemaal zijn gedefinieerd op het hoofdniveau.

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
}

Verwijzen naar de symbolische naam van de onderliggende resource werkt op dezelfde wijze als verwijzen naar het bovenliggende item.

Volledige resourcenaam buiten het bovenliggende item

U kunt ook de volledige resourcenaam en het type gebruiken bij het declareren van de onderliggende resource buiten het bovenliggende item. U stelt de bovenliggende eigenschap niet in op de onderliggende resource. Omdat de afhankelijkheid niet kan worden afgeleid, moet u deze expliciet instellen.

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

Belangrijk

Het instellen van de volledige resourcenaam en het type is niet de aanbevolen aanpak. Het is niet zo veilig als het gebruik van een van de andere benaderingen. Zie Linter-regel: bovenliggende eigenschap gebruiken voor meer informatie.

Volgende stappen