Common Expression Language(CEL)は、式の評価に共通のセマンティクスを実装するオープンソースの非チューリング完全言語です。Service Extensions は、CEL 条件のサブセットを使用して、属性データに基づいてチェーン評価の決定を行います。一般に、条件式は論理演算子(&&、||、または !)で結合された 1 つ以上のステートメントから構成されます。
属性
特定の接続リクエストに対して、プロキシは属性(コンテキスト情報のセット)を抽出します。属性には固定型(string や int など)があり、コンテキストに応じて存在する場合と存在しない場合があります。属性は、一致条件の処理中に CEL ランタイムに公開されます。特定の属性を拡張機能サービスまたはプラグインに転送するには、forwardAttributes フィールドを使用します。詳細については、サポートされている属性をご覧ください。
リクエストの属性
リクエストから次の属性を抽出できます。
| 属性 | 型 | LbEdge |
LbRoute |
LbTraffic |
Authz |
CdnEdge |
説明 |
|---|---|---|---|---|---|---|---|
request.headers |
地図 | ✓ | ✓ | ✓ | ✓ | ✓ | HTTP リクエスト ヘッダーの文字列間マップ。すべてのキーは小文字です。 |
request.method |
文字列 | ✓ | ✓ | ✓ | ✓ | ✓ | HTTP リクエスト メソッド(例: GET、POST)。 |
request.host |
文字列 | ✓ | ✓ | ✓ | ✓ | ✓ | request.headers['host'] と同等の利便性。 |
request.path |
文字列 | ✓ | ✓ | ✓ | ✓ | ✓ | リクエストした HTTP URL パス。 |
request.query |
文字列 | ✓ | ✓ | ✓ | ✓ | ✓ | URL クエリ文字列(name1=value&name2=value2)。 |
request.scheme |
文字列 | ✓ | ✓ | ✓ | ✓ | ✓ | URL スキーム(http または https)。 |
request.backend_service_name |
文字列 | — | ✓ | ✓ | — | — | バックエンド サービス名。 |
request.backend_service_project_number |
int | — | ✓ | ✓ | — | — | バックエンド サービスのプロジェクト番号。 |
接続属性
接続から次の属性を抽出できます。
| 属性 | 型 | LbEdge |
LbRoute |
LbTraffic |
Authz |
CdnEdge |
説明 |
|---|---|---|---|---|---|---|---|
source.ip |
文字列 | ✓ | ✓ | ✓ | ✓ | — | クライアントの IP アドレス。 |
source.port |
int | ✓ | ✓ | ✓ | ✓ | ✓ | クライアント接続ポート番号。 |
source.client_region |
文字列 | ✓ | — | ✓ | — | ✓ | 2 文字のクライアントの国または地域コード。 |
connection.sni |
文字列 | ✓ | — | ✓ | ✓ | ✓ | ダウンストリーム TLS Server Name Indication。 |
connection.tls_version |
文字列 | ✓ | — | ✓ | ✓ | ✓ | ダウンストリーム TLS バージョン(例: TLSv1.2、TLSv1.3)。 |
connection.sha256_peer_certificate_digest |
文字列 | ✓ | — | ✓ | ✓ | — | ピア証明書の SHA-256 ダイジェスト。 |
演算子
Service Extensions では、単純な式のステートメントから複雑な一致条件を作成するために使用できる演算子がいくつかサポートされています。Service Extensions では、&&、||、! などの論理演算子と、x.contains('y') などの文字列操作演算子がサポートされています。
文字列操作演算子は、定義した文字列または部分文字列と照合します。たとえば、example.com で終わるドメインに対して HTTP リクエストが行われた場合、request.host.endsWith('.example.com') は true と評価されます。
論理演算子を使用すると、条件式で複数の変数を検証できます。たとえば、request.method == 'GET' && request.host.matches('.example.com') は 2 つのステートメントを結合し、全体的な結果として true を生成するには両方のステートメントが true である必要があります。
論理演算子
次の表に、Service Extensions がサポートする論理演算子を示します。
| 式の例 | 説明 |
|---|---|
x == "foo" |
x が定数文字列リテラル引数と等しい場合、true を返します。 |
x == R"fo'o" |
x がエスケープ シーケンスを解釈しない指定された元の文字列リテラルと等しい場合、true を返します。元の文字列リテラルは、コードでシーケンス文字をエスケープするために使用する文字列を表現するのに便利です。 |
x == y |
x が y と等しい場合、true を返します。 |
x != y |
x が y と等しくない場合は true を返します。 |
x && y |
x と y の両方が true の場合は、true を返します。 |
x || y |
x、y、またはその両方が true の場合、true を返します。 |
!x |
ブール値 x が false の場合は true を返し、ブール値 x が true の場合は false を返します。 |
m['k'] |
キー k が存在する場合、文字列間マップ m のキー k の値を返します。キー k が存在しない場合は、評価中のルールが一致しないというエラーを返します。 |
k in m |
文字列キーマップ m にキー k が存在する場合は、true を返します。それ以外の場合は、false を返します。 |
文字列操作演算子
次の表に、Service Extensions がサポートする文字列操作演算子を示します。
| 式 | 説明 |
|---|---|
x.contains(y) |
文字列 x に部分文字列 y が含まれている場合は、true を返します。 |
x.startsWith(y) |
文字列 x が部分文字列 y で始まる場合に true を返します。 |
x.endsWith(y) |
文字列 x が部分文字列 y で終わる場合、true を返します。 |
x.matches(y) |
文字列 Service Extensions は、RE2 パターンをコンパイルするときに RE2::Latin1 オプションを使用します。これにより、Unicode 機能が無効になります。 Edge 拡張機能では、CEL 式ごとに 1 つの正規表現のみを使用できます。 |
x.lower() |
文字列 x の小文字の値を返します。 |
x.upper() |
文字列 x の大文字の値を返します。 |
int(x) |
x の文字列の結果を int 型に変換します。変換後の文字列は、大なり(>)や以下(≤)などの標準の算術演算子を使用して整数の比較に使用できます。これは、整数に変換できる値に対してのみ機能します。 |
式のサンプル
123 のバックエンド サービス bs1 を最終宛先とするホスト example.com へのすべてのリクエストにマッチさせる
request.host == "example.com" && request.backend_service_name == "bs1" && request.backend_service_project_number == 123
HTTP ヘッダー Hello を持つパス */inventory に対するすべてのリクエストにマッチさせる。CEL の照合では、ヘッダー名の大文字と小文字は区別されません。
request.path.endsWith("/inventory") && "Hello" in request.headers
制限事項
Service Extensions に指定された CEL 式には、次の制限が適用されます。
- 拡張機能あたりの最大式数: エッジ拡張機能の場合は 1、その他の拡張機能の場合は 5
- 正規表現あたりの最大文字数: 100
- CEL 式あたりの最大文字数: 500