Azure Policy 정의 구조 정책 규칙

정책 규칙은 ifthen 블록으로 구성됩니다. if 블록에서 정책이 적용되는 시점을 지정하는 하나 이상의 조건을 정의합니다. 이러한 조건에 논리 연산자를 적용하여 정책에 대한 시나리오를 정확하게 정의할 수 있습니다.

각 효과, 평가 순서, 속성 및 예에 대한 자세한 내용은 Azure Policy 정의 효과 기본 사항을 참조하세요.

then 블록에서는 if 조건이 충족될 때 발생하는 효과를 정의합니다.

{
  "if": {
      <condition> | <logical operator>
  },
  "then": {
    "effect": "deny | audit | modify | denyAction | append | auditIfNotExists | deployIfNotExists | disabled"
  }
}

policyRule에 대한 자세한 내용을 보려면 정책 정의 스키마로 이동합니다.

논리 연산자

지원되는 논리 연산자는 다음과 같습니다.

  • "not": {condition or operator}
  • "allOf": [{condition or operator},{condition or operator}]
  • "anyOf": [{condition or operator},{condition or operator}]

not 구문은 조건의 결과를 반전시킵니다. allOf 구문(논리적 and 연산과 유사)에서는 모든 조건이 true여야 합니다. anyOf 구문(논리적 or 연산과 유사)에서는 하나 이상의 조건이 true여야 합니다.

논리 연산자를 중첩할 수 있습니다. 다음 예에서는 allOf 작업 내에 중첩된 not 작업을 보여 줍니다.

"if": {
  "allOf": [
    {
      "not": {
        "field": "tags",
        "containsKey": "application"
      }
    },
    {
      "field": "type",
      "equals": "Microsoft.Storage/storageAccounts"
    }
  ]
},

조건

조건은 값이 특정 기준을 충족하는지를 평가합니다. 지원되는 조건은 다음과 같습니다.

  • "equals": "stringValue"
  • "notEquals": "stringValue"
  • "like": "stringValue"
  • "notLike": "stringValue"
  • "match": "stringValue"
  • "matchInsensitively": "stringValue"
  • "notMatch": "stringValue"
  • "notMatchInsensitively": "stringValue"
  • "contains": "stringValue"
  • "notContains": "stringValue"
  • "in": ["stringValue1","stringValue2"]
  • "notIn": ["stringValue1","stringValue2"]
  • "containsKey": "keyName"
  • "notContainsKey": "keyName"
  • "less": "dateValue" | "less": "stringValue" | "less": intValue
  • "lessOrEquals": "dateValue" | "lessOrEquals": "stringValue" | "lessOrEquals": intValue
  • "greater": "dateValue" | "greater": "stringValue" | "greater": intValue
  • "greaterOrEquals": "dateValue" | "greaterOrEquals": "stringValue" | "greaterOrEquals": intValue
  • "exists": "bool"

less, lessOrEquals, greatergreaterOrEquals의 경우 속성 형식이 조건 형식과 일치하지 않으면 오류가 throw됩니다. 문자열 비교는 InvariantCultureIgnoreCase를 사용하여 수행됩니다.

likenotLike 조건을 사용할 때 값에 와일드카드 문자(*)를 제공합니다. 값에는 와일드카드 문자가 두 개 이상 있어서는 안 됩니다.

matchnotMatch 조건을 사용할 때 숫자와 일치하는 해시태그(#), 문자와 일치하는 물음표(?), 문자와 일치하는 점(.) 및 실제 문자와 일치하는 기타 문자를 제공합니다. matchnotMatch는 대/소문자를 구분하지만 stringValue를 평가하는 다른 모든 조건은 대/소문자를 구분하지 않습니다. 대/소문자를 구분하지 않는 대안은 matchInsensitivelynotMatchInsensitively에서 사용할 수 있습니다.

필드

리소스 요청 페이로드의 속성 값이 특정 기준을 충족하는지 여부를 평가하는 조건은 field 식을 사용하여 지정할 수 있습니다. 다음 필드가 지원됩니다.

  • name

  • fullName

    • 리소스의 전체 이름을 반환합니다. 리소스의 전체 이름은 부모 리소스 이름 앞에 리소스 이름이 추가됩니다(예: myServer/myDatabase).
  • kind

  • type

  • location

    • 위치 필드는 다양한 형식을 지원하도록 정규화됩니다. 예를 들어 East US 2eastus2와 동일한 것으로 간주됩니다.
    • 위치에 관계없는 리소스에는 전역을 사용합니다.
  • id

    • 평가 중인 리소스의 리소스 ID를 반환합니다.
    • 예: /subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/myRG/providers/Microsoft.KeyVault/vaults/myVault
  • identity.type

    • 리소스에서 사용 가능한 관리 ID 형식을 반환합니다.
  • tags

  • tags['<tagName>']

    • 이 대괄호 구문은 하이픈, 마침표, 공백 등의 문장 부호가 있는 태그 이름을 지원합니다.
    • 여기서 tagName은 조건을 validate할 태그 이름입니다.
    • 예: tags['Acct.CostCenter'] 여기서 Acct.CostCenter는 태그의 이름입니다.
  • tags['''<tagName>''']

    • 이 대괄호 구문은 이중 아포스트로피로 이스케이프 처리하여 아포스트로피가 있는 태그 이름을 지원합니다.
    • 여기서 tagName은 조건을 validate할 태그 이름입니다.
    • 예: tags['''My.Apostrophe.Tag'''] 여기서 'My.Apostrophe.Tag'는 태그의 이름입니다.

    참고 항목

    tags.<tagName>, tags[tagName]tags[tag.with.dots]도 여전히 허용되는 태그 필드 선언 방법입니다. 그러나 기본 식은 위에 나열된 식입니다.

  • 속성 별칭 - 목록은 별칭을 참조하세요.

    참고 항목

    배열 별칭 [*]를 참조하는 field 식에서 배열의 각 요소는 요소 사이의 논리 and을 사용하여 개별적으로 평가됩니다. 자세한 내용은 배열 리소스 속성 참조를 참조하세요.

field 식을 사용하는 조건은 쓰기 작업에 사용되는 레거시 정책 정의 구문 "source": "action"을 바꿀 수 있습니다. 예를 들어, 다음은 더 이상 지원되지 않습니다.

{
  "source": "action",
  "like": "Microsoft.Network/publicIPAddresses/*"
}

그러나 원하는 동작은 field 논리를 사용하여 달성할 수 있습니다.

{
  "field": "type",
  "equals": "Microsoft.Network/publicIPAddresses"
}

매개 변수와 함께 태그 사용

매개 변수 값을 태그 필드에 전달할 수 있습니다. 매개 변수를 태그 필드에 전달하면 정책 할당 중에 정책 정의의 유연성이 증가합니다.

다음 예에서 concat는 이름이 tagName 매개 변수의 값인 태그에 대한 태그 필드 조회를 만드는 데 사용됩니다. 해당 태그가 없는 경우 modify 효과를 사용하여 resourcegroup() 조회 함수를 통해 감사된 리소스 부모 리소스 그룹에 설정된 동일한 이름의 태그 값을 사용하는 태그를 추가합니다.

{
  "if": {
    "field": "[concat('tags[', parameters('tagName'), ']')]",
    "exists": "false"
  },
  "then": {
    "effect": "modify",
    "details": {
      "operations": [
        {
          "operation": "add",
          "field": "[concat('tags[', parameters('tagName'), ']')]",
          "value": "[resourcegroup().tags[parameters('tagName')]]"
        }
      ],
      "roleDefinitionIds": [
        "/providers/microsoft.authorization/roleDefinitions/4a9ae827-6dc8-4573-8ac7-8239d42aa03f"
      ]
    }
  }
}

value 식을 사용하여 값이 특정 조건을 충족하는지 여부를 평가하는 조건을 지정할 수 있습니다. 값은 리터럴, 매개 변수값 또는 지원되는 템플릿 함수의 반환값이 될 수 있습니다.

Warning

템플릿 함수의 결과가 오류이면 정책 평가가 실패합니다. 실패한 평가는 암시적 deny입니다. 자세한 내용은 템플릿 오류 방지를 참조하세요. 새 정책 정의를 테스트하고 유효성 검사하는 동안 평가 실패가 새 리소스 또는 업데이트된 리소스에 미치는 영향을 방지하려면 doNotEnforceenforcementMode를 사용합니다.

값 예제

이 정책 규칙 예에서는 value를 사용하여 resourceGroup() 함수의 결과와 반환된 name 속성을 *netrglike 조건과 비교합니다. 규칙은 이름이 *netrg로 끝나는 리소스 그룹에서 Microsoft.Network/*type이 아닌 리소스를 모두 거부합니다.

{
  "if": {
    "allOf": [
      {
        "value": "[resourceGroup().name]",
        "like": "*netrg"
      },
      {
        "field": "type",
        "notLike": "Microsoft.Network/*"
      }
    ]
  },
  "then": {
    "effect": "deny"
  }
}

이 정책 규칙 예에서는 value를 사용하여 여러 중첩 함수 equalstrue의 결과를 확인합니다. 이 규칙은 최소 3개의 태그가 없는 리소스를 모두 거부합니다.

{
  "mode": "indexed",
  "policyRule": {
    "if": {
      "value": "[less(length(field('tags')), 3)]",
      "equals": "true"
    },
    "then": {
      "effect": "deny"
    }
  }
}

템플릿 실패 방지

value에서 템플릿 함수를 사용하면 복잡한 중첩 함수를 많이 사용할 수 있습니다. 템플릿 함수의 결과가 오류이면 정책 평가가 실패합니다. 실패한 평가는 암시적 deny입니다. 특정 시나리오에서 실패하는 value의 예:

{
  "policyRule": {
    "if": {
      "value": "[substring(field('name'), 0, 3)]",
      "equals": "abc"
    },
    "then": {
      "effect": "audit"
    }
  }
}

위의 정책 예 규칙은 substring()을 사용하여 name의 처음 3개 문자를 abc와 비교합니다. name이 세 자 미만이면 substring() 함수에서 오류가 발생합니다. 이 오류로 인해 정책은 deny 효과가 됩니다.

대신 if() 함수를 사용하여 3자보다 짧은 name으로 인해 오류가 발생하는 것을 허용하지 않고 name의 처음 3자가 abc와 같은지 확인합니다.

{
  "policyRule": {
    "if": {
      "value": "[if(greaterOrEquals(length(field('name')), 3), substring(field('name'), 0, 3), 'not starting with abc')]",
      "equals": "abc"
    },
    "then": {
      "effect": "audit"
    }
  }
}

수정한 정책 규칙에서 if()는 세 자 미만인 값에서 substring()을 구하기 전에 name의 길이를 확인합니다. name이 너무 짧으면 "abc로 시작하지 않음" 값이 대신 반환되어 abc와 비교됩니다. abc로 시작하지 않는 짧은 이름의 리소스는 여전히 정책 규칙에 실패하지만 평가 중에 더 이상 오류가 발생하지 않습니다.

Count

배열의 멤버 중 특정 기준을 충족하는 멤버의 수를 세는 조건은 count 식을 사용하여 형성할 수 있습니다. 일반적인 시나리오에서는 배열 멤버 '중 하나 이상', '중 정확히 하나', '중 모두' 또는 '중 아무도'라는 조건을 충족하는지 여부를 확인합니다. count는 조건식에 대해 각 배열 멤버를 평가하고 true 결과의 합계를 낸 다음, 식 연산자와 비교합니다.

필드 수

요청 페이로드에서 배열의 멤버 중 조건식을 충족하는 멤버의 수를 세는 조건을 계수합니다. field count 식의 구조는 다음과 같습니다.

{
  "count": {
    "field": "<[*] alias>",
    "where": {
      /* condition expression */
    }
  },
  "<condition>": "<compare the count of true condition expression array members to this value>"
}

다음 속성은 field count와 함께 사용됩니다.

  • count.field(필수): 배열에 대한 경로를 포함하며 배열 별칭이어야 합니다.
  • count.where(선택 사항): count.field의 각 배열 별칭 배열 멤버에 대해 개별적으로 평가할 조건 식입니다. 속성이 제공되지 않으면 'field' 경로가 있는 모든 배열 멤버는 true로 평가됩니다. 속성 내에서 모든 condition을 사용할 수 있습니다. 논리 연산자는 이 속성 내에서 복잡한 평가 요구 사항을 만드는 데 사용할 수 있습니다.
  • condition(필수): 이 값은 count.where 조건식을 충족하는 항목 수와 비교됩니다. 숫자 조건을 사용해야 합니다.

field count 식이 계산되는 방법에 대한 자세한 설명을 포함하여 Azure Policy에서 배열 속성으로 작업하는 방법에 대한 세부 정보는 배열 리소스 속성 참조를 참조하세요.

값 개수

배열에서 조건을 충족하는 멤버 수를 계산합니다. 배열은 리터럴 배열이거나 배열 매개 변수에 대한 참조일 수 있습니다. value count 식의 구조는 다음과 같습니다.

{
  "count": {
    "value": "<literal array | array parameter reference>",
    "name": "<index name>",
    "where": {
      /* condition expression */
    }
  },
  "<condition>": "<compare the count of true condition expression array members to this value>"
}

다음 속성은 value count와 함께 사용됩니다.

  • count.value(필수): 평가할 배열입니다.
  • count.name(필수): 영문자와 숫자로 구성된 인덱스 이름입니다. 현재 반복에서 계산된 배열 멤버의 값에 대한 이름을 정의합니다. 이 이름은 count.where 조건 내에서 현재 값을 참조하는 데 사용됩니다. count 식이 다른 count 식의 자식 식이 아닌 경우 선택 사항입니다. 제공되지 않은 경우 인덱스 이름은 암시적으로 "default"로 설정됩니다.
  • count.where(선택 사항): count.value의 각 배열 멤버에 대해 개별적으로 평가할 조건 식입니다. 해당 속성이 제공되지 않으면 모든 배열 멤버는 true로 평가됩니다. 속성 내에서 모든 condition을 사용할 수 있습니다. 논리 연산자는 이 속성 내에서 복잡한 평가 요구 사항을 만드는 데 사용할 수 있습니다. 현재 열거된 배열 멤버의 값은 현재 함수를 호출하여 액세스할 수 있습니다.
  • condition(필수): 이 값은 count.where 조건식을 충족하는 항목 수와 비교됩니다. 숫자 조건을 사용해야 합니다.

현재 함수

current() 함수는 count.where 조건 내에서만 사용할 수 있습니다. 이 메서드는 현재 count 식 계산에 의해 열거된 배열 멤버의 값을 반환합니다.

값 개수 사용량

  • current(<index name defined in count.name>). 예: current('arrayMember')
  • current(). value count 식이 다른 count 식의 자식이 아닌 경우에만 허용됩니다. 위와 동일한 값을 반환합니다.

호출에서 반환된 값이 개체이면 속성 접근자가 지원됩니다. 예: current('objectArrayMember').property

필드 수 사용량

  • current(<the array alias defined in count.field>). 예: current('Microsoft.Test/resource/enumeratedArray[*]').
  • current(). field count 식이 다른 count 식의 자식이 아닌 경우에만 허용됩니다. 위와 동일한 값을 반환합니다.
  • current(<alias of a property of the array member>). 예: current('Microsoft.Test/resource/enumeratedArray[*].property').

필드 수 예제

예제 1: 배열이 비어 있는지 확인

{
  "count": {
    "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]"
  },
  "equals": 0
}

예제 2: 배열 멤버 중 하나만 조건식을 충족하는지 확인

{
  "count": {
    "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
    "where": {
      "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].description",
      "equals": "My unique description"
    }
  },
  "equals": 1
}

예 3: 배열 멤버 하나 이상이 조건식을 충족하는지 확인

{
  "count": {
    "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
    "where": {
      "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].description",
      "equals": "My common description"
    }
  },
  "greaterOrEquals": 1
}

예 4: 모든 개체 배열 멤버가 조건식을 충족하는지 확인

{
  "count": {
    "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
    "where": {
      "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].description",
      "equals": "description"
    }
  },
  "equals": "[length(field('Microsoft.Network/networkSecurityGroups/securityRules[*]'))]"
}

예제 5: 하나 이상의 배열 멤버가 조건식의 여러 속성과 일치하는지 확인

{
  "count": {
    "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
    "where": {
      "allOf": [
        {
          "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].direction",
          "equals": "Inbound"
        },
        {
          "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].access",
          "equals": "Allow"
        },
        {
          "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].destinationPortRange",
          "equals": "3389"
        }
      ]
    }
  },
  "greater": 0
}

예제 6: where 조건 내에서 current() 함수를 사용하여 템플릿 함수에서 현재 열거된 배열 멤버의 값에 액세스합니다. 이 조건은 가상 네트워크에 10.0.0.0/24 CIDR 범위에 없는 주소 접두사가 포함되어 있는지 여부를 확인합니다.

{
  "count": {
    "field": "Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]",
    "where": {
      "value": "[ipRangeContains('10.0.0.0/24', current('Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]'))]",
      "equals": false
    }
  },
  "greater": 0
}

예제 7: where 조건 내에서 field() 함수를 사용하여 현재 열거된 배열 멤버의 값에 액세스합니다. 이 조건은 가상 네트워크에 10.0.0.0/24 CIDR 범위에 없는 주소 접두사가 포함되어 있는지 여부를 확인합니다.

{
  "count": {
    "field": "Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]",
    "where": {
      "value": "[ipRangeContains('10.0.0.0/24', first(field(('Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]')))]",
      "equals": false
    }
  },
  "greater": 0
}

값 개수 예

예제 1: 리소스 이름이 지정된 이름 패턴과 일치하는지 확인합니다.

{
  "count": {
    "value": [
      "prefix1_*",
      "prefix2_*"
    ],
    "name": "pattern",
    "where": {
      "field": "name",
      "like": "[current('pattern')]"
    }
  },
  "greater": 0
}

예제 2: 리소스 이름이 지정된 이름 패턴과 일치하는지 확인합니다. current() 함수는 인덱스 이름을 지정하지 않습니다. 결과는 이전 예제와 동일합니다.

{
  "count": {
    "value": [
      "prefix1_*",
      "prefix2_*"
    ],
    "where": {
      "field": "name",
      "like": "[current()]"
    }
  },
  "greater": 0
}

예제 3: 리소스 이름이 배열 매개 변수에서 제공하는 지정된 이름 패턴과 일치하는지 확인합니다.

{
  "count": {
    "value": "[parameters('namePatterns')]",
    "name": "pattern",
    "where": {
      "field": "name",
      "like": "[current('pattern')]"
    }
  },
  "greater": 0
}

예 4: 승인된 접두사 목록 아래에 가상 네트워크 주소 접두사가 없는지 확인합니다.

{
  "count": {
    "field": "Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]",
    "where": {
      "count": {
        "value": "[parameters('approvedPrefixes')]",
        "name": "approvedPrefix",
        "where": {
          "value": "[ipRangeContains(current('approvedPrefix'), current('Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]'))]",
          "equals": true
        },
      },
      "equals": 0
    }
  },
  "greater": 0
}

예 5: 모든 예약된 NSG 규칙이 NSG에 정의되어 있는지 확인합니다. 예약된 NSG 규칙의 속성은 개체를 포함하는 배열 매개 변수에 정의됩니다.

매개 변수 값:

[
  {
    "priority": 101,
    "access": "deny",
    "direction": "inbound",
    "destinationPortRange": 22
  },
  {
    "priority": 102,
    "access": "deny",
    "direction": "inbound",
    "destinationPortRange": 3389
  }
]

정책:

{
  "count": {
    "value": "[parameters('reservedNsgRules')]",
    "name": "reservedNsgRule",
    "where": {
      "count": {
        "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
        "where": {
          "allOf": [
            {
              "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].priority",
              "equals": "[current('reservedNsgRule').priority]"
            },
            {
              "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].access",
              "equals": "[current('reservedNsgRule').access]"
            },
            {
              "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].direction",
              "equals": "[current('reservedNsgRule').direction]"
            },
            {
              "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].destinationPortRange",
              "equals": "[current('reservedNsgRule').destinationPortRange]"
            }
          ]
        }
      },
      "equals": 1
    }
  },
  "equals": "[length(parameters('reservedNsgRules'))]"
}

정책 함수

함수를 사용하여 정책 규칙에 추가 논리를 도입할 수 있습니다. 함수는 정책 정의의 정책 규칙 내에서 그리고 이니셔티브의 정책 정의에 할당된 매개 변수 값 내에서 확인됩니다.

다음 함수와 사용자 정의 함수를 제외하고 모든 Resource Manager 템플릿 함수를 정책 규칙 내에서 사용할 수 있습니다.

  • copyIndex()
  • dateTimeAdd()
  • dateTimeFromEpoch
  • dateTimeToEpoch
  • deployment()
  • environment()
  • extensionResourceId()
  • lambda() 자세한 내용을 보려면 lambda로 이동합니다.
  • listAccountSas()
  • listKeys()
  • listSecrets()
  • list*
  • managementGroup()
  • newGuid()
  • pickZones()
  • providers()
  • reference()
  • resourceId()
  • subscriptionResourceId()
  • tenantResourceId()
  • tenant()
  • variables()

참고 항목

이러한 함수는 deployIfNotExists 정책 정의에 있는 템플릿 배포의 details.deployment.properties.template 부분 내에서 계속 사용할 수 있습니다.

다음 함수는 정책 규칙에서 사용할 수 있지만 Azure Resource Manager 템플릿(ARM 템플릿)에서 사용하는 것과는 다릅니다.

  • utcNow() - ARM 템플릿과는 달리 defaultValue 외부에서 사용할 수 있습니다.
    • 범용 ISO 8601 DateTime 형식 yyyy-MM-ddTHH:mm:ss.fffffffZ의 현재 날짜와 시간으로 설정된 문자열을 반환합니다.

다음 함수는 정책 규칙에서만 사용할 수 있습니다.

  • addDays(dateTime, numberOfDaysToAdd)

    • dateTime: [필수] 문자열 - 범용 ISO 8601 DateTime 형식 'yyyy-MM-ddTHH:mm:ss.FFFFFFFZ'의 문자열
    • numberOfDaysToAdd: [필수] 정수 - 추가할 일수
  • field(fieldName)

    • fieldName: [필수] 문자열 - 검색할 필드의 이름
    • If 조건에 의해 평가되는 리소스에서 해당 필드의 값을 반환합니다.
    • field는 평가 중인 리소스의 필드를 참조하기 위해 주로 auditIfNotExistsdeployIfNotExists와 함께 사용됩니다. 이 사용 예제는 DeployIfNotExists 예제에서 볼 수 있습니다.
  • requestContext().apiVersion

    • 정책 평가를 트리거한 요청의 API 버전을 반환합니다(예: 2021-09-01). 이 값은 리소스 생성/업데이트 평가를 위해 PUT/PATCH 요청에 사용된 API 버전입니다. 기존 리소스에 대한 규정 준수 평가 중에는 항상 최신 API 버전이 사용됩니다.
  • policy()

    • 평가 중인 정책에 대한 다음 정보를 반환합니다. 반환된 개체(예: [policy().assignmentId])에서 속성에 액세스할 수 있습니다.

      {
        "assignmentId": "/subscriptions/11111111-1111-1111-1111-111111111111/providers/Microsoft.Authorization/policyAssignments/myAssignment",
        "definitionId": "/providers/Microsoft.Authorization/policyDefinitions/34c877ad-507e-4c82-993e-3452a6e0ad3c",
        "setDefinitionId": "/providers/Microsoft.Authorization/policySetDefinitions/42a694ed-f65e-42b2-aa9e-8052e9740a92",
        "definitionReferenceId": "StorageAccountNetworkACLs"
      }
      
  • ipRangeContains(range, targetRange)

    • range: [필수] 문자열 - targetRange가 범위 내에 있는지 확인할 IP 주소의 범위를 지정하는 문자열입니다.
    • targetRange: [필수] 문자열 - 범위 내에 포함되는지 유효성을 검사할 IP 주소 범위를 지정하는 문자열입니다.
    • range IP 주소 범위에 targetRange IP 주소 범위가 포함되어 있는지 여부에 대한 boolean을 반환합니다. 빈 범위 또는 IP 제품군 간 혼합은 허용되지 않으며 평가 오류가 발생합니다.

    지원되는 형식:

    • 단일 IP 주소 (예: 10.0.0.0, 2001:0DB8::3:FFFE)
    • CIDR 범위 (예: 10.0.0.0/24, 2001:0DB8::/110)
    • 시작 및 끝 IP 주소에 의해 정의된 범위(예: 192.168.0.1-192.168.0.9, 2001:0DB8::-2001:0DB8::3:FFFF)
  • current(indexName)

정책 함수 예제

이 정책 규칙 예에서는 resourceGroup 리소스 함수를 concat 배열 및 개체 함수와 함께 사용하여 name 속성을 가져오고 리소스 이름을 리소스 그룹 이름으로 시작하도록 하는 like 조건을 작성합니다.

{
  "if": {
    "not": {
      "field": "name",
      "like": "[concat(resourceGroup().name,'*')]"
    }
  },
  "then": {
    "effect": "deny"
  }
}

정책 규칙 제한

작성 중에 적용되는 제한

정책 규칙의 구조에 대한 제한은 정책을 작성하거나 할당하는 동안 적용됩니다. 해당 제한을 초과하는 정책 정의를 만들거나 할당하려는 시도는 실패합니다.

제한 추가 세부 정보
if 조건의 조건식 4096
then 블록의 조건식 128 auditIfNotExistsdeployIfNotExists 정책의 existenceCondition에 적용
정책 규칙당 정책 함수 2048
매개 변수의 정책 함수 수 128 예: [function('parameter1', 'parameter2', ...)]
중첩된 정책 함수 깊이 64 예: [function(nested1(nested2(...)))]
정책 함수 식 문자열 길이 81920 예: "[function(....)]" 길이
배열당 식 Field count 5
정책 규칙당 식 Value count 10
Value count 식 반복 횟수 100 중첩된 Value count 식의 경우 부모 식의 반복 횟수도 포함됩니다.

평가 중에 적용되는 제한

정책 평가 중에 정책 함수에서 처리되는 개체 크기에 대한 제한입니다. 이 제한은 평가된 콘텐츠에 따라 달라지므로 작성 중에 항상 적용할 수 있는 것은 아닙니다. 예시:

{
  "field": "name",
  "equals": "[concat(field('stringPropertyA'), field('stringPropertyB'))]"
}

concat() 함수에서 생성된 문자열의 길이는 평가된 리소스의 속성 값에 따라 달라집니다.

제한 예제
함수에서 반환된 문자열의 길이 131072 [concat(field('longString1'), field('longString2'))]
함수에 매개 변수로 제공되거나 함수에서 반환된 복합 개체의 깊이 128 [union(field('largeObject1'), field('largeObject2'))]
함수에 매개 변수로 제공되거나 함수에서 반환된 복합 개체의 노드 수 32768 [concat(field('largeArray1'), field('largeArray2'))]

Warning

평가 중에 위 제한을 초과하는 정책은 사실상 deny 정책이 되며 들어오는 요청을 차단할 수 있습니다. 복합 함수를 사용하여 정책을 작성하는 경우 이 제한에 유의하고 해당 제한을 초과할 가능성이 있는 리소스에 대해 정책을 테스트합니다.

다음 단계