次の方法で共有


Azure Policy 状態変更イベントに対応する

Azure Policy イベントによって、アプリケーションは状態の変化に対応可能になります。 この統合を実行するために、複雑なコードや、高価で非効率的なポーリング サービスは必要ありません。 代わりにイベントが、Azure Event Grid を通して、Azure FunctionsAzure Logic Apps などのサブスクライバー、またはユーザー独自のカスタム HTTP リスナーにプッシュされます。 決定的な点は、使用した分だけ支払うということです。

Azure Policy のイベントは Azure Event Grid に送信されます。そこでは、豊富な再試行ポリシーと配信不能メッセージ配信を使用して、信頼性の高い配信サービスがアプリケーションに提供されます。 Event Grid では、Event Grid サブスクリプションを使用して、宛先に対するイベントの適切なルーティング、フィルター処理、マルチキャストが行われます。 詳細については、「Event Grid のメッセージの配信と再試行」を参照してください。

注意

評価トリガーがリソースの評価を完了した後に、Azure Policy 状態変更イベントが Event Grid に送信されます。

リソース コンプライアンス状態の変更に関する Event Grid 通知には、最大で 20 分かかることがあります。

Event Grid の利点

Event Grid には、Azure エコシステムのお客様とサービスに対していくつかの利点があります。

  • 自動化: Event Grid には、ポリシー環境を最新の状態に保つ目的で、コンプライアンスの状態に応じてアラートを生成してタスクをトリガーする自動化されたメカニズムが用意されています。
  • 永続的な配信: サービスとユーザー アプリケーションがポリシー コンプライアンス イベントにリアルタイムで応答できるように、Event Grid は最小の待機時間でポリシー イベントを提供しようとします。 Event Grid は、サブスクライバーのエンドポイントがイベントの受信確認に失敗した場合、またはイベントを受信しなかった場合に、事前に定義された再試行スケジュールと再試行ポリシーに従って、イベントの送信を再試行します。
  • カスタム イベント プロデューサー: Event Grid のイベント プロデューサーとコンシューマーは、Azure または Microsoft サービスである必要はありません。 外部アプリケーションは、アラートを受信したり、修復タスクの作成を表示したり、状態変更に応答するユーザーに関するメッセージを収集したりできます。 詳細なチュートリアルについては、Azure CLI を使用した Event Grid へのポリシー状態変更イベントのルーティングに関する記事を参照してください。

Event Grid を使用する場合、主に次の 2 つのエンティティがあります。

  • イベント: これらのイベントは、ユーザーが対応する必要があるあらゆるものです。たとえば、VM やストレージ アカウントなどのリソースのポリシー コンプライアンスの状態が作成、変更、削除された場合などが含まれます。
  • Event Grid サブスクリプション: これらのイベント サブスクリプションは、パブリッシャーからサブスクライバーに適切なイベント セットを送信する、ユーザーが構成したエンティティです。 イベント サブスクリプションでは、イベントの発生元のリソース パスとイベントの種類に基づいてイベントをフィルター処理できます。 さらに、イベント サブスクリプションは、Azure サブスクリプションと管理グループ間のスコープでフィルター処理することもできます。

Azure Policy イベントのよくあるシナリオは、リソースのコンプライアンスの状態がポリシーの評価中に変わるタイミングを追跡することです。 イベント ベースのアーキテクチャは、これらの変化に対応するための効率的な方法であり、コンプライアンスの状態の変化に対してイベント ベースで対応するために役立ちます。

別のシナリオは、ポリシー ページで「修復タスクの作成」を手動でオフにすることなく、修復タスクを自動的にトリガーすることです。 Event Grid では、コンプライアンスの状態と、現在非準拠で修復が可能なリソースを確認できます。 修復の構造について詳細をご覧ください。 修復にはマネージド ID が必要であり、ポリシーの効果は Modify または DeployIfNotExists である必要があります。 効果の種類について詳細をご覧ください

さらに、Event Grid は、状態の変化を格納し、時間の経過に伴う非準拠の原因を理解するための監査システムとして役立ちます。 Event Grid のシナリオは無限であり、動機に基づいて、Event Grid は構成可能です。

ソースとハンドラーの Event Grid モデルのスクリーンショット。

使用可能なイベントの種類

Azure Policy から出力されるイベントの種類は次のとおりです。

イベントの種類 説明
Microsoft.PolicyInsights.PolicyStateCreated ポリシー コンプライアンス状態が作成されたときに発生します。
Microsoft.PolicyInsights.PolicyStateChanged ポリシー コンプライアンス状態が変更されたときに発生します。
Microsoft.PolicyInsights.PolicyStateDeleted ポリシー コンプライアンス状態が削除されたときに発生します。

イベントのプロパティ

イベントのトップレベルのデータを次に示します。

プロパティ タイプ 説明
topic string イベント ソースの完全なリソース パス。 このフィールドは書き込み可能ではありません。 この値は Event Grid によって指定されます。
subject string コンプライアンス状態の変更の対象となるリソースの完全修飾 ID。リソース名とリソースの種類が含まれます。 次の形式が使用されます: /subscriptions/<SubscriptionID>/resourceGroups/<ResourceGroup>/providers/<ProviderNamespace>/<ResourceType>/<ResourceName>
eventType string このイベント ソース用に登録されたイベントの種類のいずれか。
eventTime string プロバイダーの UTC 時刻に基づくイベントの生成時刻。
id string イベントの一意識別子。
data object Azure Policy イベントのデータ。
dataVersion string データ オブジェクトのスキーマ バージョン。 スキーマ バージョンは発行元によって定義されます。
metadataVersion string イベント メタデータのスキーマ バージョン。 最上位プロパティのスキーマは Event Grid によって定義されます。 この値は Event Grid によって指定されます。

データ オブジェクトには、次のプロパティがあります。

プロパティ タイプ 説明
timestamp string リソースが Azure Policy によってスキャンされた時刻 (UTC)。 イベントを並べ替えるには、このプロパティを、最上位レベルの eventTime または time プロパティの代わりに使用します。
policyAssignmentId string ポリシー割り当てのリソース ID。
policyDefinitionId string ポリシー定義のリソース ID。
policyDefinitionReferenceId string イニシアチブ定義内のポリシー定義の参照 ID (ポリシー割り当てがイニシアチブの場合)。 空の場合もあります。
complianceState string ポリシー割り当てに関するリソースのコンプライアンス状態。
subscriptionId string リソースのサブスクリプション ID。
complianceReasonCode string コンプライアンスの理由コード 空の場合もあります。

イベントの例

次の例は、サブスクリプション レベルでスコープ設定されたポリシー状態作成イベントのスキーマを示しています。

[{
    "id": "5829794FCB5075FCF585476619577B5A5A30E52C84842CBD4E2AD73996714C4C",
    "topic": "/subscriptions/<SubscriptionID>",
    "subject": "/subscriptions/<SubscriptionID>/resourceGroups/<ResourceGroup>/providers/<ProviderNamespace>/<ResourceType>/<ResourceName>",
    "data": {
        "timestamp": "2021-03-27T18:37:42.4496956Z",
        "policyAssignmentId": "<policy-assignment-scope>/providers/microsoft.authorization/policyassignments/<policy-assignment-name>",
        "policyDefinitionId": "<policy-definition-scope>/providers/microsoft.authorization/policydefinitions/<policy-definition-name>",
        "policyDefinitionReferenceId": "",
        "complianceState": "NonCompliant",
        "subscriptionId": "<subscription-id>",
        "complianceReasonCode": ""
    },
    "eventType": "Microsoft.PolicyInsights.PolicyStateCreated",
    "eventTime": "2021-03-27T18:37:42.5241536Z",
    "dataVersion": "1",
    "metadataVersion": "1"
}]

サブスクリプション レベルでスコープ設定されたポリシー状態変更イベントのスキーマは、次のようになります。

[{
    "id": "5829794FCB5075FCF585476619577B5A5A30E52C84842CBD4E2AD73996714C4C",
    "topic": "/subscriptions/<SubscriptionID>",
    "subject": "/subscriptions/<SubscriptionID>/resourceGroups/<ResourceGroup>/providers/<ProviderNamespace>/<ResourceType>/<ResourceName>",
    "data": {
        "timestamp": "2021-03-27T18:37:42.4496956Z",
        "policyAssignmentId": "<policy-assignment-scope>/providers/microsoft.authorization/policyassignments/<policy-assignment-name>",
        "policyDefinitionId": "<policy-definition-scope>/providers/microsoft.authorization/policydefinitions/<policy-definition-name>",
        "policyDefinitionReferenceId": "",
        "complianceState": "NonCompliant",
        "subscriptionId": "<subscription-id>",
        "complianceReasonCode": ""
    },
    "eventType": "Microsoft.PolicyInsights.PolicyStateChanged",
    "eventTime": "2021-03-27T18:37:42.5241536Z",
    "dataVersion": "1",
    "metadataVersion": "1"
}]

次の例は、管理グループ レベルでスコープ設定されたポリシー状態作成イベントのスキーマを示しています。

[{
    "id": "5829794FCB5075FCF585476619577B5A5A30E52C84842CBD4E2AD73996714C4C",
    "topic": "/tenants/<tenantId>/providers/Microsoft.Management/managementGroups/<managementGroupId>",
    "subject": "/subscriptions/<SubscriptionID>/resourceGroups/<ResourceGroup>/providers/<ProviderNamespace>/<ResourceType>/<ResourceName>",
    "data": {
        "timestamp": "2021-03-27T18:37:42.4496956Z",
        "policyAssignmentId": "<policy-assignment-scope>/providers/microsoft.authorization/policyassignments/<policy-assignment-name>",
        "policyDefinitionId": "<policy-definition-scope>/providers/microsoft.authorization/policydefinitions/<policy-definition-name>",
        "policyDefinitionReferenceId": "",
        "complianceState": "NonCompliant",
        "subscriptionId": "<subscription-id>",
        "complianceReasonCode": ""
    },
    "eventType": "Microsoft.PolicyInsights.PolicyStateCreated",
    "eventTime": "2021-03-27T18:37:42.5241536Z",
    "dataVersion": "1",
    "metadataVersion": "1"
}]

管理グループ レベルでスコープ設定されたポリシー状態変更イベントのスキーマは、次のようになります。

[{
    "id": "5829794FCB5075FCF585476619577B5A5A30E52C84842CBD4E2AD73996714C4C",
    "topic": "/tenants/<tenantId>/providers/Microsoft.Management/managementGroups/<managementGroupId>",
    "subject": "/subscriptions/<SubscriptionID>/resourceGroups/<ResourceGroup>/providers/<ProviderNamespace>/<ResourceType>/<ResourceName>",
    "data": {
        "timestamp": "2021-03-27T18:37:42.4496956Z",
        "policyAssignmentId": "<policy-assignment-scope>/providers/microsoft.authorization/policyassignments/<policy-assignment-name>",
        "policyDefinitionId": "<policy-definition-scope>/providers/microsoft.authorization/policydefinitions/<policy-definition-name>",
        "policyDefinitionReferenceId": "",
        "complianceState": "NonCompliant",
        "subscriptionId": "<subscription-id>",
        "complianceReasonCode": ""
    },
    "eventType": "Microsoft.PolicyInsights.PolicyStateChanged",
    "eventTime": "2021-03-27T18:37:42.5241536Z",
    "dataVersion": "1",
    "metadataVersion": "1"
}]

イベントの使用に関する手法

Azure Policy イベントを処理するアプリケーションは、こちらの推奨プラクティスに従う必要があります。

  • 同じイベント ハンドラーにイベントをルーティングするように複数のサブスクリプションを構成できるため、イベントが特定のソースからのものであると想定しないでください。 代わりに、メッセージのトピックを調べて、状態変更イベントが発生しているポリシー割り当て、ポリシー定義、およびリソースを確認します。
  • eventType を確認します。受信するすべてのイベントが予期する種類であると想定してはいけません。
  • 最上位レベルの eventTime または time プロパティを使用する代わりに、data.timestamp を使用して Azure Policy 内のイベントの順序を確認します。
  • 件名フィールドを使用して、ポリシー状態が変更されたリソースにアクセスします。

次のステップ

Event Grid の詳細について理解し、Azure Policy の状態変更イベントを試してみてください。