Padrão do Azure Policy: implantar recursos

Com o efeito deployIfNotExists, é possível implantar um modelo do ARM (modelo do Azure Resource Manager) ao criar ou atualizar um recurso que não está em conformidade. Pode ser preferível usar essa abordagem do que o efeito deny, pois ela permite que os recursos continuem sendo criados, mas garante que as alterações sejam feitas para torná-los compatíveis.

Definição de política de amostra

Esta definição de política usa o operador field para avaliar o type do recurso criado ou atualizado. Quando esse recurso é um Microsoft.Network/virtualNetworks, a política procura um observador de rede no local do recurso novo ou atualizado. Se um observador de rede correspondente não for localizado, o modelo do ARM será implantado para criar o recurso ausente.

Observação

Essa política exige que você tenha um grupo de recursos chamado NetworkWatcherRG na assinatura. O Azure cria o grupo de recursos NetworkWatcherRG quando você habilita o Observador de Rede em uma região.

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

Explicação

existenceCondition

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

O bloco properties.policyRule.then.details informa ao Azure Policy o que procurar relacionado ao recurso criado ou atualizado no bloco properties.policyRule.if. Neste exemplo, um observador de rede no grupo de recursos networkWatcherRG deve existir com um fieldlocation igual ao local do recurso novo ou atualizado. O uso da função field() permite que existenceCondition acesse propriedades no recurso novo ou atualizado, especificamente na propriedade location.

roleDefinitionIds

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

A propriedade da matriz roleDefinitionIdsno bloco properties.policyRule.then.details informa à definição de política quais direitos a identidade gerenciada precisa para implantar o modelo do Resource Manager incluído. Essa propriedade deve ser configurada para incluir funções que tenham as permissões necessárias para a implantação do modelo, mas deve usar o conceito de "princípio do menor privilégio" e ter apenas as operações necessárias.

Modelo de implantação

A parte implantação da definição de política possui um bloco propriedades que define os três componentes principais:

  • modo – essa propriedade define o modo de implantação do modelo.

  • modelo – essa propriedade inclui o próprio modelo. Neste exemplo, o parâmetro do modelo local define o local do novo recurso do observador de rede.

    "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')]"
        }]
    },
    
  • parâmetros – essa propriedade define os parâmetros que são fornecidos para o modelo. Os nomes dos parâmetros devem corresponder ao que está definido no modelo. Neste exemplo, o parâmetro é nomeado local para corresponder. O valor de local usa a função field() novamente para obter o valor do recurso avaliado, que é a rede virtual no bloco policyRule.if.

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

Próximas etapas