CEL 比對器語言參考資料

一般運算語言 (CEL) 是一種開放原始碼的非圖靈完備語言,可實作運算式評估的通用語意。Service Extensions 會使用 CEL 條件的子集,根據屬性資料做出鏈結評估決策。一般來說,條件運算式是由一或多個陳述式組成,並以邏輯運算子 (&&、|| 或 !) 連結。

屬性

對於任何連線要求,Proxy 都會擷取屬性,也就是一組情境資訊。屬性具有固定類型 (例如 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 網址路徑。
request.query 字串 ✓ ✓ ✓ ✓ ✓ 網址查詢字串 (name1=value&name2=value2)。
request.scheme 字串 ✓ ✓ ✓ ✓ ✓ 網址配置 (http 或 https)。
request.backend_service_name 字串 — ✓ ✓ — — 後端服務名稱。
request.backend_service_project_number 整數 — ✓ ✓ — — 後端服務專案編號。

連線屬性

您可以從連線中擷取下列屬性:

屬性 類型 LbEdge LbRoute LbTraffic Authz CdnEdge 說明
source.ip 字串 ✓ ✓ ✓ ✓ — 用戶端 IP 位址。
source.port 整數 ✓ ✓ ✓ ✓ ✓ 用戶端連線通訊埠編號。
source.client_region 字串 ✓ — ✓ — ✓ 兩個字母的用戶端國家/地區代碼。
connection.sni 字串 ✓ — ✓ ✓ ✓ 下游 TLS 伺服器名稱指示。
connection.tls_version 字串 ✓ — ✓ ✓ ✓ 下游 TLS 版本 (例如 TLSv1.2、TLSv1.3)。
connection.sha256_peer_certificate_digest 字串 ✓ — ✓ ✓ — 對等互連憑證 SHA-256 摘要。

運算子

Service Extensions 支援多種運算子,可讓您透過簡單的運算式陳述式,建構複雜的比對條件。Service Extensions 支援邏輯運算子 (例如 &&、|| 和 !) 和字串操作運算子 (例如 x.contains('y'))。

字串操作運算子會比對您定義的字串或子字串。舉例來說,如果 HTTP 要求傳送至結尾為 example.com 的網域,request.host.endsWith('.example.com') 會評估為 true。

邏輯運算子可讓您驗證條件運算式中的多個變數。舉例來說,request.method == 'GET' && request.host.matches('.example.com') 會連結兩個陳述式,且兩個陳述式都必須為 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)

如果字串 x 符合指定的 RE2 模式 y,則傳回 true。

Service Extensions 在編譯 RE2 模式時會使用 RE2::Latin1 選項,這會停用 Unicode 功能。

Edge 擴充功能只允許每個 CEL 運算式使用一個規則運算式。

int(x) 將 x 的字串結果轉換為 int 類型。您可以使用標準算術運算子 (例如大於 (>) 和小於或等於 (≤)),將轉換後的字串用於整數比較。這僅適用於可為整數的值。

運算式範例

比對並找出傳送至主機 example.com,而且以 123 的後端服務 bs1 為最終目的地的所有要求:

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

比對並找出路徑為 */inventory,且 HTTP 標頭為 Hello 的所有要求。請注意,CEL 比對不區分標頭名稱的大小寫:

request.path.endsWith("/inventory") && "Hello" in request.headers

限制

為 Service Extensions 指定 CEL 運算式時,須遵守下列限制:

  • 每個擴充功能的運算式數量上限:邊緣擴充功能為 1 個,其他擴充功能為 5 個
  • 每個規則運算式的字元數上限:100
  • 每個 CEL 運算式的字元數上限:500