Устраняйте ошибки в родительских ресурсах

В этой статье описывается ParentResourceNotFound ошибка, которую можно получить при развертывании ресурса, зависящего от родительского. Ошибка возникает при развертывании ресурсов с помощью файла Bicep или шаблона Azure Resource Manager (шаблона ARM).

Симптом

При развертывании ресурса, который является дочерним в другом ресурсе, может появиться следующая ошибка:

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

Причина

Если один ресурс является дочерним для другого ресурса, родительский ресурс должен существовать перед созданием дочернего ресурса. Имя дочернего ресурса определяет соединение с родительским ресурсом. Имя дочернего ресурса в формате <parent-resource-name>/<child-resource-name>. Например, база данных SQL может быть определена следующим образом:

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

Дополнительные сведения о родительских и дочерних ресурсах Bicep см. в разделе "Задание имени и типа для родительских и дочерних ресурсов в Bicep".

Если вы развертываете сервер и базу данных в одном шаблоне, но не указываете зависимость от сервера, развертывание базы данных может начинаться до развертывания сервера. Это приводит к сбою развертывания базы данных с ошибкой ParentResourceNotFound .

Если родительский ресурс уже существует и не развернут в том же шаблоне, возникает ParentResourceNotFound ошибка, когда Resource Manager не может связать дочерний ресурс с родительским ресурсом. Эта ошибка может произойти, если дочерний ресурс не указан в правильном формате. Или если дочерний ресурс развертывается в группе ресурсов, которая отличается от группы ресурсов, в которой находится родительский ресурс.

Решение 1. Развертывание в том же шаблоне

Чтобы устранить эту ошибку при развертывании родительских и дочерних ресурсов в одном шаблоне, используйте зависимость.

В этом примере используется вложенный в родительский ресурс дочерний ресурс, что создает зависимость. Дочерний объект получает тип ресурса и версию API из родительского ресурса.

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

Для получения дополнительных сведений о зависимостях, обратитесь к разделу Объявление ресурсов в документации Bicep.

Решение 2. Развертывание в разных шаблонах

Чтобы устранить эту ошибку при развертывании родительского ресурса в другом шаблоне, не устанавливайте зависимость. Вместо этого разверните дочерний элемент в той же группе ресурсов и укажите имя родительского ресурса.

В этом примере используется существующее ключевое слово для ссылки на родительский объект, развернутый в отдельном файле. Дочерний ресурс использует элемент parent и символическое имя родительского ресурса.

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
}