Mengatasi kesalahan untuk sumber daya induk

Artikel ini menjelaskan tentang kesalahan ParentResourceNotFound yang mungkin Anda temui saat menyebarkan sumber daya yang bergantung pada sumber daya induk. Kesalahan terjadi saat Anda menyebarkan sumber daya dengan file Bicep atau template Azure Resource Manager (template ARM).

Gejala

Saat menyebarkan sumber daya yang merupakan turunan untuk sumber daya lain, Anda mungkin mendapati kesalahan berikut:

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

Penyebab

Saat satu sumber daya adalah turunan untuk sumber daya lain, sumber daya induk harus ada sebelum sumber daya turunan dibuat. Nama sumber daya anak menentukan koneksi dengan sumber daya induk. Format nama sumber daya anak adalah <parent-resource-name>/<child-resource-name>. Misalnya, SQL Database dapat didefinisikan sebagai:

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

Untuk informasi selengkapnya tentang sumber daya induk dan turunan Bicep, lihat Mengatur nama dan jenis untuk sumber daya anak dalam Bicep.

Jika Anda menyebarkan server dan database pada templat yang sama, tetapi tidak menentukan dependensi pada server, penyebaran database mungkin dimulai sebelum server disebarkan. Hal itu mengakibatkan penyebaran database gagal dengan kesalahan ParentResourceNotFound.

Jika sumber daya induk sudah ada dan tidak disebarkan dalam templat yang sama, Anda akan mendapati kesalahan ParentResourceNotFound ini saat Resource Manager tidak dapat mengaitkan sumber daya anak dengan induk. Kesalahan ini bisa terjadi saat sumber daya anak tidak berada dalam format yang benar. Atau jika sumber daya anak ditempatkan ke grup sumber daya yang berbeda dari grup sumber daya untuk sumber daya induk.

Solusi 1: Disebarkan dalam templat yang sama

Untuk mengatasi kesalahan ini saat sumber daya induk dan turunan disebarkan pada templat yang sama, sertakan dependensi.

Contoh ini menggunakan sumber daya turunan bertumpuk di dalam sumber daya induk dan yang membuat dependensi. Turunan akan mendapatkan jenis sumber daya dan versi API dari sumber daya induk.

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

Untuk informasi selengkapnya tentang dependensi, lihat Deklarasi sumber daya dalam Bicep.

Solusi 2: Disebarkan dalam templat yang berbeda

Untuk mengatasi kesalahan ini saat sumber daya induk disebarkan dalam templat yang berbeda, jangan atur dependensi. Sebagai gantinya, sebarkan sumber daya anak ke grup sumber daya yang sama dan berikan nama sumber daya induk.

Contoh ini menggunakan kata kunci yang sudah ada untuk mereferensikan induk yang ditempatkan di file terpisah. Sumber daya anak menggunakan elemen parent dan nama simbol sumber daya induk.

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
}