解决父资源的错误

本文介绍部署依赖于父资源的资源时可能遇到的 ParentResourceNotFound 错误。 使用 Bicep 文件或 Azure 资源管理器模板(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 错误。 当子资源的格式不正确时,可能会发生此错误。 或者,如果子资源部署到的资源组不同于父资源的资源组。

解决方案 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
}