Azure Policy 定義の modify 効果

modify 効果は、作成時または更新時に、サブスクリプションまたはリソースのプロパティまたはタグを追加、更新、または削除するために使用されます。 一般的な例としては、コスト センターなどのリソースでタグを更新することが挙げられます。 準拠していない既存のリソースは、修復タスクで修復できます。 1 つの Modify 規則には、任意の数の操作を含めることができます。 Modify として設定された有効なポリシー割り当てには、修復を行うための マネージド ID が必要です。

modify 効果では、次の操作がサポートされます。

  • リソース タグの追加、置換、または削除。 タグに関して、ターゲット リソースがリソース グループでない限り、Modify ポリシーでは常に modeindexed に設定されている必要があります。
  • 仮想マシンと Virtual Machine Scale Sets のマネージド ID の種類 (identity.type) の値の追加または置換。 仮想マシンまたは Virtual Machine Scale Sets では、identity.type のみを変更できます。
  • 特定のエイリアスの値の追加または置換。
    • modify で使用できるエイリアスの一覧を取得するには、Azure PowerShell 4.6.0 以降で Get-AzPolicyAlias | Select-Object -ExpandProperty 'Aliases' | Where-Object { $_.DefaultMetadata.Attributes -eq 'Modifiable' } を使用します。

重要

タグを管理している場合は、Append ではなく Modify を使用することをお勧めします。Modify ではより多くの操作タイプと、既存のリソースを修復する機能が提供されるためです。 ただし、マネージド ID を作成できない場合や、リソース プロパティのエイリアスが Modify でまだサポートされていない場合は、Append を使用することをお勧めします。

Modify の評価

リソースを作成中または更新中に、リソース プロバイダーによって要求が処理される前に Modify による評価が行われます。 ポリシー ルールの if 条件が満たされた場合、要求コンテンツに modify 操作が適用されます。 各 modify 操作では、適用されるタイミングを決定する条件を指定できます。 false 条件の評価を含む操作はスキップされます。

エイリアスを指定すると追加のチェックが実行され、要求コンテンツが modify 操作によって、リソース プロバイダーに拒否されるような形に変更されることがないようにします。

  • エイリアスのマップ先のプロパティは、要求の API バージョンでは Modifiable としてマークされています。
  • modify 操作のトークンの種類は、要求の API バージョンのプロパティで想定されるトークンの種類と一致します。

これらのチェックのいずれかが失敗した場合、ポリシー評価は指定された conflictEffect にフォールバックします。

重要

エイリアスを含む Modify の定義では、audit conflict 効果を使用して、マッピングされたプロパティが Modifiable でないバージョンの API を使用して要求を送信した場合に、その要求が失敗する事態を避けることをお勧めします。 API バージョン間で同じエイリアスの動作が異なる場合は、条件付き modify 操作を使用して、各 API バージョンで使用される modify 操作を決定できます。

modify 効果を使用するポリシー定義が評価サイクルの一部として実行される場合、既存のリソースに対する変更は行われません。 代わりに、if 条件を満たすリソースが非準拠とマークされます。

Modify のプロパティ

modify 効果の details プロパティには、修復に必要なアクセス許可を定義するすべてのサブプロパティと、タグ値の追加、更新、または削除に使用する operations が含まれます。

  • roleDefinitionIds (必須)
    • このプロパティには、サブスクリプションでアクセス可能なロールベースのアクセス制御ロール ID と一致する文字列の配列を含める必要があります。 詳細については、修復 - ポリシー定義の構成に関するページを参照してください。
    • 定義されたロールには、Contributor ロールに与えられているすべての操作が含まれている必要があります。
  • conflictEffect (省略可)
    • 複数のポリシー定義によって同じプロパティが変更された場合、または modify 操作が指定したエイリアスで動作しない場合に、どのポリシー定義を "優先" するかを決定します。
      • 新規または更新されたリソースについては、Deny を持つポリシー定義が優先されます。 Audit のポリシー定義では、すべての operations がスキップされます。 複数のポリシー定義に Deny 効果がある場合、その要求は競合として拒否されます。 すべてのポリシー定義に Audit がある場合、競合しているポリシー定義のどの operations も処理されません。
      • 既存のリソースについては、複数のポリシー定義に Deny 効果がある場合、コンプライアンス状態は競合になります。 Deny 効果があるポリシー定義が 1 つ以下の場合、各割り当ては非準拠のコンプライアンス状態を返します。
    • 使用可能な値は、AuditDenyDisabled です。
    • 既定値は Deny です。
  • operations (必須)
    • 一致するリソースで完了されるすべてのタグ操作の配列です。
    • プロパティ:
      • operation (必須)
        • 一致するリソースに対して実行するアクションを定義します。 オプションは、addOrReplaceAddRemove です。 Add は、append 効果に似た動作をします。
      • field (必須)
        • 追加、置換、または削除するタグです。 タグ名は、他の fields と同じ名前付け規則に従う必要があります。
      • value (省略可)
        • タグに設定する値です。
        • このプロパティは、operationaddOrReplace または Add の場合に必要です。
      • condition (省略可)
        • true または false として評価されるポリシー関数による Azure Policy 言語式を含む文字列です。
        • field()resourceGroup()subscription() の各ポリシー関数はサポートされていません。

Modify の操作

operations プロパティ配列を使用すると、1 つのポリシー定義から複数のタグを異なる方法で変更できます。 各操作は、operationfield、および value プロパティで構成されます。 operation では、修復タスクがタグに対して行う処理を決定し、field では、どのタグを変更するかを決定し、value では、そのタグの新しい設定を定義します。 次の例では、次のようにタグを変更します。

  • environment タグを "Test" に設定する (たとえ異なる値で既に存在している場合でも)。
  • タグ TempResource を削除する。
  • Dept タグを、ポリシーの割り当てで構成されたポリシー パラメーター DeptName に設定する。
"details": {
  ...
  "operations": [
    {
      "operation": "addOrReplace",
      "field": "tags['environment']",
      "value": "Test"
    },
    {
      "operation": "Remove",
      "field": "tags['TempResource']",
    },
    {
      "operation": "addOrReplace",
      "field": "tags['Dept']",
      "value": "[parameters('DeptName')]"
    }
  ]
}

operation プロパティには、次のオプションがあります。

操作 説明
addOrReplace プロパティまたはタグが別の値で既に存在する場合でも、定義されたプロパティまたはタグと値をリソースに追加します。
add 定義されたプロパティまたはタグと値をリソースに追加します。
remove 定義されたプロパティまたはタグをリソースから削除します。

Modify の例

例 1:environment タグを追加し、既存の environment タグを "Test" に置き換えます。

"then": {
  "effect": "modify",
  "details": {
    "roleDefinitionIds": [
      "/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"
    ],
    "operations": [
      {
        "operation": "addOrReplace",
        "field": "tags['environment']",
        "value": "Test"
      }
    ]
  }
}

例 2:env タグを削除し、environment タグを追加するか、既存の environment タグをパラメーター化された値に置き換えます。

"then": {
  "effect": "modify",
  "details": {
    "roleDefinitionIds": [
      "/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"
    ],
    "conflictEffect": "deny",
    "operations": [
      {
        "operation": "Remove",
        "field": "tags['env']"
      },
      {
        "operation": "addOrReplace",
        "field": "tags['environment']",
        "value": "[parameters('tagValue')]"
      }
    ]
  }
}

例 3: ストレージ アカウントで BLOB のパブリック アクセスが許可されていないことを確認します。次のように、modify 操作は、API バージョンが 2019-04-01 以上の要求を評価する場合にのみ適用されます。

"then": {
  "effect": "modify",
  "details": {
    "roleDefinitionIds": [
      "/providers/microsoft.authorization/roleDefinitions/17d1049b-9a84-46fb-8f53-869881c3d3ab"
    ],
    "conflictEffect": "audit",
    "operations": [
      {
        "condition": "[greaterOrEquals(requestContext().apiVersion, '2019-04-01')]",
        "operation": "addOrReplace",
        "field": "Microsoft.Storage/storageAccounts/allowBlobPublicAccess",
        "value": false
      }
    ]
  }
}

次のステップ