本主题介绍如何利用自定义指标监控资产配置变化。如需详细了解实时通知,请参阅一般主题。
概览
如需仅查看给定资产的特定类型的更改,您可以向 Feed 添加条件。
condition
对象是可选的。如果 Feed 没有 condition
对象,则配置的目标会接收资产的所有更改。
condition
对象具有以下结构:
"condition": {
"title": "...",
"description": "...",
"expression": "..."
}
Title
和 description
是可选的。这些字段可帮助您识别和描述条件。
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
以下条件表达式会发送针对位于文件夹 12345
和 23456
中的资源的通知:
"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"