对 Azure Policy 状态更改事件做出响应
Azure Policy 事件允许应用程序对状态更改做出响应。 此集成无需复杂的代码或成本高昂但效率低下的轮询服务。 它可以通过 Azure 事件网格向订阅方(如 Azure Functions、Azure 逻辑应用)甚至向你自己的自定义 HTTP 侦听器推送事件。 至关重要的是,你只为你使用的资源付费。
Azure Policy 事件会发送到 Azure 事件网格,通过丰富的重试策略和死信传递向应用程序提供可靠的传递服务。 事件网格负责通过事件网格订阅将事件正确路由、筛选和多播到目标。 若要了解详细信息,请参阅事件网格消息传递和重试。
事件网格的好处
事件网格对 Azure 生态系统中的客户和服务有几项好处:
- 自动化:为了随时了解策略环境,事件网格提供了一种自动化机制,用于根据符合性状态生成警报和触发任务。
- 持久交付:为了使服务和用户应用程序能够实时响应策略符合性事件,事件网格力求提供具有最低延迟的策略事件。 如果订阅者的终结点无法确认收到事件,或者未确认收到事件,则事件网格会根据预先确定的重试计划和重试策略重试该事件的传输。
- 自定义事件生成者:事件网格事件生成者和使用者不需要是 Azure 或 Microsoft 服务。 外部应用程序可以接收警报、显示修正任务的创建或收集有关谁响应状态更改的消息。 有关完整教程,请参阅使用 Azure CLI 将策略状态更改事件路由到事件网格。
使用事件网格时有两个主要实体:
- 事件:事件可以是用户想要做出任何响应的对象,包括是否创建、更改和删除了资源(例如 VM 或存储帐户)的策略符合性状态。
- 事件网格订阅:这些事件订阅是用户配置的实体,用于将适当的事件集从发布服务器定向到订阅服务器。 事件订阅可以根据事件源自的资源路径和事件类型筛选事件。 此外,事件订阅还可以按 Azure 订阅和管理组之间的范围进行筛选。
一个常见的 Azure Policy 事件方案是在策略评估期间跟踪资源的符合性状态何时发生更改。 基于事件的体系结构是响应这些更改的有效方法,有助于对符合性状态更改做出基于事件的反应。
另一种方案是自动触发修正任务,而无需在策略页上手动勾选创建修正任务。 事件网格会检查符合性状态,并对当前不符合的资源进行修正。 详细了解修正结构。 修正过程要求托管标识和策略必须处于 Modify 或 DeployIfNotExists 效果中。 详细了解效果类型。
此外,事件网格作为审核系统有助于存储状态更改并了解不符合的原因随时间的变化。 事件网格的方案是无穷无尽的,可根据动机配置事件网格。
可用事件类型
Azure Policy 发出以下事件类型:
事件类型 | 说明 |
---|---|
Microsoft.PolicyInsights.PolicyStateCreated | 在创建策略符合性状态时引发。 |
Microsoft.PolicyInsights.PolicyStateChanged | 在策略符合性状态发生更改时引发。 |
Microsoft.PolicyInsights.PolicyStateDeleted | 在删除策略符合性状态时引发。 |
事件属性
事件具有以下顶级数据:
属性 | 类型 | 说明 |
---|---|---|
topic |
string | 事件源的完整资源路径。 此字段不可写入。 事件网格提供此值。 |
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 | 事件元数据的架构版本。 事件网格定义顶级属性的架构。 事件网格提供此值。 |
数据对象具有以下属性:
属性 | 类型 | 说明 |
---|---|---|
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
且不可假定所接收的事件均为预期的类型。 - 使用
data.timestamp
确定事件在 Azure Policy 中的顺序,而不是顶层eventTime
或time
属性。 - 使用主题字段访问策略状态发生更改的资源。
后续步骤
要详细了解事件网格并尝试 Azure Policy 状态更改事件,请参阅: