解決父代資源的錯誤

本文說明當部署相依於父代資源的資源時,可能會發生 ParentResourceNotFound 錯誤。 當您使用 Azure Resource Manager 範本 (ARM 範本) 或 Bicep 檔案部署資源時,會發生此錯誤。

徵狀

當部署是另一個資源的子系資源時,您可能會遇到下列錯誤:

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

原因

當某資源為另一個資源的子系資源時,父代資源必須在建立子系資源之前就存在。 子資源的名稱會定義與父代名稱的連線。 子資源名稱的格式如下︰<parent-resource-name>/<child-resource-name>。 例如,SQL Database 可能定義如下︰

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

如需關於 Bicep 父代和子系資源的詳細資訊,請參閱在 Bicep 中設定子系資源的名稱和類型

如果您在相同的範本中部署伺服器和資料庫,但未在伺服器上指定相依性,則可在部署伺服器之前啟動資料庫部署。 這會導致具有 ParentResourceNotFound 錯誤的資料庫部署失敗。

如果父代資源已經存在,但未部署在相同的範本中,當資源管理員無法讓子系資源與父代產生關聯時,您會發生 ParentResourceNotFound 錯誤。 當子系資源的格式不正確時,可能會發生此錯誤。 或者,如果子系資源部署至與父代資源的資源群組不同的資源群組。

解決方案 1 - 部署在相同的範本中

當父代和子系資源部署在相同的範本時,若要解決這個錯誤,請使用相依性。

此範例會使用父代資源內的巢狀子系資源,這資源會建立相依性。 子系資源會從父代資源取得資源類型和 API 版本。

resource sqlServer 'Microsoft.Sql/servers@2021-05-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@2021-05-01-preview' existing = {
  name: sqlServerName
}

resource sqlDatabase 'Microsoft.Sql/servers/databases@2021-05-01-preview' = {
  parent: sqlServer
  name: databaseName
  location: location
}