Common Expression Language を使用する

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

  • イベント コンテキスト属性に CEL 条件式を適用して、公開アクセスを制御する

  • CEL を使用して変換式を記述することで、イベントデータ コンテンツを変換する

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

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

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

使用可能な属性

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

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

条件式を評価するときに、次の属性にアクセスできます。
属性 属性タイプ 説明
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 元の発生に関連するイベントのタイプを説明します。 Eventarc でサポートされているGoogle イベントタイプ をご覧ください

演算子と関数

演算子と関数を使用して、複雑なロジック式を作成できます。

論理演算子(&&||! など)を使用すると、条件式で複数の 変数を検証できます。たとえば、 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" True がエスケープ シーケンスを解釈しない指定された元の 文字列リテラルと等しい場合、x を返します。生文字列リテラルは、正規表現やプログラム テキストなど、エスケープ シーケンスを使用する必要がある文字列を表現するのに便利です。
x == y Truexy と等しい場合に返します。
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 は、バスを介して受信したイベントデータの変換に使用できる特定の拡張関数をサポートしています。詳細と例については、 受信したイベントを変換するをご覧ください。

次のステップ