
2026/02/18 23:05
Show HN:Example が作成した CEL (「Show on Hacker News」の略称として「Show HN」と表記し、Example によって作られた CEL を紹介するタイトルです。)
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
要約
Common Expression Language(CEL)は、開発者が単純な値、Protobufメッセージ、またはJSONオブジェクトに対して式を高速・移植性・安全に評価できるようにするものです。サンプルユーザーJSONオブジェクトを用いてCELの構文を示します。
- フィールド:
、name
(roles
、admin
、editor
)、viewer
、age
、email
(タイムスタンプ)、created
(タイムスタンプ)email_verified - 基本比較:
user.age >= 18 - 文字列関数:
user.email.endsWith("@example.com") - メンバーシップチェック:
"admin" in user.roles - 条件付き存在テスト:
user.roles.exists(r, r.startsWith("ad")) - リストフィルタリング:
→user.roles.filter(r, r != "viewer")["admin", "editor"] - 時間比較:
user.email_verified - user.created < duration("24h") - 論理 AND:
user.age >= 18 && "admin" in user.roles - 条件演算子:
user.age >= 18 ? "adult" : "minor" - マップ変換:
- ロールと成人フラグのマップを作成
- 各ロールを昇格フラグ付きオブジェクトにマッピング
- 書き込みアクセスロールでフィルタリングし、結合
CELはすでにKubernetesのアドミッションコントロール、Google Cloud IAM条件、Firebaseセキュリティルール、Envoy Proxyルーティング、およびProtovalidate制約強制に利用されています。CELを採用することで、開発者とオペレーターは複数のクラウドサービス間でポリシーロジックを統一し、可読性を向上させ実行時オーバーヘッドを削減し、異なるプラットフォームでも一貫した動作を保証できます。
本文
CEL(Common Expression Language) は、シンプルな値、Protobuf メッセージ、または JSON オブジェクトに対して式を評価します。
CEL は高速で移植性があり、安全です。Kubernetes の承認制御、Google Cloud IAM の条件付け、Firebase のセキュリティールール、Envoy Proxy のルーティング、Protovalidate の制約ルールなどで利用されています。
CEL を一緒に探ってみましょう。まずは簡単な User メッセージから:
{ "name": "Alice", "roles": ["admin", "editor", "viewer"], "age": 30, "email": "alice@example.com", "created": timestamp("2025-12-14T00:00:00Z"), "email_verified":timestamp("2025-12-14T18:30:00Z") }
文字列と数値
基本的な比較: ユーザーは 18 歳以上ですか?
user.age >= 18 // 結果:true(bool)
ユーザーのメールドメインを文字列関数で確認します。
user.email.endsWith("@example.com") // 結果:true(bool)
コレクション
ユーザーは特定のロールを持っていますか?
in はリスト内のメンバーシップをチェックします。
"admin" in user.roles // 結果:true(bool)
一致が完全でなくてもどうでしょうか?
exists() は要素のいずれかが条件を満たすかをテストします。
user.roles.exists(r, r.startsWith("ad")) // 結果:true(bool)
ユーザーは 3 つのロールを持っています—昇格したものだけに絞りたい場合は?
user.roles.filter(r, r != "viewer") // 結果:["admin", "editor"](list)
タイムスタンプと期間
ユーザーはサインアップ後 24 時間以内にメールを確認しましたか?
CEL は時間をネイティブに扱います。2 つのタイムスタンプを減算して期間を取得し、比較します。
user.email_verified - user.created < duration("24h") // 結果:true(bool)
論理演算子
論理演算子はチェックを単一の式に結合します。
user.age >= 18 && "admin" in user.roles // 結果:true(bool)
条件演算子を使えば分岐ロジックが可能です。
user.age >= 18 ? "adult" : "minor" // 結果:"adult"(string)
データの変換
CEL の式は任意の型を返します。
ユーザーから PII を除去したマップを構築しましょう。
{"roles": user.roles, "is_adult": user.age >= 18} // 結果:{"roles": ["admin", "editor", "viewer"], "is_adult": true}(map)
各ロールに昇格しているかどうかを付与します。
user.roles.map(r, {"role": r, "elevated": r != "viewer"}) // 結果: [{"role":"admin","elevated":true},{"role":"editor","elevated":true},{"role":"viewer","elevated":false}](list)
map() はフィルタリングも行えます—昇格したロールを選択し、書き込み権限を一度に付与します。
user.roles.map(r, r != "viewer", r + ":write") // 結果:["admin:write","editor:write"](list)