политика azure, если условие, не может иметь 2 типа ресурсов?

#azure #azure-policy

Вопрос:

Я пишу простую политику, если это SQL Azure PaaS и в правиле брандмауэра указан общедоступный IP-адрес, он будет оцениваться.

 {
    "mode": "All",
    "policyRule": {
        "if": {
            "allOf": [
                {
                    "field": "type",
                    "equals": "Microsoft.Sql/servers"
                },
                {
                    "allOf": [
                        {
                            "field": "Microsoft.Sql/servers/firewallRules/startIpAddress",
                            "equals": "xxx.xxx.xxx.xxx"
                        },
                        {
                            "field": "Microsoft.Sql/servers/firewallRules/endIpAddress",
                            "equals": "xxx.xxx.xxx.xxx"
                        }
                    ]
                }
            ]
        },
        "then": {
            "effect": "[parameters('effect')]"
            
    },
    "parameters": {
        "effect": {
            "type": "String",
            "metadata": {
                "displayName": "Effect",
                "description": "Enable or disable the execution of the policy"
            },
            "allowedValues": [
                "Disabled",
                "Audit"
            ],
            "defaultValue": "Audit"
        }
    }
}
 

Я обнаружил, что когда я нажимаю, чтобы добавить это определение, сообщение об ошибке сообщает мне

 Editing policy definition 'sql firewall audit' in 'RogerBlueprint' failed. 
The policy definition  targets multiple resource types, but the policy rule is authored in a way that makes the policy not applicable to the target resource types 'Microsoft.Sql/servers,Microsoft.Sql/servers/firewallRules'. 
This is because the policy rule has a condition that can never be satisfied by the target resource types. 
If an alias is used, please make sure that the alias gets evaluated against only the resource type it belongs to by adding a type condition before it, or split the policy into multiple ones to avoid targeting multiple resource types.
 

Интересно, правда ли, что в состоянии IF вы не можете использовать два типа ресурсов вместе?

Ответ №1:

Это действительно верно — с точки зрения ARM Microsoft.Sql/servers и Microsoft.Sql/servers/firewallRules являются двумя разными объектами, даже несмотря на то, что существует родительское <> дочернее отношение.

Механизм политики работает так, что он сканирует каждый компонент ARM один за другим. В вашем случае это ясно говорит о том, что это не удастся, поскольку данный объект не может быть двух типов одновременно. Под капотом псевдоним Microsoft.Sql/servers/firewallRules идентифицируется как type «а», а не property «а».

Если логика применима ко всем вашим серверам в данной области, то вы могли бы сосредоточить политику на Microsoft.Sql/servers/firewallRules :

 {
    "mode": "All",
    "policyRule": {
        "if": {
            "allOf": [
                {
                    "field": "type",
                    "equals": "Microsoft.Sql/servers/firewallRules"
                },
                {
                    "allOf": [
                        {
                            "field": "Microsoft.Sql/servers/firewallRules/startIpAddress",
                            "equals": "xxx.xxx.xxx.xxx"
                        },
                        {
                            "field": "Microsoft.Sql/servers/firewallRules/endIpAddress",
                            "equals": "xxx.xxx.xxx.xxx"
                        }
                    ]
                }
            ]
        },
        "then": {
            "effect": "[parameters('effect')]"
            
    },
    "parameters": {
        "effect": {
            "type": "String",
            "metadata": {
                "displayName": "Effect",
                "description": "Enable or disable the execution of the policy"
            },
            "allowedValues": [
                "Disabled",
                "Audit"
            ],
            "defaultValue": "Audit"
        }
    }
}
 

Комментарии:

1. Что касается этого, это очень хорошо объясняет. К сожалению, если я просто использую firerulestype, результатом соответствия, который я получу, будет отчет о типе ресурса firerulestype, а не о каждом сервере sql, поэтому результат немного сбивает с толку. Тогда мне нужно найти другой способ сделать это.

2. Рад, что это помогает! Но да, я столкнулся с той же проблемой — я не нашел достойного способа быть честным…