利用条件监控资产配置变化

本主题介绍如何利用自定义指标监控资产配置变化。如需详细了解实时通知,请参阅一般主题

概览

如需仅查看给定资产的特定类型的更改,您可以向 Feed 添加条件。

condition 对象是可选的。如果 Feed 没有 condition 对象,则配置的目标会接收资产的所有更改。

condition 对象具有以下结构:

"condition": {
    "title": ...
    "description": ...
    "expression": ...
}

Titledescription 是可选的。这些字段可帮助您识别和描述条件。

expression 字段使用通用表达式语言 (CEL) 定义用于评估通知的表达式。根据 CEL 语言规范,条件表达式可以包含多个语句,语句使用逻辑运算符进行组合。

使用 CEL

通用表达式语言 (CEL) 是用于指定 Feed 条件的表达式语言。它专门用来表达基于特性的逻辑表达式。如需了解详情,请参阅 CEL 规范及其语言定义

在 Feed 条件中,CEL 用于根据特性数据进行布尔值决策。条件表达式由一个或多个使用逻辑运算符(&&||!)联接的语句组成。每个语句表示一条适用于 TemporalAsset 且基于特性的控制规则,用于确定是否发送通知。

对于 Feed 条件,以下 CEL 特性是最重要的:

  • 变量:条件使用“变量”来表示给定特性,例如 temporal_asset.deleted(布尔值类型)或 temporal_asset.asset.name(字符串类型)。这些变量会根据运行时的上下文填充值。
  • 运算符:每种数据类型(例如字符串)都支持一组可用于创建逻辑表达式的“运算符”。通常,运算符用于比较变量中包含的值和字面量值,如 temporal_asset.asset.name == "//cloudresourcemanager.googleapis.com/projects/12345"。在本示例中,如果 temporal_asset.asset.name 的输入值为 //cloudresourcemanager.googleapis.com/projects/12345,则表达式的计算结果为 true
  • 函数:函数是支持更复杂运算的数据类型的“复合”运算符。在条件表达式中,有可以与给定数据类型结合使用的预定义函数。例如,temporal_asset.asset.name.contains("keyword") 使用字符串包含函数,并且如果 temporal_asset.asset.name 的值包含“keyword”,则计算结果为 true
  • 逻辑运算符:Conditions 支持三种逻辑运算符(&&||!),您可以将这三种逻辑运算符和简单表达式语句结合使用,构建复杂逻辑表达式。这些逻辑运算符可让您在条件表达式中使用多个输入变量。例如:temporal_asset.deleted && temporal_asset.window.start_time.getFullYear() > 2020 连接了两个简单语句,而且必须同时满足这两个语句,才能生成总体计算结果 true

如需详细了解 CEL 特性,请参阅语言定义

使用条件变量

条件变量允许您针对不同的特性创建条件。支持的条件变量包括:

  • temporal_asset: TemporalAsset 格式的当前资产更改。如果条件计算结果为 true,则 TemporalAsset 将被发送到已配置的目标。

条件表达式示例

以下条件表达式会发送关于创建事件的通知:

!temporal_asset.deleted &&
temporal_asset.prior_asset_state == google.cloud.asset.v1.TemporalAsset.PriorAssetState.DOES_NOT_EXIST

以下条件表达式会发送针对位于文件夹 1234523456 中的资源的通知:

"folders/12345" in temporal_asset.asset.ancestors ||
"folders/23456" in temporal_asset.asset.ancestors

假设在 Feed 中已将 asset_type 设置为 compute.googleapis.com/Firewall,当新的允许规则被添加到防火墙时,以下条件表达式会发送通知。

size(temporal_asset.asset.resource.data.allowed) >
size(temporal_asset.prior_asset.resource.data.allowed)

假设在 Feed 中已将 asset_type 设置为 compute.googleapis.com/Instance,以下条件表达式会针对 n1-standard-1 机器类型的虚拟机实例发送通知。

temporal_asset.asset.resource.data.machineType.endsWith("/machineTypes/n1-standard-1")

假设在 Feed 中已将 asset_type 设置为 storage.googleapis.com/Bucket 并且 content_type 设置为 IAM_POLICY,则以下条件表达式会为具有针对 allUsers 的 IAM 政策的存储分区发送通知。

temporal_asset.asset.iam_policy.bindings.exists(b, b.members.exists(m, m == "allUsers"))

已知限制

  • 条件表达式中的大多数变量名称表示为 snake_case。唯一的例外情况是 Resource 对象中 data 子字段的变量名称,它们表示为 camelCase。

  • 条件表达式的长度上限为 3000 个字符。

  • 对条件表达式的某些验证会在 Feed 创建/更新时执行。但是,此类验证并不全面,尤其是对于在 temporal_asset.asset.resource.data 字段(具有动态类型)上设置的条件。我们建议使用简单的 Feed 条件,并在 Feed 中指定适当的 asset_type。如果计算期间发生了验证错误,则系统不会发送通知,并会记录错误。了解如何查看日志

  • 对于 temporal_asset.asset.resource.data 中的动态类型,在缺失字段上指定的条件会触发运行时错误,并且通知不会发布。例如,对于条件 temporal_asset.asset.resource.data.name != "my_name",如果更新中缺少 name 字段,则计算将失败,您也不会收到通知。如果条件仅在某些字段存在时有效,请检查条件中是否存在这些字段,以确保能够正确计算条件。

  • 静态枚举类型可以表示为完全限定的路径名称或原始整数。例如,以下表达式对于 prior_asset_state 有效:

    temporal_asset.prior_asset_state == google.cloud.asset.v1.TemporalAsset.PriorAssetState.DOES_NOT_EXIST
    

    temporal_asset.prior_asset_state == 3
    

    temporal_asset.asset.resource.data 中的动态枚举类型表示为原始字符串。例如,以下表达式对资产类型 cloudresourcemanager.googleapis.com/Project 有效:

    temporal_asset.asset.resource.data.lifecycleState == "ACTIVE"