Usuwanie błędów dotyczących zasobów nadrzędnych

W tym artykule opisano ParentResourceNotFound błąd, który można uzyskać podczas wdrażania zasobu zależnego od zasobu nadrzędnego. Błąd występuje podczas wdrażania zasobów przy użyciu pliku Bicep lub szablonu usługi Azure Resource Manager (szablon usługi ARM).

Objaw

Podczas wdrażania zasobu podrzędnego w innym zasobie może wystąpić następujący błąd:

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

Przyczyna

Gdy jeden zasób jest elementem podrzędnym do innego zasobu, przed utworzeniem zasobu podrzędnego musi istnieć zasób nadrzędny. Nazwa zasobu podrzędnego definiuje połączenie z zasobem nadrzędnym. Nazwa zasobu podrzędnego ma format <parent-resource-name>/<child-resource-name>. Na przykład SQL Database można zdefiniować jako:

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

Aby uzyskać więcej informacji na temat zasobów nadrzędnych i podrzędnych Bicep, zobacz Set name and type for child resources in Bicep (Ustawianie nazwy i typu zasobów podrzędnych w elemecie Bicep).

Jeśli wdrożysz serwer i bazę danych w tym samym szablonie, ale nie określisz zależności od serwera, wdrożenie bazy danych może rozpocząć się przed wdrożeniem serwera. Powoduje to niepowodzenie wdrożenia bazy danych z powodu błędu ParentResourceNotFound .

Jeśli zasób nadrzędny już istnieje i nie został wdrożony w tym samym szablonie, zostanie wyświetlony ParentResourceNotFound błąd, gdy Resource Manager nie może skojarzyć zasobu podrzędnego z elementem nadrzędnym. Ten błąd może wystąpić, gdy zasób podrzędny nie jest w poprawnym formacie. Lub jeśli zasób podrzędny jest wdrażany w grupie zasobów innej niż grupa zasobów dla zasobu nadrzędnego.

Rozwiązanie 1. Wdrożone w tym samym szablonie

Aby rozwiązać ten błąd, gdy zasoby nadrzędne i podrzędne są wdrażane w tym samym szablonie, użyj zależności.

W tym przykładzie użyto zagnieżdżonego zasobu podrzędnego w ramach zasobu nadrzędnego, który tworzy zależność. Element podrzędny pobiera typ zasobu i wersję interfejsu API z zasobu nadrzędnego.

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

Aby uzyskać więcej informacji na temat zależności, zobacz Deklaracja zasobu w elemencie Bicep.

Rozwiązanie 2: Wdrożone w różnych szablonach

Aby rozwiązać ten błąd, gdy zasób nadrzędny został wdrożony w innym szablonie, nie ustawiaj zależności. Zamiast tego wdróż element podrzędny w tej samej grupie zasobów i podaj nazwę zasobu nadrzędnego.

W tym przykładzie użyto istniejącego słowa kluczowego, aby odwołać się do elementu nadrzędnego wdrożonego w osobnym pliku. Zasób podrzędny używa parent elementu i symbolicznej nazwy zasobu nadrzędnego.

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
}