Modèle Azure Policy : Déployer des ressources

L’effet deployIfNotExists permet de déployer un modèle Azure Resource Manager (modèle ARM) lors de la création ou de la mise à jour d’une ressource qui n’est pas conforme. Cette approche peut être préférable à l’utilisation de l’effet deny, car elle permet de continuer à créer des ressources tout en garantissant que les modifications nécessaires sont apportées afin de les rendre conformes.

Exemple de définition de stratégie

Cette définition de stratégie utilise l’opérateur field pour évaluer le type de la ressource créée ou mise à jour. Quand cette ressource est un Microsoft.Network/virtualNetworks, la stratégie recherche un observateur réseau à l’emplacement de la ressource nouvelle ou mise à jour. Si aucun observateur réseau correspondant n’est trouvé, le modèle ARM est déployé pour créer la ressource manquante.

Notes

Cette stratégie nécessite que vous disposiez d’un groupe de ressources nommé NetworkWatcherRG dans votre abonnement. Azure crée le groupe de ressources NetworkWatcherRG lorsque vous activez Network Watcher dans une région.

{
    "properties": {
        "displayName": "Deploy network watcher when virtual networks are created",
        "mode": "Indexed",
        "description": "This policy creates a network watcher resource in regions with virtual networks. You need to ensure existence of a resource group named networkWatcherRG, which will be used to deploy network watcher instances.",
        "metadata": {
            "category": "Network"
        },
        "parameters": {},
        "policyRule": {
            "if": {
                "field": "type",
                "equals": "Microsoft.Network/virtualNetworks"
            },
            "then": {
                "effect": "DeployIfNotExists",
                "details": {
                    "type": "Microsoft.Network/networkWatchers",
                    "resourceGroupName": "networkWatcherRG",
                    "existenceCondition": {
                        "field": "location",
                        "equals": "[field('location')]"
                    },
                    "roleDefinitionIds": [
                        "/providers/Microsoft.Authorization/roleDefinitions/4d97b98b-1d4f-4787-a291-c67834d212e7"
                    ],
                    "deployment": {
                        "properties": {
                            "mode": "incremental",
                            "template": {
                                "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json",
                                "contentVersion": "1.0.0.0",
                                "parameters": {
                                    "location": {
                                        "type": "string"
                                    }
                                },
                                "resources": [{
                                    "apiVersion": "2016-09-01",
                                    "type": "Microsoft.Network/networkWatchers",
                                    "name": "[concat('networkWacher_', parameters('location'))]",
                                    "location": "[parameters('location')]"
                                }]
                            },
                            "parameters": {
                                "location": {
                                    "value": "[field('location')]"
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

Explication

existenceCondition

"type": "Microsoft.Network/networkWatchers",
"resourceGroupName": "networkWatcherRG",
"existenceCondition": {
    "field": "location",
    "equals": "[field('location')]"
},

Le bloc properties.policyRule.then.details indique à Azure Policy ce qu’il faut rechercher en rapport avec la ressource créée ou mise à jour dans le bloc properties.policyRule.if. Dans cet exemple, un observateur réseau dans le groupe de ressources networkWatcherRG doit exister avec fieldlocation égal à l’emplacement de la ressource nouvelle ou mise à jour. L’utilisation de la fonction field() permet à l’existenceCondition d’accéder aux propriétés de la ressource nouvelle ou mise à jour, en particulier à la propriété location.

roleDefinitionIds

"roleDefinitionIds": [
    "/providers/Microsoft.Authorization/roleDefinitions/4d97b98b-1d4f-4787-a291-c67834d212e7"
],

La propriété arrayroleDefinitionIds dans le bloc properties.policyRule.then.details indique à la définition de stratégie les droits dont l’identité managée a besoin pour déployer le modèle Resource Manager inclus. Cette propriété doit être définie pour inclure des rôles disposant des autorisations nécessaires au déploiement de modèle, mais doit utiliser le concept de « principe des privilèges minimum » et n’avoir accès qu’aux opérations nécessaires, et rien de plus.

Modèle de déploiement

La partie deployment de la définition de stratégie a un bloc de properties qui définit les trois composants principaux :

  • mode : cette propriété définit le mode de déploiement du modèle.

  • template : cette propriété inclut le modèle lui-même. Dans cet exemple, le paramètre de modèle location définit l’emplacement de la nouvelle ressource d’observateur réseau.

    "template": {
        "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json",
        "contentVersion": "1.0.0.0",
        "parameters": {
            "location": {
                "type": "string"
            }
        },
        "resources": [{
            "apiVersion": "2016-09-01",
            "type": "Microsoft.Network/networkWatchers",
            "name": "[concat('networkWacher_', parameters('location'))]",
            "location": "[parameters('location')]"
        }]
    },
    
  • parameters : cette propriété définit les paramètres qui sont fournis au template. Les noms des paramètres doivent correspondre à ce qui est défini dans template. Dans cet exemple, le paramètre se nomme location afin qu’il y ait correspondance. La valeur de location utilise de nouveau la fonction field() pour récupérer la valeur de la ressource évaluée, qui est le réseau virtuel dans le bloc policyRule.if.

    "parameters": {
        "location": {
            "value": "[field('location')]"
        }
    }
    

Étapes suivantes