Azure Policy 定義の modify 効果

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

リソース プロパティの変更動作には、いくつかの微妙な違いがあります。 変更がスキップされるシナリオの詳細について説明します。

1 つの modify 規則には、任意の数の操作を含めることができます。 サポートされている操作は次のとおりです。

  • リソース タグの追加、置換、または削除。 タグのみを削除できます。 タグに関して、ターゲット リソースがリソース グループでない限り、Modify ポリシーでは常に modeindexed に設定されている必要があります。
  • 仮想マシンと仮想マシン スケール セットのマネージド 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 操作では、適用されるタイミングを決定する条件を指定できます。

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

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

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

重要

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

スキップされる変更

次のように、評価時に変更操作がスキップされる場合があります。

  • 既存のリソース: modify 効果を使用するポリシー定義が評価サイクルの一部として実行される場合、既存のリソースに対する変更は行われません。 代わりに、if 条件を満たすリソースはすべて非準拠としてマークされるため、それらを修復タスクを通じて修復できます。
  • 適用外: operations 配列内の操作の条件を評価した結果が false のときは、その操作はスキップされます。
  • 変更不可のプロパティ: ある操作に対して指定されたエイリアスが要求の API バージョンでは変更不可の場合は、conflict effect が評価に使用されます。 conflict effect が deny に設定されている場合は、その要求はブロックされます。 conflict effect が audit に設定されている場合は、その要求は許可されますが、modify 操作はスキップされます。
  • 存在しないプロパティ: 要求のリソース ペイロードにプロパティが存在しない場合は、変更がスキップされる可能性があります。 場合によっては、変更可能なプロパティが他のプロパティ内に入れ子になっていて Microsoft.Storage/storageAccounts/blobServices/deleteRetentionPolicy.enabled のようなエイリアスを持つことがあります。 "親" プロパティ (この例では deleteRetentionPolicy) が要求内に存在しない場合は、そのプロパティが意図的に省略されたと見なされるため、変更はスキップされます。 実際の例については、「存在しないプロパティの例」セクションを参照してください。
  • 非 VM または VMSS の ID 操作: 仮想マシンまたは仮想マシン スケール セット以外のリソースの identity.type フィールドの追加または置換を変更操作で試みたときは、ポリシー評価全体がスキップされ、したがって変更は実行されません。 この場合は、そのリソースはポリシーに適用可能とは見なされません。

存在しないプロパティの例

リソース プロパティの変更は、API 要求および更新されるリソース ペイロードによって異なります。 ペイロードは、Azure portal などの使用されるクライアントと、リソース プロバイダーなどのその他の要因によって異なります。

仮想マシン (VM) のタグを変更するポリシーを適用するとします。 サイズ変更中やディスクの変更中など、VM が更新されるたびに、VM ペイロードの内容に関係なくタグが更新されます。 これは、タグが VM のプロパティに依存しないためです。

ただし、VM のプロパティを変更するポリシーを適用する場合、変更はリソース ペイロードに依存します。 更新ペイロードに含まれていないプロパティを変更しようとしても、変更は行われません。 たとえば、これは、VM の assessmentMode プロパティ (エイリアス Microsoft.Compute/virtualMachines/osProfile.windowsConfiguration.patchSettings.assessmentMode) にパッチを適用するときに発生する可能性があります。 プロパティは "入れ子になっている" ため、その親プロパティが要求に含まれていない場合、この省略は意図的なものとみなされ、変更はスキップされます。 変更を行うには、リソース ペイロードにこのコンテキストが含まれている必要があります。

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 効果に似ています。
        • Remove はリソース タグに対してのみサポートされます。
      • 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
      }
    ]
  }
}

次のステップ