CEL-Matcher-Sprachreferenz

Common Expression Language (CEL) ist eine Open-Source-Sprache ohne Turing-Vollständigkeit, die eine gemeinsame Semantik für die Auswertung von Ausdrücken implementiert. Bei Diensterweiterungen wird eine Teilmenge von CEL-Bedingungen verwendet, um auf Grundlage von Attributdaten Entscheidungen zur Kettenauswertung zu treffen. Im Allgemeinen besteht ein Bedingungsausdruck aus einer oder mehreren Anweisungen, die durch logische Operatoren (&&, || oder !) verbunden sind.

Attribute

Bei jeder Verbindungsanfrage extrahiert der Proxy Attribute, die eine Reihe von Kontextinformationen darstellen. Attribute haben einen festen Typ (z. B. string oder int) und können je nach Kontext vorhanden sein oder fehlen. Attribute werden der CEL-Laufzeit während der Verarbeitung der Übereinstimmungsbedingung zur Verfügung gestellt. Attribute können nicht an einen Erweiterungsdienst gesendet werden.

Anfrageattribute

Die folgenden Attribute können aus Anfragen extrahiert werden:

Attribut Attributtyp Beschreibung
request.headers map{string,string} Eine String-zu-String-Zuordnung der HTTP-Anfrageheader. Wenn ein Header mehrere Werte enthält, ist der Wert in dieser Zuordnung ein kommagetrennter String aller Werte des Headers. Die Schlüssel in dieser Zuordnung sind kleingeschrieben.
request.method String Die HTTP-Anfragemethode, z. B. GET oder POST.
request.host String Convenience-Äquivalent zu request.headers['host'].
request.path String Der angeforderte HTTP-URL-Pfad.
request.query String

Die HTTP-URL-Abfrage im Format name1=value&name2=value2, wie sie in der ersten Zeile der HTTP-Anfrage angezeigt wird.

Es wird keine Decodierung durchgeführt.

request.scheme String Das HTTP-URL-Schema, z. B. HTTP oder HTTPS. Die Werte für dieses Attribut sind kleingeschrieben.
request.backend_service_name String

Der Back-End-Dienst, an den die Anfrage weitergeleitet wird.

Gilt nicht für Edge-Erweiterungen.

request.backend_service_project_number int

Bei Verwendung einer freigegebene VPC die Projektnummer des Backend-Dienstes, an den die Anfrage weitergeleitet wird.

Gilt nicht für Edge-Erweiterungen.

Verbindungsattribute

Die folgenden Attribute können aus Verbindungen extrahiert werden:

Attribut Attributtyp Beschreibung
source.ip String Die Quell-IP-Adresse der Anfrage.
source.port int Der Verbindungsport des Downstream-Clients.
connection.sni String Der angeforderte Servername der Downstream-TLS-Verbindung.
connection.tls_version String Die TLS-Version der Downstream-TLS-Verbindung. Gültige Werte: TLSv1, TLSv1.1, TLSv1.2 und TLSv1.3.
connection.sha256_peer_certificate_digest String Der hexadezimal codierte SHA256-Hash des Peer-Zertifikats in der Downstream-TLS-Verbindung, falls vorhanden.

Operatoren

Service Extensions unterstützt mehrere Operatoren, mit denen Sie komplexe Abgleichsbedingungen aus einfachen Ausdrucksanweisungen erstellen können. Service Extensions unterstützt logische Operatoren wie &&, || und ! sowie Operatoren zur Stringbearbeitung wie x.contains('y').

Stringbearbeitungsoperatoren vergleichen Strings oder Unterstrings, die Sie definieren. request.host.endsWith('.example.com') wird beispielsweise mit true ausgewertet, wenn die HTTP-Anfrage an eine Domain gesendet wurde, die mit example.com endet.

Mit logischen Operatoren können Sie mehrere Variablen in einem bedingten Ausdruck überprüfen. Beispiel: In request.method == 'GET' && request.host.matches('.example.com') werden zwei Anweisungen verknüpft, die beide true sein müssen, damit das Gesamtergebnis true ergibt.

Logische Operatoren

In der folgenden Tabelle werden die logischen Operatoren beschrieben, die von Dienst-Extensions unterstützt werden.

Beispielausdruck Beschreibung
x == "foo" Gibt true zurück, wenn x dem konstanten String-Literalargument entspricht.
x == R"fo'o" Gibt true zurück, wenn x dem angegebenen Raw-String-Literal entspricht, das keine Escape-Sequenzen interpretiert. Raw-String-Literale eignen sich gut für die Darstellung von Strings, die im Code Escape-Sequenz-Zeichen verwenden müssen.
x == y Gibt true zurück, wenn x gleich y ist.
x != y Gibt true zurück, wenn x ungleich y ist.
x && y Gibt true zurück, wenn sowohl x als auch y gleich true sind.
x || y Gibt true zurück, wenn x, y oder beide true sind.
!x Gibt true zurück, wenn der boolesche Wert x false ist, oder false, wenn der boolesche Wert x true ist.
m['k'] Wenn der Schlüssel k vorhanden ist, wird der Wert bei Schlüssel k in der String-zu-String-Zuordnung m zurückgegeben. Wenn der Schlüssel k nicht vorhanden ist, wird ein Fehler zurückgegeben, der dazu führt, dass die zu bewertende Regel nicht übereinstimmt.

Operatoren zur String-Bearbeitung

In der folgenden Tabelle werden die von Dienst-Extensions unterstützten Operatoren zur Stringbearbeitung beschrieben.

Ausdruck Beschreibung
x.contains(y) Gibt true zurück, wenn der String x den Teilstring y enthält.
x.startsWith(y) Gibt true zurück, wenn der String x mit dem Teilstring y beginnt.
x.endsWith(y) Gibt true zurück, wenn der String x mit dem Teilstring y endet.
x.matches(y)

Gibt true zurück, wenn der String x mit dem angegebenen RE2-Muster y übereinstimmt.

Bei der Kompilierung des RE2-Musters wird in Service Extensions die Option „RE2::Latin1“ verwendet, wodurch Unicode-Funktionen deaktiviert werden.

Bei Edge-Erweiterungen können Sie nur einen regulären Ausdruck pro CEL-Ausdruck verwenden.

x.lower() Gibt den Kleinbuchstabenwert des Strings x zurück.
x.upper() Gibt den Großbuchstabenwert des Strings x zurück.
int(x) Wandelt das Stringergebnis von x in einen int-Typ um. Sie können den konvertierten String für einen Ganzzahlvergleich mit standardmäßigen arithmetischen Operatoren wie „größer als“ (>) und „kleiner als oder gleich“ () verwenden. Das funktioniert allerdings nur bei Werten, die Ganzzahlen sein können.

Beispielausdrücke

Alle Anfragen an Host example.com mit Backend-Dienst bs1 in 123 als Endziel abgleichen:

request.host == "example.com" && request.backend_service_name == "bs1" &&
  request.backend_service_project_number == 123

Alle Anfragen für den Pfad */inventory mit einem HTTP-Header Hello abgleichen:

request.path.endsWith("/inventory") && request.headers["Hello"] != ""

Beschränkungen

Für CEL-Ausdrücke, die für Service-Erweiterungen angegeben werden, gelten die folgenden Einschränkungen:

  • Maximale Anzahl von Ausdrücken pro Erweiterung: 1 für Edge-Erweiterungen und 5 für andere Erweiterungen
  • Maximale Anzahl von Zeichen pro regulärem Ausdruck: 100
  • Maximale Anzahl von Zeichen pro CEL-Ausdruck: 500