Устранение ошибок, связанных с родительскими ресурсами

В этой статье описана ошибка 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. Развертывание в разных шаблонах

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

В этом примере ключевое слово existing используется для ссылки на родительский ресурс, развернутый в отдельном файле. Дочерний ресурс использует элемент 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
}