一般運算語言 (CEL) 是一種一般用途的運算式語言,設計出快速、可攜性且安全執行。您可以單獨使用 CEL,或將其嵌入大型產品中。從轉送遠端程序呼叫 (RPC) 到定義安全性政策,CEL 非常適用於各種應用程式。CEL 可擴充、獨立於平台,並針對編譯一次/評估的工作流程進行最佳化。
CEL 經過特別設計,能安全地執行使用者程式碼。雖然難以在使用者的 Python 程式碼中直接呼叫 eval()
,但您可以安全地執行使用者的 CEL 程式碼。而且,CEL 能防止會導致效能降低的行為,因此在奈秒或微秒以內安全地進行評估。CEL 的速度和安全性讓著重效能的應用程式非常適合使用。
CEL 會評估與單行函式或 lambda 運算式類似的運算式。CEL 常用於布林值決策,但您也可以將其用於建構更複雜的物件,例如 JSON 或通訊協定緩衝區訊息。
為什麼要選擇 CEL?
許多服務和應用程式都會評估宣告式設定。舉例來說,角色型存取權控管 (RBAC) 是一種宣告式設定,可根據特定使用者角色和一組使用者產生存取權決策。雖然宣告式設定已適用於大多數情況,但有時您需要更多表達能力。這時 CEL 就能派上用場。
舉例來說,如要利用 CEL 擴充宣告設定,請考慮使用 Google Cloud Identity and Access Management (IAM) 的功能。雖然 RBAC 是常見案例,但 IAM 提供 CEL 運算式,可讓使用者根據要求的 proto 訊息屬性或存取的資源,限制角色型授予範圍。如果透過資料模型來描述這類條件,將會產生複雜且難以處理的 API 介面。相反地,使用具有屬性式存取權控管 (ABAC) 的 CEL 是 RBAC 具有表達能力且功能強大的擴充功能。
CEL 的核心概念
在 CEL 中,運算式會針對環境編譯。編譯步驟會產生通訊協定緩衝區格式的抽象語法樹狀結構 (AST)。系統會儲存已編譯的運算式,供日後使用,以盡可能加快評估速度。單一編譯的運算式可以使用許多不同的輸入內容進行評估。
以下進一步說明相關概念。
運算式
運算式由使用者撰寫。運算式與單行函式主體或 lambda 運算式類似。宣告輸入的函式簽章是寫入 CEL 運算式以外的位置,且會自動匯入 CEL 可用的函式程式庫。
舉例來說,下列 CEL 運算式會使用要求物件,而要求包含 claims
權杖。運算式會傳回一個布林值,指出 claims
權杖是否仍然有效。
用來驗證憑證附加資訊權杖的 CEL 運算式範例
// Check whether a JSON Web Token has expired by inspecting the 'exp' claim.
//
// Args:
// claims - authentication claims.
// now - timestamp indicating the current system time.
// Returns: true if the token has expired.
//
timestamp(claims["exp"]) < now
使用者定義 CEL 運算式時,服務和應用程式則會定義其執行環境。
環境
環境是由服務定義。嵌入 CEL 的服務和應用程式會宣告運算式環境。環境是可用於 CEL 運算式中的變數和函式集合。
舉例來說,下列 textproto
程式碼會使用 CEL 服務中的 CompileRequest
訊息,宣告包含 request
和 now
變數的環境。
CEL 環境宣告範例
# Format: $SOURCE_PATH/service.proto#CompileRequest
declarations {
name: "request"
ident {
type { message_type: "google.rpc.context.AttributeContext.Request" }
}
}
declarations {
name: "now"
ident {
type { well_known: "TIMESTAMP" }
}
}
CEL 類型檢查工具會使用 proto 形式的宣告,確保運算式中的所有 ID 和函式參照都正確宣告及使用。
運算式處理階段
CEL 運算式會分成三個階段進行處理:
- 剖析
- 檢查
- 評估
CEL 最常見的使用模式是在設定時間剖析及檢查運算式、儲存 AST,然後在執行階段重複擷取及評估 AST。
CEL 處理階段插圖
系統會運用 ANTLR 編譯器與剖析器文法,將 CEL 從人類可讀的運算式剖析為 AST。剖析階段會發出 proto 型 AST,AST 中的每個 Expr
節點都包含一個整數 ID,用於在剖析及檢查時建立中繼資料。在剖析期間產生的 syntax.proto
檔案代表運算式字串形式的輸入內容的抽象表示法。
剖析運算式後,該運算式就會依據環境進行類型檢查,確保運算式中的所有變數和函式 ID 都已宣告且正確使用。類型檢查工具會產生包含類型、變數和函式解析中繼資料的 checked.proto
檔案,可大幅改善評估效率。
最後,剖析及檢查運算式後,會評估儲存的 AST。
CEL 評估人員需要以下三個項目:
- 任何自訂擴充功能的函式繫結
- 變數繫結
- 評估標準
函式和變數繫結應與用來編譯 AST 的內容相符。上述任何輸入都可以在多個評估中重複使用,例如在多組變數繫結組合中評估 AST、針對許多 AST 使用的相同變數,或整個程序生命週期中使用的函式繫結 (常見案例)。