Risolvere gli errori delle risorse padre

Questo articolo descrive l'errore ParentResourceNotFound che può verificarsi durante l’implementazione di una risorsa che dipende da una risorsa padre. L'errore si verifica quando si implementano risorse con un file Bicep o un modello di Azure Resource Manager (modello ARM).

Sintomo

Quando si implementa una risorsa che è un elemento figlio di un'altra risorsa, potrebbe verificarsi il seguente l'errore:

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

Causa

Quando una risorsa è l'elemento figlio di un'altra risorsa, la risorsa padre deve essere già esistente prima di creare la risorsa figlio. Il nome della risorsa figlio definisce la connessione con la risorsa padre. Il nome della risorsa figlio è nel formato <parent-resource-name>/<child-resource-name>. Ad esempio, un database SQL può essere definito come segue:

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

Per ulteriori informazioni sulle risorse padre e figlio di Bicep, consultare Impostare il nome e il tipo di risorse figlio in Bicep.

Se si implementano sia il server che il database nello stesso modello, ma senza specificare una dipendenza nel server, l’implementazione del database potrebbe essere avviata prima che il server sia stato implementato. Ciò fa sì che l’implementazione del database fallisca e che l'errore ParentResourceNotFound si verifichi.

Se la risorsa padre esiste già e non è stata implementata nello stesso modello, l’errore ParentResourceNotFound si verifica quando Resource Manager non può associare la risorsa figlio a un elemento padre. Questo errore può verificarsi quando la risorsa figlio non è nel formato corretto. O se la risorsa figlio viene implementata in un gruppo di risorse diverso dal gruppo di risorse della la risorsa padre.

Soluzione 1: Risorse implementate nello stesso modello

Per risolvere questo errore quando la risorsa figlio e la risorsa padre sono implementate nello stesso modello, usare una dipendenza.

Questo esempio usa una risorsa figlio annidata all'interno della risorsa padre per creare la dipendenza. L'elemento figlio ottiene il tipo di risorsa e la versione dell'API dalla risorsa padre.

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

Per ulteriori informazioni sulle dipendenze, consultare Dichiarazione di risorsa in Bicep.

Soluzione 2: Risorse implementate in modelli diversi

Per risolvere questo errore quando la risorsa padre è stata implementata in precedenza in un altro modello, non impostare una dipendenza. Distribuire invece la risorsa figlio nello stesso gruppo di risorse e specificare il nome della risorsa padre.

In questo esempio viene usata la parola chiave esistente per referenziare una risorsa padre implementata in un altro file. La risorsa figlio usa l'elemento parent e il nome simbolico della risorsa padre.

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
}