Utiliser des scripts de déploiement pour vérifier les propriétés des ressources

Cet article explique comment utiliser Bicep et un script de déploiement pour suspendre un déploiement jusqu’à ce qu’une propriété de ressource retourne une valeur spécifique. Vous pouvez utiliser cette technique pour vous assurer qu'un déploiement réussit si la ressource déployée indique à Azure Resource Manager qu'elle est prête, même si les ressources sous-jacentes ne le sont pas. Dans ce cas, la ressource déployée n’est pas encore prête à interagir avec le reste du déploiement, ce qui signifie qu’une pause est requise.

Cet article utilise un scénario Azure Virtual WAN pour illustrer la technique. Les fichiers suivants incluent une vérification des ressources et une implémentation de pause :

Vous pouvez adapter les fichiers à votre déploiement. Pour vous aider, le module azResourceStateCheck.bicep est paramétré. La dependsOn propriété est utilisée dans orchestration.bicep pour vous assurer que le déploiement du module vwanvhcs.bicep dépend du déploiement du module azResourceStateCheck.bicep.

Architecture

Diagramme montrant l'architecture du script de déploiement Bicep.

Téléchargez un fichier Visio de cette architecture.

Passez en revue et téléchargez les exemples de code dans GitHub pour cette architecture.

  1. Envoyez le fichier orchestration.bicep à Resource Manager pour le déploiement au niveau de l’abonnement.

    Note

    Vous pouvez obtenir ce fichier Bicep et les autres fichiers utilisés pour cet exemple à partir du répertoire infra/samples/deployment-scripts-property-check directory. Une organisation partielle des fichiers dans le dépôt apparaît sur le côté droit du diagramme d’architecture.

  2. Le fichier orchestration.bicep crée un groupe de ressources dans l’étendue de l’abonnement.

  3. Le fichier orchestration.bicep déploie les Virtual WAN et les réseaux virtuels spoke.

    • orchestration.bicep déploie le module vwan.bicep qui déploie le Virtual WAN dans l’étendue du groupe de ressources.

    • orchestration.bicep déploie le module vnet.bicep qui déploie les réseaux virtuels dans l’étendue du groupe de ressources.

    Les réseaux virtuels Virtual WAN et spoke sont déployés en parallèle, car Bicep les considère comme indépendants les uns des autres. Les dépendances déterminent l’ordre du déploiement dans Bicep. Une ressource est déployée avant toute ressource qui dépend de celle-ci. Pour plus d’informations sur les dépendances de ressources dans Bicep, notamment les dépendances explicites et implicites, consultez Dépendances de ressources dans Bicep.

  4. Le fichier orchestration.bicep déploie le module vwanhub.bicep, qui déploie le hub Virtual WAN dans l’étendue du groupe de ressources. Le hub dépend implicitement de l’Virtual WAN, ce qui signifie que le déploiement du hub se produit uniquement une fois le déploiement Virtual WAN terminé.

  5. Le fichier orchestration.bicep implémente le module azResourceStateCheck.bicep, qui crée une identité managée assignée par l'utilisateur et assigne le rôle Reader du contrôle d'accès en fonction du rôle (RBAC) à Azure au groupe de ressources.

  6. Le module azResourceStateCheck.bicep déploie la ressource de script de déploiement.

  7. La ressource de script de déploiement utilise l’identité managée affectée par l’utilisateur pour l’authentification Resource Manager. La ressource exécute ensuite le script de déploiement PowerShell, Invoke-AzResourceStateCheck.ps1. Pour plus d’informations sur les scripts de déploiement, consultez Utiliser des scripts de déploiement dans Bicep.

    Le script interroge la propriété Virtual WAN hub routingState pour déterminer si la valeur est Provisioned :

    1. Si la valeur de la propriété n’est pas Provisioned, le script s’interrompt pendant une durée spécifiée par un jeu de paramètres dans le fichier orchestration.bicep et est passé au module azResourceStateCheck.bicep. Le script vérifie ensuite à nouveau la valeur de la routingState propriété.

      Le script répète le cycle de pause et de vérification. Un paramètre dans le fichier orchestration.bicep détermine le nombre maximal d’itérations. Si la valeur de la propriété n'est pas Provisioned après le nombre maximal d'itérations, le script génère une exception et se ferme, ce qui entraîne l'arrêt et l'échec du reste du déploiement Bicep.

    2. Si la valeur de la propriété est Provisioned, le script de déploiement s’arrête avec un code (0)de réussite.

  8. Si le script de déploiement réussit, le fichier orchestration.bicep déploie le module vwanvhcs.bicep, qui crée les connexions entre les réseaux virtuels spoke et le hub Virtual WAN.

    La définition du module vwanvhcs.bicep qui se trouve dans orchestration.bicep a une dependsOn clause qui fait en sorte que vwanvhcs.bicep dépend explicitement de l’achèvement réussi du module azResourceStateCheck.bicep. Par conséquent, les connexions sont créées uniquement si la routingState propriété est Provisioned.

    Le module vwanvhcs.bicep déploie les connexions de hub Virtual WAN de manière séquentielle, plutôt qu'en parallèle, car le déploiement parallèle n'est pas pris en charge pour un hub Virtual WAN unique. Pour définir la taille du lot sur 1, le module utilise le décorateur Bicep batchSize, @batchSize(1). Ce décorateur garantit que les connexions sont établies successivement.

Détails du scénario

Les principales parties de cette architecture sont le module azResourceStateCheck.bicep, qui déploie la ressource de script de déploiement et le script de déploiement associé Invoke-AzResourceStateCheck.ps1, qui est un fichier PowerShell. Le module utilise le script de déploiement pour vérifier la valeur d’une propriété de ressource. Dans cet exemple, la ressource est un hub Virtual WAN.

Vous pouvez utiliser dependsOn pour qu’un module dépende explicitement d’un autre, car cet environnement est déployé à partir d’un fichier unique qui utilise des modules Bicep. Dans cet exemple, le module dependsOn vwanvhcs.bicep dépend du module azResourceStateCheck.bicep.

L’extrait suivant de orchestration.bicep montre dependsOn en utilisation.

@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
  }
}

La vérification des ressources est requise, car les hubs Virtual WAN déployés ne sont pas prêts à être utilisés tant que la propriété routingState a la valeur de Provisioned. Virtual WAN hubs signalent le déploiement réussi vers Resource Manager afin que le moteur de déploiement continue de déployer. Un nouveau hub Virtual WAN devient opérationnel une fois que le routeur Virtual WAN hub est approvisionné dans le hub créé. Ce processus prend environ 15 minutes. Ce comportement est visible dans la capture d’écran suivante d’un nouveau hub Virtual WAN. La capture d’écran montre un état de hub de Succeeded mais un état de routage de Provisioning.

Screenshot d’un hub Virtual WAN nouvellement déployé. L’état du hub est Réussi et l’état du routage est en cours de provisionnement.

Si vous essayez de déployer le module vwanvhcs.bicep avant que la valeur routingState ne soit Provisioned, la création de la connexion échoue et le déploiement global échoue. Tant que le routeur n’est pas configuré, les tentatives de redéploiement échouent également.

La capture d'écran suivante montre un exemple du journal des scripts de déploiement lors des vérifications de routingState du hub de WAN virtuel. Le journal montre des contrôles répétitifs de la propriété qui renvoient une valeur autre que Provisioned.

Capture d'écran qui affiche le script de déploiement interrogeant la propriété routingState du hub Virtual WAN.

La capture d’écran suivante montre que la valeur passe à Provisioned.

Screenshot qui indique l’achèvement du script de déploiement lorsque la propriété Virtual WAN hub routingState passe à Provisioned.

Si la valeur ne passe pas à Provisioned après le nombre maximal d'itérations, le script génère une exception, ce qui signale l'échec de la ressource de script à Resource Manager. Le moteur de déploiement Resource Manager échoue et arrête le déploiement, car l'exception suggère qu'il existe un problème avec la ressource Azure qui nécessite la résolution des problèmes. Pour plus d’informations, consultez le script Invoke-AzResourceStateCheck.ps1 suivant.

[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."
}

Contributors

Microsoft conserve cet article. Les contributeurs suivants ont écrit cet article.

Auteur principal :

Autre contributeur :

Pour afficher les profils LinkedIn non publics, connectez-vous à LinkedIn.

Étapes suivantes