このトピックでは、カスタマイズされた条件によるアセットの変更をモニタリングする方法について説明します。リアルタイム通知の詳細については、一般的なトピックをご覧ください。
概要
任意のアセットに対して特定の種類の変更のみを表示するには、フィードに条件を追加します。
condition
オブジェクトは省略可能です。フィードに condition
オブジェクトがない場合、構成された宛先にアセットに対するすべての変更が送信されます。
condition
オブジェクトの構造は次のとおりです。
"condition": {
"title": "...",
"description": "...",
"expression": "..."
}
Title
と description
は省略可能です。これらのフィールドは、条件を特定、説明するのに役立ちます。
expression
フィールドは、Common Expression Language(CEL)で通知を評価するために使用される式を定義します。条件式には複数のステートメントを含めることができ、ステートメントは、CEL 言語仕様に従い、論理演算子を使用して結合されます。
CEL の使用
Common Expression Language(CEL)は、フィード条件の指定に使用する式言語です。これは属性ベースの論理式を表現することに特化して調整されています。詳細については、CEL の仕様と言語の定義をご覧ください。
フィード条件では、CEL を使用して、属性データに基づきブール判定を行います。条件式は、論理演算子(&&
、||
)を使用して結合された 1 つ以上のステートメントで構成されます。各ステートメントは、通知が送信されたかどうかを判定するために TemporalAsset
に適用される属性ベースの制御ルールを表します。
フィードの状態にとって最も重要な 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
の値に「キーワード」が含まれている場合にはtrue
と判定されます。論理演算子: Conditions では、単純な式のステートメントから複雑な論理式を作成するために使用できる論理演算子(
&&
と||
)がサポートされています。これらの論理演算子を使用すると、1 つの条件式で複数の入力変数を使用できます。たとえば、temporal_asset.deleted && temporal_asset.window.start_time.getFullYear() > 2020
は 2 つの単純なステートメントを結合し、全体的な評価結果として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
次の条件式は、フィード内の asset_type
がすでに compute.googleapis.com/Firewall
に設定されていることを前提として、新たに許可されたルールがファイアウォールに追加されるときに通知を送信します。
size(temporal_asset.asset.resource.data.allowed) >
size(temporal_asset.prior_asset.resource.data.allowed)
次の条件式は、フィードで asset_type
がすでに compute.googleapis.com/Instance
に設定されていることを前提として、n1-standard-1
マシンタイプの VM インスタンスに関する通知を送信します。
temporal_asset.asset.resource.data.machineType.endsWith('/machineTypes/n1-standard-1')
次の条件式は、フィードで 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 で表現されます。条件式の長さは 3,000 文字以内に制限されます。
条件式の検証には、フィードの作成時または更新時に行われるものもあります。ただし、そのような検証は、特にダイナミック型の
temporal_asset.asset.resource.data
フィールドで設定される条件では、包括的なものではありません。フィードに適切な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"