Azure Policy 패턴: 리소스 배포

deployIfNotExists 효과를 사용하면 호환되지 않는 리소스를 만들거나 업데이트할 때 Azure Resource Manager 템플릿(ARM 템플릿)을 배포할 수 있습니다. 이 방식은 리소스가 계속 생성될 수 있도록 허용하면서도 규정 준수를 위한 변경을 보장하므로 deny 효과를 사용하는 것보다 나을 수 있습니다.

샘플 정책 정의

이 정책 정의는 field 연산자를 사용하여 생성 또는 업데이트된 리소스의 type을 평가합니다. 해당 리소스가 Microsoft.Network/virtualNetworks인 경우 정책은 새 리소스 또는 업데이트된 리소스의 위치에서 네트워크 감시자를 찾습니다. 일치하는 네트워크 감시자를 찾지 못하면 ARM 템플릿이 배포되어 누락된 리소스를 만듭니다.

참고 항목

이 정책을 사용하려면 구독에 NetworkWatcherRG라는 리소스 그룹이 있어야 합니다. 지역에서 Network Watcher를 사용하도록 설정하면 Azure에서 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가 있어야 합니다. field() 함수를 사용하면 existenceCondition에서 새 리소스 또는 업데이트된 리소스의 속성(특히 location 속성)에 액세스할 수 있습니다.

roleDefinitionIds

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

properties.policyRule.then.details 블록의 roleDefinitionIdsarray 속성은 포함된 Resource Manager 템플릿을 배포하기 위해 관리 ID에 필요한 권한을 정책 정의에 알려 줍니다. 이 속성은 템플릿 배포에 필요한 사용 권한이 있는 역할을 포함하도록 설정되어야 하지만, ‘최소 권한 원칙’ 개념을 사용해야 하며 필요한 작업만 있어야 합니다.

배포 템플릿

정책 정의의 deployment 부분에는 세 가지 핵심 구성 요소를 정의하는 properties 블록이 있습니다.

  • mode - 이 속성은 템플릿의 배포 모드를 설정합니다.

  • template - 이 속성은 템플릿 자체를 포함합니다. 이 예제에서 location 템플릿 매개 변수는 새 네트워크 감시자 리소스의 위치를 설정합니다.

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

다음 단계