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

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

概览

如需仅查看给定资产的特定类型的更改,您可以向 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(类型为 String)。系统会根据运行时的上下文填充这些变量的值。

  • 运算符:每种数据类型(例如 String)都支持一组可用于创建逻辑表达式的运算符。通常,运算符用于将变量中包含的值与字面量值(如 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") 使用 String 包含函数,如果 temporal_asset.asset.name 的值包含“keyword”,则计算结果为 true

  • 逻辑运算符:条件支持逻辑运算符,可用于根据简单的表达式语句构建复杂的逻辑表达式:&&||。通过这些逻辑运算符,您可以在条件表达式中使用多个输入变量。例如:temporal_asset.deleted && temporal_asset.window.start_time.getFullYear() > 2020 可联接两个简单的语句,并且需要同时满足这两个语句才能生成 true 的总体评估结果。

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

使用条件变量

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

  • temporal_asset::当前素材资源的变化,采用 TemporalAsset 格式。如果条件评估结果为 true,则系统会将 TemporalAsset 发送到配置的目的地。

条件表达式示例

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

temporal_asset.deleted == false &&
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"))

以下条件表达式会在标签具有 test 键的存储桶被删除时发送通知:

temporal_asset.deleted == true && temporal_asset.prior_asset_state == google.cloud.asset.v1.TemporalAsset.PriorAssetState.PRESENT && "test" in temporal_asset.prior_asset.resource.data.labels

已知限制

  • 条件表达式中的大多数变量名称表示为 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"