Azure Policy-Muster: Bereitstellen von Ressourcen

Die Auswirkung deployIfNotExists ermöglicht das Bereitstellen einer Azure Resource Manager-Vorlage (ARM-Vorlage) beim Erstellen oder Aktualisieren einer nicht kompatiblen Ressource. Dieser Ansatz ist ggf. der Auswirkung deny vorzuziehen, da er die Fortsetzung der Ressourcenerstellung ermöglicht, aber dafür sorgt, dass die erforderlichen Änderungen vorgenommen werden, um die Ressourcen kompatibel zu machen.

Beispielrichtliniendefinition

In dieser Richtliniendefinition wird der Operator field (Feld) verwendet, um den Typ (type) der erstellten oder aktualisierten Ressource auszuwerten. Wenn es sich bei der Ressource um eine Ressource vom Typ Microsoft.Network/virtualNetworks handelt, sucht die Richtlinie am Ort der neuen oder aktualisierten Ressource nach einer Network Watcher-Ressource. Sollte keine passende Network Watcher-Ressource gefunden werden, wird die ARM-Vorlage bereitgestellt, um die fehlende Ressource zu erstellen.

Hinweis

Diese Richtlinie erfordert, dass Sie über eine Ressourcengruppe mit dem Namen NetworkWatcherRG in Ihrem Abonnement verfügen. Azure erstellt die Ressourcengruppe NetworkWatcherRG, wenn Sie Network Watcher in einer Region aktivieren.

{
    "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')]"
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

Erklärung

existenceCondition

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

Durch den Block properties.policyRule.then.details wird Azure Policy mitgeteilt, wonach im Zusammenhang mit der erstellten oder aktualisierten Ressource im Block properties.policyRule.if gesucht werden soll. In diesem Beispiel muss eine Network Watcher-Ressource in der Ressourcengruppe networkWatcherRG vorhanden sein, und das Feldlocation muss dem Ort der neuen oder aktualisierten Ressource entsprechen. Die Funktion field() ermöglicht existenceCondition den Zugriff auf Eigenschaften der neuen oder aktualisierten Ressource – in diesem Fall: auf die Eigenschaft location.

roleDefinitionIds

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

Durch die Eigenschaft roleDefinitionIds vom Typ Array im Block properties.policyRule.then.details wird der Richtliniendefinition mitgeteilt, welche Rechte die verwaltete Identität zum Bereitstellen der enthaltenen Resource Manager-Vorlage benötigt. Diese Eigenschaft muss mit Rollen festgelegt werden, die über die für die Vorlagenbereitstellung benötigten Berechtigungen verfügen. Dabei muss allerdings das Prinzip der geringsten Rechte beachtet werden, und es dürfen nur die erforderlichen Vorgänge enthalten sein.

Bereitstellungsvorlage

Der Bereitstellungsteil (deployment) der Richtliniendefinition enthält einen Eigenschaftenblock (properties), in dem drei Kernkomponenten definiert werden:

  • Modus (mode): Diese Eigenschaft dient zum Festlegen des Bereitstellungsmodus der Vorlage.

  • Vorlage (template): Diese Eigenschaft enthält die eigentliche Vorlage. In diesem Beispiel wird mithilfe des Vorlagenparameters location der Ort der neuen Network Watcher-Ressource festgelegt.

    "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')]"
        }]
    },
    
  • Parameter (parameters): Diese Eigenschaft dient zum Definieren von Parametern für die Vorlage (template). Die Parameternamen müssen den Definitionen in template entsprechen. In diesem Beispiel heißt der abzugleichende Parameter location. Der Wert von location verwendet erneut die Funktion field(), um den Wert der ausgewerteten Ressource zu erhalten. Hierbei handelt es sich um das virtuelle Netzwerk im Block policyRule.if.

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

Nächste Schritte