Menggunakan skrip penyebaran untuk memeriksa properti sumber daya

Artikel ini menjelaskan cara menggunakan Bicep dan skrip penyebaran untuk menjeda penyebaran hingga properti sumber daya mengembalikan nilai tertentu. Anda dapat menggunakan teknik ini untuk memastikan bahwa penyebaran berhasil jika sumber daya yang disebarkan melaporkan ke Azure Resource Manager bahwa itu siap, tetapi sumber daya yang mendasar tidak. Dalam hal ini, sumber daya yang disebarkan belum siap untuk berinteraksi dengan sisa penyebaran, yang berarti diperlukan jeda.

Artikel ini menggunakan skenario Azure Virtual WAN untuk menunjukkan teknik. File berikut mencakup pemeriksaan sumber daya dan implementasi jeda:

Anda dapat menyesuaikan file untuk penyebaran Anda. Untuk membantu Anda, modul azResourceStateCheck.bicep diparameterkan. Properti dependsOn digunakan dalam orchestration.bicep untuk memastikan bahwa penyebaran modul vwanvhcs.bicep bergantung pada penyebaran modul azResourceStateCheck.bicep.

Architecture

Diagram yang memperlihatkan arsitektur Bicep dan skrip deployment.

Unduh file Visio dari arsitektur ini.

Tinjau dan unduh sampel kode di GitHub untuk arsitektur ini.

  1. Ajukan file orchestration.bicep untuk diterapkan ke Resource Manager di cakupan langganan.

    Note

    Anda bisa mendapatkan file Bicep ini dan file lain yang digunakan untuk contoh ini dari direktori infra/samples/deployment-scripts-property-check. Organisasi parsial file dalam repositori muncul di sisi kanan diagram arsitektur.

  2. File orchestration.bicep membuat grup sumber daya di cakupan langganan.

  3. File orchestration.bicep menyebarkan Virtual WAN dan jaringan virtual "spoke".

    • orchestration.bicep menyebarkan modul vwan.bicep, yang menyebarkan Virtual WAN di cakupan grup sumber daya.

    • orchestration.bicep mengelola modul vnet.bicep, yang menyebarkan jaringan virtual di lingkup grup sumber daya.

    Jaringan Virtual WAN dan jaringan virtual spoke diterapkan secara paralel karena Bicep menganggapnya saling independen. Dependensi menentukan urutan penyebaran di Bicep. Sebuah sumber daya diterapkan sebelum ada sumber daya lain yang bergantung padanya. Untuk informasi selengkapnya tentang dependensi sumber daya di Bicep, termasuk dependensi eksplisit dan implisit, lihat Dependensi sumber daya di Bicep.

  4. File orchestration.bicep melakukan penyebaran modul vwanhub.bicep, yang melakukan penyebaran hub Virtual WAN pada cakupan grup sumber daya. Hub bergantung secara implisit pada Virtual WAN, yang berarti bahwa penyebaran hub terjadi hanya setelah penyebaran Virtual WAN selesai.

  5. File orchestration.bicep menyebarkan modul azResourceStateCheck.bicep, yang membuat identitas terkelola yang ditetapkan pengguna dan menetapkan peran Pembaca kontrol akses berbasis peran (RBAC) Azure ke grup sumber daya.

  6. Modul azResourceStateCheck.bicep menyebarkan sumber daya skrip penyebaran.

  7. Sumber daya skrip penyebaran menggunakan identitas terkelola yang ditetapkan pengguna untuk autentikasi Resource Manager. Sumber daya tersebut kemudian menjalankan skrip penyebaran PowerShell, Invoke-AzResourceStateCheck.ps1. Untuk informasi selengkapnya tentang skrip penyebaran, lihat Menggunakan skrip penyebaran di Bicep.

    Skrip melakukan pemantauan properti routingState hub Virtual WAN untuk menentukan apakah nilainya Provisioned:

    1. Jika nilai properti tidak Provisioned, skrip akan dijeda selama durasi yang ditentukan oleh parameter yang ditetapkan dalam file orchestration.bicep dan diteruskan ke modul azResourceStateCheck.bicep. Skrip kemudian memeriksa routingState nilai properti lagi.

      Skrip mengulangi siklus jeda dan pemeriksaan. Parameter dalam file orchestration.bicep menentukan jumlah maksimum iterasi. Jika nilai properti tidak Provisioned setelah jumlah maksimum iterasi, skrip menghasilkan pengecualian dan keluar, yang menyebabkan sisa penyebaran Bicep berhenti dan gagal.

    2. Jika nilai properti adalah Provisioned, skrip penyebaran akan keluar dengan kode keberhasilan (0).

  8. Jika skrip penyebaran berhasil, file orchestration.bicep menyebarkan modul vwanvhcs.bicep, yang membuat koneksi antara jaringan virtual spoke dan hub Virtual WAN.

    Definisi modul vwanvhcs.bicep yang ada di orchestration.bicep memiliki dependsOn klausul yang menyebabkan vwanvhcs.bicep bergantung secara eksplisit pada keberhasilan penyelesaian modul azResourceStateCheck.bicep. Oleh karena itu, koneksi dibuat hanya jika routingState properti adalah Provisioned.

    Modul vwanvhcs.bicep menyebarkan koneksi hub Virtual WAN secara berurutan, bukan secara paralel, karena penyebaran paralel tidak didukung untuk satu hub Virtual WAN. Untuk mengatur ukuran batch ke 1, modul menggunakan dekorator Bicep batchSize, @batchSize(1). Dekorator ini memastikan bahwa koneksi disebarkan satu per satu.

Detail skenario

Bagian utama dari arsitektur ini adalah modul azResourceStateCheck.bicep, yang menyebarkan sumber daya skrip penyebaran, dan skrip penyebaran terkait Invoke-AzResourceStateCheck.ps1, yang merupakan file PowerShell. Modul menggunakan skrip penyebaran untuk memeriksa nilai properti sumber daya. Dalam contoh ini, sumber daya adalah hub Virtual WAN.

Anda dapat menggunakan dependsOn untuk membuat satu modul bergantung secara eksplisit pada modul lain karena lingkungan ini disebarkan dari satu file yang menggunakan modul Bicep. Dalam contoh ini, dependsOn membuat modul vwanvhcs.bicep bergantung pada modul azResourceStateCheck.bicep.

Kutipan berikut dari orchestration.bicep menunjukkan dependsOn sedang digunakan:

@description('The API version of the Azure Resource you need to use to check the state of a property.')
param parAzResourceApiVersion string = '2022-01-01'

@description('The property of the resource that you need to check. This is a property inside the `properties` bag of the resource that's captured from a GET call to the Resource ID.')
param parAzResourcePropertyToCheck string = 'routingState'

@description('The value of the property of the resource that you need to check.')
param parAzResourceDesiredState string = 'Provisioned'

@description('The duration that the deployment script waits between check or polling requests to check the property and its state, if it is not in its desired state. The duration defaults to `30` seconds.')
param parWaitInSecondsBetweenIterations int = 30

module modVWANHub 'modules/vwanHub.bicep' = {
  scope: rsg
  name: 'deployVWANHub'
  params: {
    region: region
    regionNamePrefix: regionNamePrefix
    defaultTags: defaultTags
    vwanHubCIDR: vwanHubCIDR
    vwanName: modVWAN.outputs.vwanName
  }
}

module modVWANHubRouterCheckerDeploymentScript 'modules/azResourceStateCheck.bicep' = {
  scope: rsg
  name: 'deployVWANHubRouterChecker'
  params: {
    parLocation: region
    parAzResourceId: modVWANHub.outputs.outVwanVHubId
    parAzResourceApiVersion: parAzResourceApiVersion
    parAzResourcePropertyToCheck: parAzResourcePropertyToCheck
    parAzResourceDesiredState: parAzResourceDesiredState
    parMaxIterations: parMaxIterations
    parWaitInSecondsBetweenIterations: parWaitInSecondsBetweenIterations
  }
}

module modVWanVhubVnetConnections 'modules/vwanVhcs.bicep' = {
  dependsOn: [
    modVWANHubRouterCheckerDeploymentScript
  ]
  scope: rsg
  name: 'deployConnectVnetsToVWANVHub'
  params: {
    vnets: vnets
    regionNamePrefix: regionNamePrefix
  }
}

Pemeriksaan sumber daya diperlukan karena hub Virtual WAN yang disebarkan belum siap digunakan hingga properti routingState memiliki nilai Provisioned. Virtual WAN hub melaporkan penyebaran yang berhasil ke Resource Manager sehingga mesin penyebaran melanjutkan penyebaran. Hub Virtual WAN baru menjadi beroperasi setelah router hub Virtual WAN disediakan ke hub yang dibuat. Proses ini memakan waktu sekitar 15 menit. Perilaku ini dapat dilihat dalam cuplikan layar hub Virtual WAN baru berikut. Cuplikan layar menunjukkan status hub Succeeded tetapi status perutean Provisioning.

Cuplikan layar hub Virtual WAN yang baru saja disebarkan. Status hub: Berhasil dan status perutean: Sedang diterapkan.

Jika Anda mencoba menyebarkan modul vwanvhcs.bicep sebelum routingState nilainya adalah Provisioned, pembuatan koneksi gagal dan penyebaran keseluruhan gagal. Sampai router diprovisikan, upaya penyebaran ulang juga gagal.

Cuplikan layar berikut menunjukkan contoh log skrip penyebaran selama pemeriksaan routingState hub Virtual WAN. Log menunjukkan pemeriksaan berulang properti yang mengembalikan nilai selain Provisioned.

Screenshot yang menunjukkan skrip penyebaran yang melakukan polling properti routingState hub Virtual WAN.

Cuplikan layar berikut menunjukkan bahwa nilai berubah menjadi Provisioned.

Screenshot yang menunjukkan penyelesaian skrip penyebaran saat properti routingState hub Virtual WAN berubah menjadi Provisioned.

Jika nilai tidak berubah menjadi Provisioned setelah jumlah maksimum iterasi, skrip menghasilkan pengecualian, yang menandakan kegagalan sumber daya skrip ke Resource Manager. Mesin penyebaran Resource Manager gagal dan menghentikan penyebaran karena pengecualian menunjukkan bahwa ada masalah dengan sumber daya Azure yang memerlukan pemecahan masalah. Untuk informasi selengkapnya, lihat skrip Invoke-AzResourceStateCheck.ps1 berikut ini.

[CmdletBinding()]
param (
  [string]
  $azResourceResourceId,

  [string]
  $apiVersion = "2022-05-01",

  [string]
  $azResourcePropertyToCheck = "provisioningState",

  [string]
  $azResourceDesiredState = "Provisioned",

  [int]
  $waitInSecondsBetweenIterations = 30,

  [int]
  $maxIterations = 30
)

$totalTimeoutCalculation = $waitInSecondsBetweenIterations * $maxIterations

$azResourcePropertyExistenceCheck = Invoke-AzRestMethod -Method GET -Path "$($azResourceResourceId)?api-version=$($apiVersion)"

if ($azResourcePropertyExistenceCheck.StatusCode -ne "200") {
  $DeploymentScriptOutputs["azResourcePropertyState"] = "Not Found"
  throw "Unable to get Azure Resource - $($azResourceResourceId). Likely it doesn't exist. Status code: $($azResourcePropertyExistenceCheck.StatusCode) Error: $($azResourcePropertyExistenceCheck.Content)"
}

$azResourcePropertyStateResult = "Unknown"
$iterationCount = 0

do {
  $azResourcePropertyStateGet = Invoke-AzRestMethod -Method GET -Path "$($azResourceResourceId)?api-version=$($apiVersion)"
  $azResourcePropertyStateJsonConverted = $azResourcePropertyStateGet.Content | ConvertFrom-Json -Depth 10
  $azResourcePropertyStateResult = $azResourcePropertyStateJsonConverted.properties.$($azResourcePropertyToCheck)

  if ($azResourcePropertyStateResult -ne $azResourceDesiredState) {
    Write-Host "Azure Resource Property ($($azResourcePropertyToCheck)) is not in $($azResourceDesiredState) state. Waiting $($waitInSecondsBetweenIterations) seconds before checking again. Iteration count: $($iterationCount)"
    Start-Sleep -Seconds $waitInSecondsBetweenIterations
    $iterationCount++
  }
} while (
  $azResourcePropertyStateResult -ne $azResourceDesiredState -and $iterationCount -ne $maxIterations
)

if ($azResourcePropertyStateResult -eq $azResourceDesiredState) {
  Write-Host "Azure Resource Property ($($azResourcePropertyToCheck)) is now in $($azResourceDesiredState) state."
  $DeploymentScriptOutputs["azResourcePropertyState"] = "$($azResourceDesiredState)"
}

if ($iterationCount -eq $maxIterations -and $azResourcePropertyStateResult -ne $azResourceDesiredState) {
  $DeploymentScriptOutputs["azResourcePropertyState"] = "Azure Resource Property ($($azResourcePropertyToCheck)) is still not in desired state of $($azResourceDesiredState). Timeout reached of $($totalTimeoutCalculation) seconds."
  throw "Azure Resource Property ($($azResourcePropertyToCheck)) is still not in $($azResourceDesiredState) state after $($totalTimeoutCalculation) seconds."
}

Kontributor

Microsoft mempertahankan artikel ini. Kontributor berikut menulis artikel ini.

Penulis utama:

Kontributor lainnya:

Untuk melihat profil LinkedIn nonpublik, masuk ke LinkedIn.

Langkah berikutnya