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에 알려 줍니다. 이 예제에서는 새 리소스 또는 업데이트된 리소스의 위치와 동일하게 field location
인 리소스 그룹 networkWatcherRG의 네트워크 감시자가 있어야 합니다. field()
함수를 사용하면 existenceCondition에서 새 리소스 또는 업데이트된 리소스의 속성(특히 location
속성)에 액세스할 수 있습니다.
roleDefinitionIds
"roleDefinitionIds": [
"/providers/Microsoft.Authorization/roleDefinitions/4d97b98b-1d4f-4787-a291-c67834d212e7"
],
properties.policyRule.then.details 블록의 roleDefinitionIds array 속성은 포함된 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')]" } }
다음 단계
- 다른 패턴 및 기본 제공 정의를 검토합니다.
- Azure Policy 정의 구조를 검토합니다.
- 정책 효과 이해를 검토합니다.