解決父代資源的錯誤
本文說明當部署相依於父代資源的資源時,可能會發生的 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
}