親リソースのエラーを解決する

この記事では、親リソースに依存しているリソースをデプロイするときに起こりうる 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
}