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"

lesslessOrEqualsgreatergreaterOrEquals の場合、プロパティの種類が条件の種類に一致しない場合はエラーがスローされます。 文字列比較は、InvariantCultureIgnoreCase を使用して行われます。

likenotLike の条件を使用する場合は、値にワイルドカード文字 (*) を指定します。 値に複数のワイルドカード文字を指定することはできません。

matchnotMatch の条件を使用する場合は、数字にはハッシュタグ (#)、文字には疑問符 (?)、任意の文字にはドット (.) を指定します。その他の文字にはその実際の文字が一致します。 matchnotMatch では大文字と小文字が区別されますが、stringValue を評価する他のすべての条件は大文字小文字の区別はされません。 大文字と小文字の区別をしない代替手段は matchInsensitivelynotMatchInsensitively で使用できます。

フィールド

リソース要求のペイロード内のプロパティの値が特定の条件を満たすかどうかを評価する条件は、field 式を使用して形成できます。 次のフィールドがサポートされています。

  • name

  • fullName

    • リソースのフル ネームを返します。 リソースのフル ネームは、親リソースの名前が付加されたリソース名です (myServer/myDatabase など)。
  • kind

  • type

  • location

    • location フィールドは、さまざまな形式をサポートするように正規化されます。 たとえば、East US 2eastus2 と等しいと見なされます。
    • 場所に依存しないリソースに対しては global を使用します。
  • id

    • 評価されているリソースのリソース ID を返します。
    • 例: /subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/myRG/providers/Microsoft.KeyVault/vaults/myVault
  • identity.type

  • 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 です。 詳細については、「テンプレート エラーの回避」を参照してください。 doNotEnforceenforcementMode を使用すると、新しいポリシー定義の試験および評価中に、失敗した評価が新しいまたは更新されたリソースに波及するのを避けることができます。

値の例

このポリシー ルールの例では、value を使用して resourceGroup() 関数の結果と *netrglike 条件に対して返された name プロパティを比較します。 このルールにより、名前が *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 が 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 の文字列が返されます。

次の関数は、ポリシー ルールでのみ使用できます。

  • 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: [必須] 文字列 - range 内に含まれることを検証するために IP アドレスの範囲を指定する文字列。
    • range IP アドレス範囲にtargetRange IP アドレス範囲が含まれているかどうかを示す "ブール値" を返します。 空の範囲、または IP ファミリ間の混合は許可されておらず、評価エラーが発生します。

    サポートされる形式:

    • 単一の IP アドレス (例: 10.0.0.02001:0DB8::3:FFFE)
    • CIDR 範囲 (例: 10.0.0.0/242001:0DB8::/110)
    • 開始 IP アドレスと終了 IP アドレスで定義される範囲 (例: 192.168.0.1-192.168.0.92001: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 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'))]

警告

評価中に上記の制限を超える Policy は、事実上に deny ポリシーになり、受信要求をブロックできます。 複雑な関数を使用してポリシーを記述する場合は、これらの制限に気を付けて、それらを超える可能性があるリソースに対してポリシーをテストします。

次のステップ