Resolver erros dos recursos principais

Este artigo descreve o ParentResourceNotFound erro que poderá obter ao implementar um recurso dependente de um recurso principal. O erro ocorre quando implementa recursos com um ficheiro Bicep ou um modelo de Resource Manager do Azure (modelo arm).

Sintoma

Ao implementar um recurso subordinado noutro recurso, poderá receber o seguinte erro:

Code=ParentResourceNotFound,
Message=Can not perform requested operation on nested resource. Parent resource 'exampleserver' not found."

Causa

Quando um recurso é subordinado a outro recurso, o recurso principal tem de existir antes de o recurso subordinado ser criado. O nome do recurso subordinado define a ligação com o recurso principal. O nome do recurso subordinado está no formato <parent-resource-name>/<child-resource-name>. Por exemplo, um Base de Dados SQL pode ser definido como:

resource sqlDatabase 'Microsoft.Sql/servers/databases@2022-02-01-preview' = {
  name: '${sqlServerName}/${databaseName}'
  ...
}

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

Se implementar o servidor e a base de dados no mesmo modelo, mas não especificar uma dependência no servidor, a implementação da base de dados poderá ser iniciada antes de o servidor ser implementado. Isto faz com que a implementação da base de dados falhe com o ParentResourceNotFound erro.

Se o recurso principal já existir e não estiver implementado no mesmo modelo, receberá o ParentResourceNotFound erro quando Resource Manager não consegue associar o recurso subordinado a um elemento principal. Este erro pode ocorrer quando o recurso subordinado não está no formato correto. Ou se o recurso subordinado for implementado num grupo de recursos diferente do grupo de recursos do recurso principal.

Solução 1: implementado no mesmo modelo

Para resolver este erro quando os recursos principais e subordinados são implementados no mesmo modelo, utilize uma dependência.

Este exemplo utiliza um recurso subordinado aninhado no recurso principal e cria a dependência. O subordinado obtém o tipo de recurso e a versão da API a partir do recurso principal.

resource sqlServer 'Microsoft.Sql/servers@2022-02-01-preview' = {
  name: sqlServerName
  properties: {
    ...
  }
  resource sqlDatabase 'databases' = {
    name: databaseName
    ...
  }
}

Para obter mais informações sobre dependências, veja Declaração de recursos no Bicep.

Solução 2: implementada em modelos diferentes

Para resolver este erro quando o recurso principal foi implementado num modelo diferente, não defina uma dependência. Em vez disso, implemente o menor no mesmo grupo de recursos e forneça o nome do recurso principal.

Este exemplo utiliza a palavra-chave existente para referenciar um elemento principal que foi implementado num ficheiro separado. O recurso subordinado utiliza o parent elemento e o nome simbólico do recurso principal.

param location string = resourceGroup().location
param sqlServerName string
param databaseName string

resource sqlServer 'Microsoft.Sql/servers@2022-02-01-preview' existing = {
  name: sqlServerName
}

resource sqlDatabase 'Microsoft.Sql/servers/databases@2022-02-01-preview' = {
  parent: sqlServer
  name: databaseName
  location: location
}