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. Diensterweiterungen verwenden eine Teilmenge von CEL-Bedingungen, um Entscheidungen zur Kettenbewertung auf Grundlage von Attributdaten zu treffen. Im Allgemeinen besteht ein Bedingungsausdruck aus einer oder mehreren Anweisungen, die durch logische Operatoren (&&, || oder !) verbunden sind.
Attribute
Für jede Verbindungsanfrage extrahiert der Proxy Attribute, die eine Reihe von Kontextinformationen sind. Attribute haben einen festen Typ (z. B. string oder int) und können je nach Kontext vorhanden sein oder nicht.
Attribute werden während der Verarbeitung der Übereinstimmungsbedingung für die CEL-Laufzeit verfügbar gemacht. Wenn Sie bestimmte Attribute an Ihren Erweiterungsdienst oder Ihr Plug-in weiterleiten möchten, verwenden Sie das Feld forwardAttributes. Weitere Informationen finden Sie unter Unterstützte Attribute.
Anfrageattribute
Sie können die folgenden Attribute aus Anfragen extrahieren:
| Attribut | Typ | LbEdge |
LbRoute |
LbTraffic |
Authz |
CdnEdge |
Beschreibung |
|---|---|---|---|---|---|---|---|
request.headers |
Karte | ✓ | ✓ | ✓ | ✓ | ✓ | Eine String-zu-String-Zuordnung von HTTP-Anfrageheadern, wobei alle Schlüssel kleingeschrieben sind. |
request.method |
String | ✓ | ✓ | ✓ | ✓ | ✓ | Die HTTP-Anfragemethode (z. B. GET, POST). |
request.host |
String | ✓ | ✓ | ✓ | ✓ | ✓ | Convenience-Äquivalent zu request.headers['host']. |
request.path |
String | ✓ | ✓ | ✓ | ✓ | ✓ | Der angeforderte HTTP-URL-Pfad. |
request.query |
String | ✓ | ✓ | ✓ | ✓ | ✓ | Der URL-Abfragestring (name1=value&name2=value2). |
request.scheme |
String | ✓ | ✓ | ✓ | ✓ | ✓ | Das URL-Schema (http oder https). |
request.backend_service_name |
String | – | ✓ | ✓ | – | – | Der Name des Backend-Dienstes. |
request.backend_service_project_number |
int | – | ✓ | ✓ | – | – | Projektnummer des Backend-Dienstes. |
Verbindungsattribute
Sie können die folgenden Attribute aus Verbindungen extrahieren:
| Attribut | Typ | LbEdge |
LbRoute |
LbTraffic |
Authz |
CdnEdge |
Beschreibung |
|---|---|---|---|---|---|---|---|
source.ip |
String | ✓ | ✓ | ✓ | ✓ | – | Client-IP-Adresse. |
source.port |
int | ✓ | ✓ | ✓ | ✓ | ✓ | Portnummer der Clientverbindung. |
source.client_region |
String | ✓ | – | ✓ | – | ✓ | Länder- oder Regionscode des Kunden mit zwei Buchstaben. |
connection.sni |
String | ✓ | – | ✓ | ✓ | ✓ | Downstream-TLS-Server Name Indication. |
connection.tls_version |
String | ✓ | – | ✓ | ✓ | ✓ | Downstream-TLS-Version (z. B. TLSv1.2, TLSv1.3). |
connection.sha256_peer_certificate_digest |
String | ✓ | – | ✓ | ✓ | – | SHA-256-Digest des Peer-Zertifikats. |
Operatoren
Service Extensions unterstützt mehrere Operatoren, mit denen Sie komplexe Übereinstimmungsbedingungen aus einfachen Ausdrucksanweisungen erstellen können.
Service Extensions unterstützt logische Operatoren wie &&, || und ! sowie Operatoren zur Stringmanipulation wie x.contains('y').
Mit Operatoren zur Stringmanipulation werden von Ihnen definierte Strings oder Teilstrings abgeglichen. Beispiel: request.host.endsWith('.example.com') wird mit true ausgewertet, wenn die HTTP-Anfrage an eine Domain gestellt wurde, die auf example.com endet.
Mit logischen Operatoren können Sie mehrere Variablen in einem Bedingungsausdruck prü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 ist.
Logische Operatoren
In der folgenden Tabelle werden die logischen Operatoren beschrieben, die von Service Extensions unterstützt werden.
| Beispielausdruck | Beschreibung |
|---|---|
x == "foo" |
Gibt true zurück, wenn x gleich dem konstanten Stringliteral-Argument ist. |
x == R"fo'o" |
Gibt true zurück, wenn x mit dem angegebenen Rohstringliteral übereinstimmt, das keine Escape-Sequenzen interpretiert. Raw-String-Literale sind nützlich, um Strings auszudrücken, die der Code zum Maskieren von Sequenzzeichen verwenden muss. |
x == y |
Gibt true zurück, wenn x gleich y ist. |
x != y |
Gibt true zurück, wenn x nicht gleich y ist. |
x && y |
Gibt true zurück, wenn sowohl x als auch y 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 am 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 prüfende Regel nicht übereinstimmt. |
k in m |
Gibt true zurück, wenn der Schlüssel k in der String-Schlüsselzuordnung m vorhanden ist. Andernfalls wird false zurückgegeben. |
Operatoren zur Stringmanipulation
In der folgenden Tabelle werden die von Service 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 Service Extensions verwendet die Option „RE2::Latin1“, wenn das RE2-Muster kompiliert wird. Dadurch werden Unicode-Funktionen deaktiviert. 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) |
Konvertiert das Stringergebnis von x in einen int-Typ. Sie können den konvertierten String für einen ganzzahligen Vergleich verwenden, indem Sie standardmäßige arithmetische Operatoren wie „größer als“ (>) und „kleiner als oder gleich“ (≤) verwenden. Dies funktioniert nur bei Werten, die ganze Zahlen 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. Beachten Sie, dass bei Headernamen für den CEL-Abgleich die Groß-/Kleinschreibung nicht berücksichtigt wird:
request.path.endsWith("/inventory") && "Hello" in request.headers
Beschränkungen
Für CEL-Ausdrücke, die für Service Extensions 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