Dependências de recursos no Bicep

Ao implementar recursos, poderá ter de se certificar de que alguns recursos são implementados antes de outros recursos. Por exemplo, precisa de um servidor SQL lógico antes de implementar uma base de dados. Esta relação é estabelecida ao marcar um recurso como dependente do outro recurso. A ordem de implementação de recursos é determinada de duas formas: dependência implícita e dependência explícita

O Azure Resource Manager avalia as dependências entre os recursos e implementa-as na respetiva ordem dependente. Quando os recursos não são dependentes entre si, o Resource Manager implementa-os em paralelo. Só tem de definir dependências para os recursos implementados no mesmo ficheiro Bicep.

Dependência implícita

É criada uma dependência implícita quando uma declaração de recursos referencia outro recurso na mesma implementação. No exemplo seguinte, otherResource obtém uma propriedade de exampleDnsZone. O recurso com o nome otherResource depende implicitamente de exampleDnsZone.

resource exampleDnsZone 'Microsoft.Network/dnszones@2018-05-01' = {
  name: 'myZone'
  location: 'global'
}

resource otherResource 'Microsoft.Example/examples@2023-05-01' = {
  name: 'exampleResource'
  properties: {
    // get read-only DNS zone property
    nameServers: exampleDnsZone.properties.nameServers
  }
}

Um recurso aninhado também tem uma dependência implícita no recurso que contém.

resource myParent 'My.Rp/parentType@2023-05-01' = {
  name: 'myParent'
  location: 'West US'

  // implicit dependency on 'myParent'
  resource myChild 'childType' = {
    name: 'myChild'
  }
}

Um recurso que inclui a propriedade principal tem uma dependência implícita no recurso principal. Depende do recurso principal, não de nenhum dos seus outros recursos subordinados.

O exemplo seguinte mostra uma conta de armazenamento e um serviço de ficheiros. O serviço de ficheiros tem uma dependência implícita na conta de armazenamento.

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
}

Quando existir uma dependência implícita, não adicione uma dependência explícita.

Para obter mais informações sobre recursos aninhados, veja Definir nome e tipo para recursos subordinados no Bicep.

Dependência explícita

Uma dependência explícita é declarada com a dependsOn propriedade . A propriedade aceita uma matriz de identificadores de recursos, pelo que pode especificar mais do que uma dependência. Pode especificar uma dependência de recurso aninhada com o :: operador .

O exemplo seguinte mostra uma zona DNS denominada otherZone que depende de uma zona DNS denominada dnsZone:

resource dnsZone 'Microsoft.Network/dnszones@2018-05-01' = {
  name: 'demoeZone1'
  location: 'global'
}

resource otherZone 'Microsoft.Network/dnszones@2018-05-01' = {
  name: 'demoZone2'
  location: 'global'
  dependsOn: [
    dnsZone
  ]
}

Embora possa estar inclinado a utilizar dependsOn para mapear relações entre os seus recursos, é importante compreender por que motivo o está a fazer. Por exemplo, para documentar como os recursos estão interligados, dependsOn não é a abordagem certa. Após a implementação, o recurso não retém as dependências de implementação nas respetivas propriedades, pelo que não existem comandos ou operações que lhe permitam ver dependências. Definir dependências desnecessárias atrasa o tempo de implementação porque Resource Manager não consegue implementar esses recursos em paralelo.

Embora, por vezes, sejam necessárias dependências explícitas, a necessidade das mesmas é rara. Na maioria dos casos, pode utilizar um nome simbólico para implicar a dependência entre recursos. Se definir dependências explícitas, deve considerar se existe uma forma de removê-la.

Visualizar dependências

O Visual Studio Code fornece uma ferramenta para visualizar as dependências. Abra um ficheiro Bicep no Visual Studio Code e selecione o botão de visualização no canto superior esquerdo. A seguinte captura de ecrã mostra as dependências de uma máquina virtual.

Captura de ecrã a mostrar o visualizador de recursos do Bicep do Visual Studio Code

Passos seguintes

Para obter a sintaxe para implementar um recurso, veja Declaração de recursos no Bicep.