מאמר עזר בנושא שפת ההתאמה ב-CEL

Common Expression Language (CEL) היא שפה לא שלמה של טיורינג בקוד פתוח, שמיישמת סמנטיקה משותפת להערכת ביטויים. Service Extensions משתמשים בקבוצת משנה של תנאי CEL כדי לקבל החלטות לגבי הערכת שרשרת על סמך נתוני מאפיינים. באופן כללי, ביטוי של תנאי מורכב מהצהרה או הצהרות שמחוברות על ידי אופרטורים לוגיים (&&, || או !).

מאפיינים

לכל בקשת חיבור, ה-proxy מחלץ מאפיינים, שהם קבוצה של מידע הקשרי. למאפיינים יש סוג קבוע (למשל, string או int), והם יכולים להיות חסרים או קיימים, בהתאם להקשר. המאפיינים נחשפים לזמן הריצה של CEL במהלך העיבוד של תנאי ההתאמה. אי אפשר לשלוח מאפיינים לשירות של תוסף.

מאפייני הבקשות

אפשר לחלץ את המאפיינים הבאים מהבקשות:

מאפיין סוג מאפיין תיאור
request.headers map{string,string} מיפוי של כותרות בקשת HTTP ממחרוזת למחרוזת. אם כותרת מכילה כמה ערכים, הערך במפה הזו הוא מחרוזת מופרדת בפסיקים של כל הערכים של הכותרת. המקשים במפה הזו הם באותיות קטנות.
request.method מחרוזת ה-method של בקשת ה-HTTP, כמו GET או POST.
request.host מחרוזת נוחות ששווה ל-request.headers['host'].
request.path מחרוזת נתיב כתובת ה-URL של ה-HTTP שהתבקש.
request.query מחרוזת

שאילתת כתובת ה-URL מסוג HTTP בפורמט name1=value&name2=value2, כפי שהיא מופיעה בשורה הראשונה של בקשת ה-HTTP.

לא מתבצע פענוח.

request.scheme מחרוזת סכמת כתובת ה-URL של HTTP, כמו HTTP או HTTPS. הערכים של המאפיין הזה הם באותיות קטנות.
request.backend_service_name מחרוזת

שירות הקצה העורפי שאליו מועברת הבקשה.

לא רלוונטי לתוספי Edge.

request.backend_service_project_number int

כשמשתמשים ב-VPC משותף, מספר הפרויקט של שירות ה-Backend שאליו מועברת הבקשה.

לא רלוונטי לתוספי Edge.

מאפייני החיבור

אפשר לחלץ את המאפיינים הבאים מחיבורים:

מאפיין סוג מאפיין תיאור
source.ip מחרוזת כתובת ה-IP של המקור של הבקשה.
source.port int יציאת החיבור של הלקוח ב-downstream.
connection.sni מחרוזת שם השרת המבוקש של חיבור ה-TLS במורד הזרם.
connection.tls_version מחרוזת גרסת ה-TLS של חיבור ה-TLS במורד הזרם. ערכים תקינים: TLSv1,‏ TLSv1.1,‏ TLSv1.2 ו- TLSv1.3.
connection.sha256_peer_certificate_digest מחרוזת גיבוב SHA256 עם קידוד הקסדצימלי של אישור העמית בחיבור TLS במורד הזרם, אם קיים.

אופרטורים

Service Extensions תומכים בכמה אופרטורים שאפשר להשתמש בהם כדי ליצור תנאי התאמה מורכבים מתוך הצהרות ביטוי פשוטות. התכונה 'תוספי שירות' תומכת באופרטורים לוגיים, כמו &&, || ו-!, ובאופרטורים לשינוי מחרוזות, כמו x.contains('y').

אופרטורים של מניפולציה של מחרוזות מתאימים למחרוזות או למחרוזות משנה שאתם מגדירים. לדוגמה, request.host.endsWith('.example.com') מחזירה את הערך true אם בקשת ה-HTTP בוצעה לדומיין שמסתיים ב-example.com.

אופרטורים לוגיים מאפשרים לכם לבדוק כמה משתנים בביטוי מותנה. לדוגמה, הביטוי request.method == 'GET' && request.host.matches('.example.com') מצרף שתי הצהרות, והוא יהיה שווה true אם שתי ההצהרות מתקיימות.true

אופרטורים לוגיים

בטבלה הבאה מפורטים האופרטורים הלוגיים שנתמכים ב-Service Extensions.

ביטוי לדוגמה תיאור
x == "foo" הפונקציה מחזירה את הערך true אם x שווה לארגומנט הקבוע מסוג מחרוזת מילולית.
x == R"fo'o" הפונקציה מחזירה את הערך true אם x שווה למחרוזת המילולית הגולמית שצוינה, שלא מפרשת רצפי escape. מחרוזות גולמיות נוחות לביטוי מחרוזות שהקוד צריך להשתמש בהן כדי לבצע בריחה מתווים של רצף.
x == y הפונקציה מחזירה את הערך true אם x שווה ל-y.
x != y הפונקציה מחזירה את הערך true אם x לא שווה ל-y.
x && y הפונקציה מחזירה את הערך true אם גם x וגם y הם true.
x || y הפונקציה מחזירה true אם x,‏ y או שניהם הם true.
!x הפונקציה מחזירה true אם הערך הבוליאני x הוא false, או מחזירה false אם הערך הבוליאני x הוא true.
m['k'] אם המפתח k קיים, הפונקציה מחזירה את הערך במפתח k במפה של מחרוזת למחרוזת m. אם המפתח k לא קיים, הפונקציה מחזירה שגיאה שגורמת לכך שהכלל שנבדק לא תואם.
k in m הפונקציה מחזירה את הערך true אם המפתח k קיים במפה m עם מפתחות מסוג מחרוזת. אחרת, הפונקציה מחזירה את הערך false.

אופרטורים של מניפולציה של מחרוזות

בטבלה הבאה מפורטים האופרטורים לטיפול במחרוזות שנתמכים ב-Service Extensions.

ביטוי תיאור
x.contains(y) הפונקציה מחזירה את הערך true אם המחרוזת x מכילה את מחרוזת המשנה y.
x.startsWith(y) הפונקציה מחזירה את הערך true אם המחרוזת x מתחילה במחרוזת המשנה y.
x.endsWith(y) הפונקציה מחזירה את הערך true אם המחרוזת x מסתיימת במחרוזת המשנה y.
x.matches(y)

הפונקציה מחזירה את הערך true אם המחרוזת x תואמת לדפוס RE2y שצוין.

התוסף Service Extensions משתמש באפשרות RE2::Latin1 כשהוא קומפל את תבנית RE2, מה שמשבית את תכונות ה-Unicode.

תוספים ל-Edge מאפשרים להשתמש רק בביטוי רגולרי אחד לכל ביטוי CEL.

x.lower() הפונקציה מחזירה את הערך באותיות קטנות של המחרוזת x.
x.upper() הפונקציה מחזירה את הערך באותיות רישיות של המחרוזת x.
int(x) הפונקציה ממירה את תוצאת המחרוזת של x לסוג int. אפשר להשתמש במחרוזת שהומרה להשוואה בין מספרים שלמים באמצעות אופרטורים אריתמטיים רגילים, כמו גדול מ- (>) וקטן מ- או שווה ל- (). הפעולה הזו אפשרית רק עבור ערכים שיכולים להיות מספרים שלמים.

ביטויים לדוגמה

התאמה של כל הבקשות לאירוח example.com עם שירות קצה עורפי bs1 ב-123 כיעד הסופי:

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

מגבלות

ההגבלות הבאות חלות על ביטויי CEL כשמציינים אותם עבור Service Extensions:

  • מספר הביטויים המקסימלי לכל תוסף: 1 לתוספי Edge ו-5 לתוספים אחרים
  • מספר התווים המקסימלי לכל ביטוי רגולרי: 100
  • מספר התווים המקסימלי לכל ביטוי CEL: 500