Patrón de Azure Policy: implementación de recursos

El efecto deployIfNotExists permite implementar una plantilla de Azure Resource Manager (plantilla ARM) al crear o actualizar un recurso que no es compatible. Este enfoque puede preferirse al uso del efecto deny, ya que permite que se sigan creando recursos, pero garantiza que se realizan cambios para que sean compatibles.

Definición de directiva de ejemplo

Esta definición de directiva usa el operador field para evaluar el valor de type del recurso creado o actualizado. Cuando ese recurso es un elemento Microsoft.Network/virtualNetworks, la directiva busca un monitor de red en la ubicación del recurso nuevo o actualizado. Si no se encuentra ningún monitor de red que coincida, se implementa la plantilla de Resource Manager para crear el recurso que falta.

Nota:

Esta directiva requiere que tenga un grupo de recursos denominado NetworkWatcherRG en su suscripción. Azure crea el grupo de recursos NetworkWatcherRG al habilitar Network Watcher en una región.

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

Explicación

existenceCondition

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

El bloque properties.policyRule.then.details indica a Azure Policy qué buscar relacionado con el recurso creado o actualizado en el bloque properties.policyRule.if. En este ejemplo, debe existir un monitor de red en el grupo de recursos networkWatcherRG con el operador fieldlocation equivalente a la ubicación del recurso nuevo o actualizado. El uso de la función field() permite a existenceCondition acceder a las propiedades del recurso nuevo o actualizado, específicamente a la propiedad location.

roleDefinitionIds

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

La matriz de propiedades roleDefinitionIds del bloque properties.policyRule.then.details indica a la definición de directiva qué derechos necesita la identidad administrada para implementar la plantilla de Resource Manager incluida. Esta propiedad debe estar configurada para incluir roles que tengan los permisos necesarios para la implementación de la plantilla, pero se debería usar el concepto de "principio de privilegios mínimos" y tener solo las operaciones necesarias y nada más.

Plantilla de implementación

La parte deployment de la definición de directiva tiene un bloque properties que define los tres componentes principales:

  • mode: esta propiedad establece el modo de implementación de la plantilla.

  • template: esta propiedad incluye la propia plantilla. En este ejemplo, el parámetro de plantilla location establece la ubicación del nuevo recurso de monitor de red.

    "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: esta propiedad define los parámetros que se proporcionan a la plantilla. Los nombres de parámetro deben coincidir con los definidos en template. En este ejemplo, el parámetro se denomina location para que coincida. El valor de location utiliza de nuevo la función field() para obtener el valor del recurso evaluado, que es la red virtual del bloque policyRule.if.

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

Pasos siguientes