Controlar a ordem de implantação especificando dependências

Concluído

Digamos que você queira implantar um conjunto de recursos no Azure, mas apenas se outro recurso já estiver implantado. Nesse ponto, você precisa comunicar no modelo que um recurso depende de outro.

Confira alguns aspectos a serem considerados:

  • Algo precisa existir antes que algo mais possa ser implantado.

    Por exemplo, digamos que você necessite de um cofre de chaves no Azure Key Vault para buscar segredos que você precisa carregar em uma VM (máquina virtual). Ao implantar o cofre de chaves, você pode, ao mesmo tempo, implantar o segredo dele no mesmo modelo. No entanto, o cofre de chaves precisa ser implantado antes do segredo. Portanto, o segredo depende da existência do cofre de chaves. O cofre de chaves e o segredo são implantados em série, um após o outro, começando com o cofre de chaves, devido à dependência.

  • Posso confiar em como as coisas funcionam no Azure Resource Manager?

    Seu primeiro pensamento ao verificar se outro recurso existe pode ser usar o Azure PowerShell ou a CLI do Azure para verificar a existência de um recurso. Uma solução mais automatizada usa a idempotência integrada do Resource Manager. Se o Resource Manager detectar um recurso definido em um modelo já existente na nuvem, ele não o reimplantará. Para que essa seja uma abordagem válida, é preciso entender como o Resource Manager faz a verificação.

    Observação

    Quando as identidades de recursos existentes correspondem a algo definido em um modelo, o Azure Resource Manager compara as propriedades. Se as propriedades forem uma correspondência exata, o recurso será deixado sozinho. Caso contrário, o mecanismo fará as alterações, possivelmente reimplantando o recurso.

  • Você pode aninhar recursos dentro de outro recurso.

    Nos seus modelos do Azure Resource Manager, você pode aninhar recursos dentro de outro recurso. Ao aninhar recursos, você define uma relação entre os recursos aninhados e o recurso pai.

Como posso definir dependências entre os recursos do Azure?

Imagine que você deseje garantir que um recurso (por exemplo, uma conta de armazenamento) seja implantado antes de um recurso que precisa dele. Como você pode verificar se a conta de armazenamento dependente existe?

Você pode começar inspecionando o estado atual da sua implantação executando comandos do Azure PowerShell ou da CLI do Azure para verificar a existência da conta de armazenamento. Você também pode verificar se há um constructo do Resource Manager que permite fazer a mesma verificação.

Há um constructo nos modelos do Resource Manager chamado dependsOn. O uso do constructo faz com que os recursos aguardem a conclusão da implantação do recurso apontado.

O que é o constructo dependsOn?

É um par chave-valor que permite definir a ordem de implantação entre os recursos. Às vezes, é preciso garantir que algo exista antes de outro elemento. Por exemplo, talvez você precise ter um banco de dados para ter um aplicativo ou de um recurso secreto para ter um cofre de chaves.

Coloque o constructo dependsOn em um recurso que dependa de outros recursos serem implantados primeiro. Um recurso pode depender de mais de um recurso, razão pela qual o constructo espera uma lista de recursos dependentes como seu valor.

O seguinte exemplo mostra como você pode expressar uma dependência desse tipo em JSON no modelo do ARM:

"resources": [
  {
    "name": "<name of resource that needs to exist first>"
  },
  {
    "name": "someResource",
    "dependsOn": [
      "<name of resource that needs to exist first>"
    ]
  }
]

Nesse exemplo, você está usando o nome do recurso para especificar de qual recurso depende. No entanto, muitos recursos podem ter o mesmo nome. Para garantir que essa comparação faça o que você deseja, use o constructo resourceId() para obter o identificador de recurso exclusivo:

"dependsOn": [
  "resourceId('Microsoft.Network/loadBalancers', variables('nameOfLoadBalancer')))"
]

O código JSON acima constrói uma ID exclusiva, combinando o namespace, o tipo e um nome de variável. Dessa forma, você garante que o recurso dependente correto seja especificado.

O que são recursos filho?

Um recurso filho é aquele que existe apenas no contexto de outro recurso. Um exemplo disso é uma extensão de máquina virtual, que não pode existir sem uma máquina virtual.

Um código típico para uma relação pai-filho em um modelo é semelhante ao seguinte:

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

Essa dependência pai-filho não cria automaticamente uma dependência na qual o pai é implantado antes do filho. Você precisa tornar a dependência explícita.

Portanto, quando você expressar essa relação, adicione um constructo dependsOn, como o seguinte:

"resources": [
  {
    "name": "parent-resource",
    "resources": [{
      "dependsOn": ["parent-resource"],
      "name": "child resource"
    }]
  }
]