解決父代資源的錯誤

本文說明當部署相依於父代資源的資源時,可能會發生的 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 Database 可能定義如下︰

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

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

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

如果父資源已經存在,而且不是部署在相同的範本中,當 Resource Manager 無法讓子資源與父系產生關聯時,就會發生 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
}