Azure Policy パターン: リソースをデプロイする

deployIfNotExists 効果を使用すると、準拠していないリソースを作成または更新する場合に、Azure Resource Manager テンプレート (ARM テンプレート) をデプロイすることができます。 このアプローチは、deny 効果を使用するよりも好ましい場合があります。リソースの作成を継続できる一方で、準拠したものになるように確実にリソースを変更することができるからです。

ポリシー定義の例

このポリシー定義では、field 演算子を使用して、作成または更新するリソースの type を評価します。 このリソースが Microsoft.Network/virtualNetworks である場合、ポリシーは新しいリソースまたは更新するリソースの場所で Network Watcher を検索します。 一致する Network Watcher が見つからない場合は、ARM テンプレートがデプロイされ、不足しているリソースが作成されます。

注意

このポリシーでは、サブスクリプションに NetworkWatcherRG という名前のリソース グループが必要です。 Azure では、リージョンで Network Watcher を有効にすると、NetworkWatcherRG リソース グループが作成されます。

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

説明

existenceCondition

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

properties.policyRule.then.details ブロックでは、作成または更新するリソースに関連して properties.policyRule.if ブロック内で検索する対象を Azure Policy に指示します。 この例では、リソース グループ networkWatcherRG 内に、fieldlocation が新しいリソースまたは更新するリソースの場所と等しい Network Watcher が存在する必要があります。 field() 関数を使用することで、existenceCondition は、新しいリソースまたは更新するリソースのプロパティ (具体的には location プロパティ) にアクセスできるようになります。

roleDefinitionIds

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

properties.policyRule.then.details ブロック内の roleDefinitionIds "配列" プロパティは、含まれる Resource Manager テンプレートをデプロイするためにマネージド ID が必要とする権限をポリシー定義に伝えます。 このプロパティは、テンプレートのデプロイに必要なアクセス許可を持つロールが含まれるように設定する必要がありますが、"最小限の特権の原則" の概念を使用して必要な操作しか実行できないようにする必要があります。

デプロイ テンプレート

ポリシー定義の deployment の部分には、次の 3 つの主要コンポーネントを定義する properties ブロックがあります。

  • mode - このプロパティでは、テンプレートのデプロイ モードを設定します。

  • template - このプロパティにはテンプレート自体が含まれます。 この例では、location テンプレート パラメーターにより、新しい Network Watcher リソースの場所が設定されます。

    "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 - このプロパティでは、template に提供されるパラメーターを定義します。 パラメーター名は template で定義されているものと一致している必要があります。 この例では、パラメーターには、一致するように location という名前が付けられています。 location の値は、再び field() 関数を使用して、評価対象のリソースの値を取得します。これは policyRule.if ブロック内の仮想ネットワークに当たります。

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

次のステップ