Azure Policy 定義の構造ポリシー ルール
ポリシー ルールは、ブロックで if
ブロックと then
ブロック構成されます。 if
ブロックでは、いつポリシーが適用されるかを指定する、1 つ以上の条件を定義します。 これらの条件に論理演算子を適用して、ポリシーのシナリオを細かく定義することができます。
各効果の詳細、評価の順序、プロパティ、例については、「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
演算に似ています) では、1 つ以上の条件が 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
、greater
、greaterOrEquals
の場合、プロパティの種類が条件の種類に一致しない場合はエラーがスローされます。 文字列比較は、InvariantCultureIgnoreCase
を使用して行われます。
like
と notLike
の条件を使用する場合は、値にワイルドカード文字 (*
) を指定します。 値に複数のワイルドカード文字を指定することはできません。
match
と notMatch
の条件を使用する場合は、数字にはハッシュタグ (#
)、文字には疑問符 (?
)、任意の文字にはドット (.
) を指定します。その他の文字にはその実際の文字が一致します。 match
と notMatch
では大文字と小文字が区別されますが、stringValue
を評価する他のすべての条件は大文字小文字の区別はされません。 大文字と小文字の区別をしない代替手段は matchInsensitively
と notMatchInsensitively
で使用できます。
フィールド
リソース要求のペイロード内のプロパティの値が特定の条件を満たすかどうかを評価する条件は、field
式を使用して形成できます。 次のフィールドがサポートされています。
name
fullName
- リソースのフル ネームを返します。 リソースのフル ネームは、親リソースの名前が付加されたリソース名です (
myServer/myDatabase
など)。
- リソースのフル ネームを返します。 リソースのフル ネームは、親リソースの名前が付加されたリソース名です (
kind
type
location
- location フィールドは、さまざまな形式をサポートするように正規化されます。 たとえば、
East US 2
はeastus2
と等しいと見なされます。 - 場所に依存しないリソースに対しては global を使用します。
- location フィールドは、さまざまな形式をサポートするように正規化されます。 たとえば、
id
- 評価されているリソースのリソース ID を返します。
- 例:
/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/myRG/providers/Microsoft.KeyVault/vaults/myVault
identity.type
- リソースで有効になっているマネージド ID の種類を返します。
tags
tags['<tagName>']
- この角かっこ構文では、ハイフン、ピリオド、スペースなどの区切り記号を含むタグ名がサポートされます。
tagName
は、条件を検証するタグの名前です。- 例:
tags['Acct.CostCenter']
(なお、Acct.CostCenter
はタグの名前)。
tags['''<tagName>''']
- この角かっこ構文では、2 個のアポストロフィでエスケープすることにより、アポストロフィが含まれるタグ名がサポートされます。
tagName
は、条件を検証するタグの名前です。- 例:
tags['''My.Apostrophe.Tag''']
(なお、'My.Apostrophe.Tag'
はタグの名前)。
Note
tags.<tagName>
、tags[tagName]
、およびtags[tag.with.dots]
は、タグ フィールドを宣言する方法としてまだ受け付けられます。 ただし、推奨される式は上に示したものです。プロパティのエイリアス: 一覧については、「エイリアス」を参照してください。
Note
配列別名
[*]
を参照する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
値が特定の条件を満たすかどうかを評価する条件は、value
式を使用して形成できます。 値には、リテラル、パラメーターの値、またはサポートされているテンプレート関数の戻り値を指定できます。
警告
テンプレート関数 の結果がエラーの場合、ポリシーの評価は失敗します。 評価の失敗は、暗黙的な deny
です。 詳細については、「テンプレート エラーの回避」を参照してください。 doNotEnforce
の enforcementMode を使用すると、新しいポリシー定義の試験および評価中に、失敗した評価が新しいまたは更新されたリソースに波及するのを避けることができます。
値の例
このポリシー ルールの例では、value
を使用して resourceGroup()
関数の結果と *netrg
の like
条件に対して返された name
プロパティを比較します。 このルールにより、名前が *netrg
で終わらないリソース グループ内の Microsoft.Network/*
type
ではないリソースはすべて拒否されます。
{
"if": {
"allOf": [
{
"value": "[resourceGroup().name]",
"like": "*netrg"
},
{
"field": "type",
"notLike": "Microsoft.Network/*"
}
]
},
"then": {
"effect": "deny"
}
}
このポリシー ルールの例では、value
を使用して、複数の入れ子になった関数の結果が equals
true
になるかを確認します。 規則では、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
が 3 文字よりも短い場合、substring()
関数はエラーとなります。 このエラーにより、ポリシーは deny
効果となります。
3 文字よりも短い name
をエラーにせず、name
の最初の 3 文字が abc
と等しいかどうかを確認するには、代わりに if() 関数を使用します:
{
"policyRule": {
"if": {
"value": "[if(greaterOrEquals(length(field('name')), 3), substring(field('name'), 0, 3), 'not starting with abc')]",
"equals": "abc"
},
"then": {
"effect": "audit"
}
}
}
変更したポリシー ルールでは、3 文字未満の値の substring()
を取得する前に、if()
によって name
の長さが確認されます。 name
が短すぎる場合、代わりに "not starting with abc"\(abc で開始されていません\) が返され、abc
と比較されます。 abc
で開始しない短い名前のリソースも、ポリシー ルールでエラーとなりますが、評価時にはエラーが発生しなくなります。
カウント
特定の条件を満たす配列のメンバーの数をカウントする条件は、count
式を使用して形成できます。 通常のシナリオでは、条件を満たす配列メンバーの数が、"at least one of" (少なくとも 1 つ)、"exactly one of" (1 つだけ)、"all of" (すべて)、"none of" (ない) のそれぞれに該当するかどうかを確認します。 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
(必須): 値は、count.where
条件式を満たした項目数と比較されます。 数値の条件を使用する必要があります。
Azure Policy で配列プロパティを操作する方法の詳細 (field count
式の評価方法に関する詳細な説明を含む) については、「配列リソース プロパティを参照する」を参照してください。
値のカウント
条件を満たす配列のメンバーの数をカウントします。 配列には、リテラル配列または配列パラメーターへの参照を指定できます。 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 になります。 このプロパティ内では、任意の条件を使用できます。 このプロパティ内では、論理演算子を使用して複雑な評価要件を作成できます。 現在列挙されている配列メンバーの値には、current 関数を呼び出してアクセスできます。condition
(必須): 値は、count.where
条件式を満たした項目数と比較されます。 数値の条件を使用する必要があります。
current 関数
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:1 つの配列メンバーだけが条件式を満たすかどうかをチェックします
{
"count": {
"field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
"where": {
"field": "Microsoft.Network/networkSecurityGroups/securityRules[*].description",
"equals": "My unique description"
}
},
"equals": 1
}
例 3: 少なくとも 1 つの配列メンバーが条件式を満たすかどうかをチェックします
{
"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:少なくとも 1 つの配列メンバーが、条件式内の複数のプロパティと一致するかどうかをチェックします
{
"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()
詳細については、ラムダに移動しますlistAccountSas()
listKeys()
listSecrets()
list*
managementGroup()
newGuid()
pickZones()
providers()
reference()
resourceId()
subscriptionResourceId()
tenantResourceId()
tenant()
variables()
Note
これらの関数は、deployIfNotExists
ポリシー定義のテンプレートのデプロイの details.deployment.properties.template
の部分で引き続き使用できます。
次の関数は、ポリシー規則で使用できますが、Azure Resource Manager テンプレート (ARM テンプレート) での使用方法とは異なります。
utcNow()
- ARM テンプレートとは異なり、このプロパティは defaultValue の外部で使用できます。- 現在の日時に設定されているユニバーサル ISO 8601 日時形式
yyyy-MM-ddTHH:mm:ss.fffffffZ
の文字列が返されます。
- 現在の日時に設定されているユニバーサル ISO 8601 日時形式
次の関数は、ポリシー ルールでのみ使用できます。
addDays(dateTime, numberOfDaysToAdd)
dateTime
: [必須] 文字列 - ユニバーサル ISO 8601 DateTime の形式 'yyyy-MM-ddTHH:mm:ss.FFFFFFFZ' の文字列numberOfDaysToAdd
: [必須] 整数 - 追加する日数
field(fieldName)
fieldName
: [必須] 文字列 - 取得するフィールドの名前- If 条件による評価の対象となっている、リソースのそのフィールドの値を返します。
field
は主にauditIfNotExists
とdeployIfNotExists
と共に使用され、評価対象のリソースのフィールドを参照します。 使用例については、「DeployIfNotExists の例」をご覧ください。
requestContext().apiVersion
- ポリシーの評価をトリガーした要求の API バージョンを返します (例:
2021-09-01
)。 この値は、PUT または PATCH 要求で、リソースの作成または更新時の評価に使用された API バージョンになります。 既存のリソースに対するコンプライアンスの評価中は、常に最新バージョンの 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
: [必須] 文字列 - range 内に含まれることを検証するために IP アドレスの範囲を指定する文字列。- range IP アドレス範囲にtargetRange IP アドレス範囲が含まれているかどうかを示す "ブール値" を返します。 空の範囲、または IP ファミリ間の混合は許可されておらず、評価エラーが発生します。
サポートされる形式:
- 単一の IP アドレス (例:
10.0.0.0
、2001:0DB8::3:FFFE
) - CIDR 範囲 (例:
10.0.0.0/24
、2001:0DB8::/110
) - 開始 IP アドレスと終了 IP アドレスで定義される範囲 (例:
192.168.0.1-192.168.0.9
、2001:0DB8::-2001:0DB8::3:FFFF
)
current(indexName)
- count 式の内部でのみ使用できる特殊な関数。
ポリシー関数の例
このポリシー ルールの例では、resourceGroup
リソース関数を使用して name
プロパティを取得します。ここでは、concat
配列およびオブジェクト関数と組み合わせて、リソース グループ名で始まるリソース名を指定する like
条件を作成します。
{
"if": {
"not": {
"field": "name",
"like": "[concat(resourceGroup().name,'*')]"
}
},
"then": {
"effect": "deny"
}
}
ポリシー規則の制限
作成中に適用される制限
ポリシー規則の構造に対する制限は、ポリシーの作成中または割り当て中に適用されます。 これらの制限を超えるポリシー定義の作成や割り当てを試みると失敗します。
制限 | 値 | 追加情報 |
---|---|---|
if 条件内の条件式 |
4096 | |
then ブロック内の条件式 |
128 | auditIfNotExists と deployIfNotExists ポリシーの 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'))] |
警告
評価中に上記の制限を超える Policy は、事実上に deny
ポリシーになり、受信要求をブロックできます。
複雑な関数を使用してポリシーを記述する場合は、これらの制限に気を付けて、それらを超える可能性があるリソースに対してポリシーをテストします。
次のステップ
- ポリシー定義の構造の詳細については、基本、パラメータ、別名に移動します。
- イニシアティブの場合は、イニシアティブ定義の構造に移動します。
- Azure Policy のサンプルを確認します。
- 「Policy の効果について」を確認します。
- プログラムによってポリシーを作成する方法を理解します。
- コンプライアンス データを取得する方法を学習します。
- 準拠していないリソースを修復する方法を学習します。
- 「Azure 管理グループのリソースを整理する」で、管理グループとは何かを確認します。