Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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
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.
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.
Le fichier orchestration.bicep crée un groupe de ressources dans l’étendue de l’abonnement.
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.
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é.
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.
Le module azResourceStateCheck.bicep déploie la ressource de script de déploiement.
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
routingStatepour déterminer si la valeur estProvisioned: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 laroutingStateproprié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
Provisionedaprè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.Si la valeur de la propriété est
Provisioned, le script de déploiement s’arrête avec un code(0)de réussite.
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
dependsOnclause 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 laroutingStatepropriété estProvisioned.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 BicepbatchSize,@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.
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.
La capture d’écran suivante montre que la valeur 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 :
- Jack Tracey | Architecte senior des solutions cloud
Autre contributeur :
- Gary McMahon | Architecte senior des solutions cloud
Pour afficher les profils LinkedIn non publics, connectez-vous à LinkedIn.
Étapes suivantes
- Fichiers de l’exemple dans le référentiel Azure/CAE-Bits
- Utiliser des scripts de déploiement dans Bicep
- Module Learn : Étendre des modèles Bicep et ARM à l’aide de scripts de déploiement
- Tout ce que vous vouliez savoir sur les exceptions
- Migrate vers Virtual WAN
- Dépendances de ressources dans Bicep
- Documentation Bicep