解决父资源的错误
本文介绍部署依赖于父资源的资源时可能遇到的 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
}