条件を使用したアセット変更のモニタリング

このトピックでは、カスタマイズした条件でアセットの変更をモニタリングする方法を説明します。リアルタイム通知の詳細については、一般的なトピックをご覧ください。

概要

任意のアセットに対して特定の種類の変更のみを表示するには、フィードに条件を追加します。

condition オブジェクトは省略可能です。フィードに condition オブジェクトがない場合、構成された宛先にアセットに対するすべての変更が送信されます。

condition オブジェクトの構造は次のとおりです。

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

Titledescription は省略可能です。これらのフィールドは、条件を特定、説明するのに役立ちます。

expression フィールドは、Common Expression Language(CEL)で通知を評価するために使用される式を定義します。条件式には複数のステートメントを含めることができ、ステートメントは、CEL 言語仕様に従い、論理演算子を使用して結合されます。

CEL の使用

Common Expression Language(CEL)は、フィード条件の指定に使用する式言語です。これは属性ベースの論理式を表現することに特化して調整されています。詳細については、CEL の仕様言語の定義をご覧ください。

フィード条件では、CEL を使用して、属性データに基づきブール判定を行います。条件式は、論理演算子(&&||!)を使用して結合された 1 つ以上のステートメントで構成されます。各ステートメントは、通知が送信されたかどうかを判定するために TemporalAsset に適用される属性ベースの制御ルールを表します。

フィードの状態にとって最も重要な CEL 機能は次のとおりです。

  • 変数: 条件で使用される変数は、(Boolean 型の)temporal_asset.deleted や(String 型の)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 の値に「キーワード」が含まれている場合には true と判定されます。
  • 論理演算子: Conditions では、単純な式のステートメントから複雑な論理式を作成するために使用できる 3 つの論理演算子(&&||!)がサポートされています。これらの論理演算子を使用すると、1 つの条件式で複数の入力変数を使用できます。たとえば、temporal_asset.deleted && temporal_asset.window.start_time.getFullYear() > 2020 は 2 つの単純なステートメントを結合し、全体的な評価結果として 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

次の条件式は、フィード内の 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_typestorage.googleapis.com/Bucket に設定され、content_typeIAM_POLICY に設定されていると想定して、allUsers の IAM ポリシーを含むストレージ バケットに関する通知を送信します。

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

既知の制限事項

  • 条件式のほとんどの変数名は、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"