Azure Policy 状態変更イベントに対応する
Azure Policy イベントによって、アプリケーションは状態の変化に対応可能になります。 この統合を実行するために、複雑なコードや、高価で非効率的なポーリング サービスは必要ありません。 代わりにイベントが、Azure Event Grid を通して、Azure Functions、Azure 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 つのエンティティがあります。
- イベント: これらのイベントは、ユーザーが対応する可能性のある、Azure リソースのイベントです。 たとえば、仮想マシンやストレージ アカウントなどのリソースに関するポリシー コンプライアンスの状態が作成、変更、削除された場合などです。
- Event Grid サブスクリプション: これらのイベント サブスクリプションは、パブリッシャーからサブスクライバーに適切なイベント セットを送信する、ユーザーが構成したエンティティです。 イベント サブスクリプションでは、イベントの発生元のリソース パスとイベントの種類に基づいてイベントをフィルター処理できます。 さらに、イベント サブスクリプションは、Azure サブスクリプションと管理グループ間のスコープでフィルター処理することもできます。
Azure Policy イベントのよくあるシナリオは、リソースのコンプライアンスの状態がポリシーの評価中に変わるタイミングを追跡することです。 イベント ベースのアーキテクチャは、これらの変化に対応するための効率的な方法であり、コンプライアンスの状態の変化に対してイベント ベースで対応するために役立ちます。
別のシナリオは、ポリシー ページで [修復タスクの作成] を手動で選択することなく、修復タスクを自動的にトリガーする場合です。 Event Grid では、コンプライアンスの状態と、現在非準拠で修復が可能なリソースを確認できます。 修復の構造について詳細をご覧ください。 修復にはマネージド ID が必要であり、ポリシーの効果は modify
または deployIfNotExists
である必要があります。 効果の種類について詳細をご覧ください。
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 の状態変更イベントを試してみてください。