Common Expression Language を使用する

Common Expression Language(CEL)は、式の評価に使用できるオープンソースの非チューリング完全な言語です。Eventarc Advanced のすべての登録には、メッセージの評価とフィルタリングに使用される CEL で記述された条件式が含まれています。CEL を使用して変換式を記述することで、イベントデータ コンテンツを変換することもできます。

一般に、条件式は論理演算子(&&||、または !)で結合された 1 つ以上のステートメントで構成されます。各ステートメントは、データに適用される属性ベースのルールを表します。通常、演算子を使用して変数に含まれる値とリテラル値とを比較します。

たとえば、message.type の値が google.cloud.dataflow.job.v1beta3.statusChanged の場合、式 message.type == "google.cloud.dataflow.job.v1beta3.statusChanged"True と評価されます。

詳しくは以下をご覧ください。

使用可能な属性

すべてのイベント コンテキスト属性には、事前定義された message オブジェクトを介して変数としてアクセスできます。これらの変数には、実行時にイベント コンテキスト属性に基づいて値が設定されます。登録では、変数を使用して特定の属性を表現できます。たとえば、message.typetype 属性の値を返します。

次の点にご注意ください。

  • イベントには、一意の名前を持つカスタム CloudEvents 属性を任意の数追加できます(拡張属性とも呼ばれます)。登録で使用できるカスタム属性は、イベントに追加された属性に限りません。ただし、実際の形式に関係なく、CEL 式では String 型として表されます。CEL 式を使用して、値を他の型にキャストできます。

  • イベント ペイロードの内容に基づいて登録を評価することはできません。message.datamessage.data_base64 はどちらも予約済み変数であり、式で使用できません。ただし、CEL はイベントデータの変換でサポートされているため、イベント ペイロードの内容を変更できます(特定のリンク先の API 契約を満たすためなど)。

登録の条件式を評価するときに、次の属性にアクセスできます。

属性 属性タイプ 説明
message.datacontenttype String data 値のコンテンツ タイプ
message.dataschema URI data が準拠するスキーマを識別します。
message.id String イベントを識別します。プロデューサーは、source + id が個別のイベントごとに一意であることを確認する必要があります。
message.source URI-reference イベントが発生したコンテキストを識別します。
message.specversion String イベントで使用される CloudEvents 仕様のバージョン
message.subject String イベント プロデューサー(source で識別)のコンテキストでイベントの件名を記述します。
message.time Timestamp 発生した時点のタイムスタンプ。CloudEvents プロデューサーによって別の時刻(現在の時刻など)に設定される場合がありますが、同じ source のすべてのプロデューサーは一貫している必要があります。
message.type String 元のオカレンスに関連するイベントのタイプを説明します。

演算子と関数

演算子と関数を使用して、複雑な論理式を作成できます。

&&||,! などの論理演算子を使用すると、条件式で複数の変数を検証できます。たとえば、message.time.getFullYear() < 2020 && message.type == "google.cloud.dataflow.job.v1beta3.statusChanged" は 2 つのステートメントを結合し、全体的な結果として True を生成するには両方のステートメントが True である必要があります。

x.contains('y') などの文字列操作演算子は、定義した文字列または部分文字列と照合します。これにより、考えられるすべての組み合わせを一覧参照することなく、メッセージを照合するルールを開発できます。

Eventarc Advanced は、mergeflatten などの拡張関数もサポートしています。これらの関数を使用すると、データを変換し、バスから受信したイベントの変更を簡素化できます。

CEL の定義済み演算子と関数CEL の定義済みマクロのリストをご覧ください。

論理演算子

次の表に、Eventarc Advanced がサポートする論理演算子を示します。

説明
x == "my_string" x が定数文字列リテラル引数と等しい場合、True を返します。
x == R"my_string\n" x がエスケープ シーケンスを解釈しない指定された元の文字列リテラルと等しい場合、True を返します。生文字列リテラルは、正規表現やプログラム テキストなど、文字列自体がエスケープ シーケンスを使用する必要がある文字列を表現するのに便利です。
x == y xy と等しい場合、True を返します。
x != y xy と等しくない場合、True を返します。
x && y xy の両方が True の場合は、True を返します。
x || y xy、またはその両方が True の場合、True を返します。
!x ブール値 xFalse の場合は True を返し、ブール値 xTrue の場合は False を返します。
m['k'] キー k が存在する場合は、文字列間マップ m のキー k の値を返します。キー k が存在しない場合、評価対象のルールが一致しない原因となるエラーが返されます。

文字列操作演算子

次の表に、Eventarc Advanced がサポートする文字列操作演算子を示します。

説明
double(x) x の文字列の結果を double 型に変換します。変換された文字列は、><= などの標準の算術演算子を使用して浮動小数点数を比較するために使用できます。これは、浮動小数点数にできる値でのみ機能します。
int(x) x の文字列の結果を int 型に変換します。変換された文字列は、><= などの標準の算術演算子を使用して整数を比較するために使用できます。これは、整数にできる値にのみ適用されます。
x + y 連結された文字列 xy を返します。
x.contains(y) 文字列 x に部分文字列 y が含まれている場合は、True を返します。
x.endsWith(y) 文字列 x が部分文字列 y で終わる場合、True を返します。
x.join() 文字列リストの要素が連結された新しい文字列を返します。結果の文字列の要素間に配置する区切り文字(省略可)を指定します。たとえば、次の式は 'hello world' を返します。

['hello', 'world'].join(' ')

x.lowerAscii() すべての ASCII 文字が小文字の新しい文字列を返します。
x.matches(y)

文字列 x が指定された RE2 パターン y と一致する場合、True を返します。

RE2 パターンは、Unicode 機能を無効にする RE2::Latin1 オプションを使用してコンパイルされます。

x.replace(y,z) 部分文字列 y が部分文字列 z に置き換えられた新しい文字列を返します。置換する回数を制限するオプションの引数を受け入れます。たとえば、次の式は 'wello hello' を返します。

'hello hello'.replace('he', 'we', 1)

x.split(y) 区切り文字 y で入力から分割された文字列のリストを返します。生成するサブ文字列の数を制限するオプションの引数を受け入れます。たとえば、次の式は ['hello', 'hello hello'] を返します。

'hello hello hello'.split(' ', 2)

x.startsWith(y) 文字列 x が部分文字列 y で始まる場合は、True を返します。
x.upperAscii() すべての ASCII 文字が大文字の新しい文字列を返します。

正規表現関数

次の表に、Eventarc Advanced でサポートされている正規表現関数を示します。

説明
re.capture(target,regex)

regex を使用して、target 文字列内の最初の名前なしまたは名前付きグループ値をキャプチャし、文字列を返します。たとえば、次の式は "o" を返します。

re.capture("hello", R"hell(o)")

re.captureN(target,regex) regex を使用して、target 文字列からグループ名と文字列(名前付きグループの場合)とグループ インデックスと文字列(名前なしグループの場合)をキャプチャし、キーと値のペアのマップを返します。たとえば、次の式は {"1": "user", "Username": "testuser", "Domain": "testdomain"} を返します。

re.captureN("The user testuser belongs to testdomain", R"The (user|domain) (?P.*) belongs to (?P.*)")

re.extract(target,regex,rewrite) regex を使用して、target 文字列から一致するグループ値を抽出し、rewrite 引数に基づいてフォーマットされた抽出された値の文字列を返します。たとえば、次の式は "example.com" を返します。

re.extract("alex@example.com", "(^.*@)(.*)", "\\2")

x.matches(regex)

文字列 x が指定された RE2 パターン regex と一致する場合、True を返します。

RE2 パターンは、Unicode 機能を無効にする RE2::Latin1 オプションを使用してコンパイルされます。

正規表現は RE2 構文に基づく必要があります。正規表現の前に付いている R は、エスケープが不要な未加工の文字列を示します。

拡張関数

Eventarc Advanced は、バスを介して受信したイベントデータを変換するために使用できる特定の拡張関数をサポートしています。詳細と例については、受信したイベントを変換するをご覧ください。

次のステップ