Pola Azure Policy: menyebarkan sumber daya

Efek deployIfNotExists memungkinkan untuk menyebarkan templat Azure Resource Manager (templat ARM) saat membuat atau memperbarui sumber daya yang tidak patuh. Pendekatan ini terkadang lebih baik daripada menggunakan efek tolak karena memungkinkan sumber daya terus dibuat, tetapi memastikan dilakukan perubahan untuk membuatnya patuh.

Definisi kebijakan sampel

Definisi kebijakan ini menggunakan operator bidang untuk mengevaluasi type dari sumber daya yang dibuat atau diperbarui. Ketika sumber daya tersebut adalah Microsoft.Network/virtualNetworks, kebijakan mencari pengamat jaringan di lokasi sumber daya yang baru atau yang diperbarui. Jika pengamat jaringan yang cocok tidak ditemukan, templat ARM disebarkan untuk membuat sumber daya yang tidak ada.

Catatan

Kebijakan ini mengharuskan Anda memiliki grup sumber daya bernama NetworkWatcherRG dalam langganan Anda. Azure membuat grup sumber daya NetworkWatcherRG saat Anda mengaktifkan Network Watcher di suatu wilayah.

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

Penjelasan

existenceCondition

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

Blok properties.policyRule.then.details memberi tahu Azure Policy apa yang harus dicarku terkait dengan sumber daya yang dibuat atau diperbarui di blok properties.policyRule.if. Dalam contoh ini, pengamat jaringan di grup sumber daya networkWatcherRG harus ada di bidanglocation yang sama dengan lokasi sumber daya baru atau yang diperbarui. Menggunakan fungsi field() memungkinkan existenceCondition mengakses properti pada sumber daya baru atau yang diperbarui, khususnya properti location.

roleDefinitionIds

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

Properti roleDefinitionIdsarray di blok properties.policyRule.then.details memberi tahu definisi kebijakan hak mana yang dibutuhkan identitas terkelola untuk menyebarkan template Resource Manager yang disertakan. Properti ini harus diatur untuk menyertakan peran yang memiliki izin yang diperlukan oleh penyebaran templat, tetapi harus menggunakan konsep 'prinsip hak istimewa paling sedikit' dan hanya memiliki operasi yang diperlukan dan tidak lebih.

Templat penyebaran

Bagian penyebaran dari definisi kebijakan memiliki blok properti yang mendefinisikan tiga komponen inti:

  • mode - Properti ini mengatur mode penyebaran templat.

  • templat - Properti ini mencakup templat itu sendiri. Dalam contoh ini, parameter templat lokasi mengatur lokasi sumber daya pengamat jaringan baru.

    "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 - Properti ini mendefinisikan parameter yang disediakan untuk templat. Nama parameter harus cocok dengan apa yang ditentukan dalam templat. Dalam contoh ini, parameter diberi nama lokasi agar cocok. Nilai lokasi menggunakan fungsi field() lagi untuk mendapatkan nilai sumber daya yang dievaluasi, yang merupakan jaringan virtual dalam blok policyRule.if.

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

Langkah berikutnya