הגדרת תגובות שגיאה מותאמות אישית

במסמך הזה מפורטות דוגמאות להגדרות של תגובות שגיאה בהתאמה אישית. לפני שמגדירים תגובה מותאמת אישית לשגיאה, כדאי לקרוא את סקירת התגובה המותאמת אישית לשגיאה.

הגדרות לדוגמה שמתוארות בדף הזה מגדירות מדיניות מותאמת אישית של תגובות לשגיאות בשלוש רמות של משאב מפת URL – רמת מאזן העומסים, רמת דומיין כתובת ה-URL ורמת נתיב כתובת ה-URL.

הגדרות לדוגמה מבוססות על מושגים ועל הגדרות שמתוארים במסמכים הבאים:

דוגמה 1: הגדרת דף שגיאה לכל השגיאות 4xx שמשותפות לכל המארחים

בדוגמה הזו אנחנו מניחים שהגדרתם מאזן עומסים כמו שמתואר במאמר הגדרת מאזן עומסים גלובלי חיצוני של אפליקציות (ALB) עם קצה עורפי של קבוצת מכונות וירטואליות.

בדוגמה הזו, בקשות למאזן העומסים מנותבות לשירות לקצה העורפי שנקרא web-backend-service. אם הבקשה נתקלת בתשובה 4xx, מדיניות התגובה לשגיאה מותאמת אישית מוגדרת כך שהבקשה תישלח לשירות השגיאות, ואובייקט שגיאה (not-found.html) יוחזר ללקוח.

כדי ליצור מדיניות מותאמת אישית של תגובות לשגיאות, מבצעים את השלבים הבאים:

  1. מעלים את דף השגיאה ב-HTML (not-found.html) לקטגוריה של Cloud Storage.

    gcloud storage cp Desktop/not-found.html gs://GCS_BUCKET_NAME/
    
  2. מייצאים את מפת ה-URL ‏ (web-map-http) לקובץ בשם web-map-http.yaml.

    gcloud compute url-maps export web-map-http --destination web-map-http.yaml
    

    לפני שמוסיפים את מדיניות תגובת השגיאה בהתאמה אישית, מפת URL (web-map-http) כוללת הגדרה שדומה להגדרה הבאה.

    creationTimestamp: '2020-01-14T19:12:44.680-08:00'
    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/web-backend-service
    fingerprint: d0eJJpCBpHg=
    kind: compute#urlMap
    name: web-map-http
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http
    
  3. עורכים את web-map-http.yaml כדי להוסיף מדיניות מותאמת אישית של תגובה לשגיאה, כמו שמודגש בהגדרת ה-YAML הבאה, בקטע defaultCustomErrorResponsePolicy. בדוגמה הזו, מדיניות תגובה לשגיאה מוגדרת ברמת מאזן העומסים (urlMaps.defaultCustomErrorResponsePolicy).

    creationTimestamp: '2020-01-14T19:12:44.680-08:00'
    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/web-backend-service
    defaultCustomErrorResponsePolicy:
      errorResponseRules:
        - matchResponseCodes:
          - 4xx
          path: '/not-found.html'
      errorService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/CUSTOM_ERRORS_BUCKET
    fingerprint: d0eJJpCBpHg=
    kind: compute#urlMap
    name: web-map-http
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http
    

    מומלץ לאחסן את כל אובייקטי השגיאה בקטגוריה של Cloud Storage, ושהקטגוריה הזו תהיה קטגוריית קצה עורפי שמצורפת למאזן העומסים. קטגוריות של Cloud Storage מספקות דרך פשוטה לאחסון אובייקטים של שגיאות ולהחזרתם ללקוחות באמצעות מאזן העומסים. עם זאת, אפשר גם להציג דפי שגיאה ונכסים קשורים בלי להשתמש בדלי של קצה עורפי. לדוגמה, אפשר להשתמש בשירות קצה עורפי שמפנה לקצה עורפי של קבוצת מכונות וירטואליות, שבו מוגדר שרת Apache להצגת דף תגובה מותאם אישית לשגיאה.

  4. מעדכנים את מפת ה-URL על ידי ייבוא ההגדרה העדכנית מ-web-map-http.yaml.

    gcloud compute url-maps import web-map-http --source web-map-http.yaml
    
  5. אחרי שמעדכנים את מפת ה-URL, צריך לחכות זמן מה לפני שמתחילים לשלוח תנועה לכתובת ה-IP של מאזן העומסים.

    שליחת בקשה לדף שלא קיים.

    curl -I http://IP_ADDRESS/a-page-that-does-not-exist
    

    התוכן של השגיאה מ-not-found.html מוצג ומוחזר קוד סטטוס HTTP 404.

דוגמה 2: הגדרת דף שגיאה לקוד שגיאה ספציפי עבור מארח ספציפי

הדוגמה הזו מבוססת על הדוגמה הקודמת – הגדרת דף שגיאה לכל השגיאות 4xx שמשותפות לכל המארחים. בדוגמה הזו מניחים שמאזן עומסים כבר מוגדר כך שבקשות למארח video.example.com מנותבות לשירות לקצה העורפי שנקרא video-backend-service. אם בקשה נכשלת באימות על ידי שירות הקצה העורפי, השירות מחזיר תשובת 401 (Unauthorized). מדיניות התגובה לשגיאה מותאמת אישית מוגדרת כך שתשלח את הבקשה לשירות השגיאות, ואובייקט שגיאה (video-obtain-authorization.html) יוחזר ללקוח.

ברוב המקרים, תוכן השגיאה יכלול קישורים לנכסים – לדוגמה, תמונה של לוגו. הלקוח שולח בקשות לנכסים שמפנים אליהם בדף השגיאה, ובקשות נוספות נשלחות למאזן העומסים כדי לאחזר אותם. לאחר מכן, מאזן העומסים מגיב לבקשה ומחזיר את הנכסים המקושרים. כדי לעשות את זה, מאחסנים את הנכסים האלה באותה קטגוריית קצה עורפי שצוינה ב-defaultCustomErrorResponsePolicy ומוסיפים כלל לניתוב בקשות מכתובות URL של נכסים (לדוגמה, /assets/logo.svg) לקטגוריית הקצה העורפי. התגובה של מאזן העומסים לבקשה של נכסים מקושרים היא לא תגובת שגיאה, אלא תגובה רגילה, כמו שמוצג בהגדרה הבאה.

pathMatchers:
...
  pathRules:
  - service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/CUSTOM_ERRORS_BUCKET
    paths:
    - /assets

בנוסף, המדיניות מאפשרת להגדיר מה צריך להיות קוד התגובה הסופי לבקשה. בדוגמה הזו, קוד התגובה השתנה מ-401 ל-200 על ידי ציון הערך 200 ל-overrideResponseCode. בכל שאר השגיאות מסוג 4xx, תוכן השגיאה ב-not-found.html מוחזר ללקוח, וקוד תגובת ה-HTTP המקורי משירות הקצה העורפי נשמר.

כפי שמוצג בטבלה הבאה, בדוגמה הזו מוגדרות שתי מדיניות תגובות לשגיאות בהתאמה אישית. המדיניות הזו נוצרת ברמת מאזן העומסים וברמת הדומיין של כתובת ה-URL.

רמת המדיניות שדה API התאמה של קוד תגובת HTTP שירות שגיאות אובייקט השגיאה שמוחזר
הדומיין של כתובת ה-URL pathMatchers[].defaultCustomErrorResponsePolicy 401 CUSTOM_ERRORS_BUCKET video-obtain-authorization.html
מאזן עומסים urlMaps.defaultCustomErrorResponsePolicy All 4xx CUSTOM_ERRORS_BUCKET not-found.html

כדי ליצור מדיניות מותאמת אישית לתגובת שגיאה עבור קוד השגיאה 401 של המארח video.example.com, פועלים לפי השלבים הבאים:

  1. מעלים את דף השגיאה ב-HTML ‏ (video-obtain-authorization.html) ואת הנכסים הקשורים (logo.svg) לקטגוריה של Cloud Storage.

    gcloud storage cp Desktop/video-obtain-authorization.html gs://GCS_BUCKET_NAME/
    gcloud storage cp Desktop/logo.svg gs://GCS_BUCKET_NAME/assets/
    
  2. מייצאים את מפת ה-URL ‏ (web-map-http) לקובץ בשם web-map-http.yaml.

    gcloud compute url-maps export web-map-http --destination web-map-http.yaml
    
  3. עורכים את web-map-http.yaml כדי להוסיף מדיניות מותאמת אישית של תגובה לשגיאה, כמו שמודגש בהגדרת ה-YAML הבאה, בקטע defaultCustomErrorResponsePolicy. בדוגמה הזו, מדיניות מותאמת אישית של תגובות לשגיאות מוגדרת ברמת מאזן העומסים (urlMaps.defaultCustomErrorResponsePolicy) וברמת דומיין כתובת ה-URL (pathMatchers[].defaultCustomErrorResponsePolicy).

    מכיוון ששירות השגיאות לא מוגדר ברמת הדומיין של כתובת ה-URL, שירות השגיאות ברמת הדומיין של כתובת ה-URL מוגדר כברירת מחדל לשירות השגיאות שמוגדר ברמה גבוהה יותר, כלומר ברמת איזון העומסים.

    creationTimestamp: '2020-01-14T19:12:44.680-08:00'
    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/web-backend-service
    defaultCustomErrorResponsePolicy:
      errorResponseRules:
        - matchResponseCodes:
          - 4xx
          path: '/not-found.html'
      errorService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/CUSTOM_ERRORS_BUCKET
    fingerprint: d0eJJpCBpHg=
    hostRules:
    - hosts:
      - video.example.com
      pathMatcher: path-matcher-1
    kind: compute#urlMap
    name: web-map-http
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http
    pathMatchers:
    - defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/video-backend-service
      name: path-matcher-1
      defaultCustomErrorResponsePolicy:
        errorResponseRules:
          - matchResponseCodes:
            - 401
            path: "/video-obtain-authorization.html
            overrideResponseCode: 200
        // The `errorService` in `pathMatchers[].defaultCustomErrorResponsePolicy` references the
        // error service configured in `urlMaps.defaultCustomErrorResponsePolicy`.
    
      // A URL map path rule to route requests from asset URLs (for example, "/assets/logo.svg") to the backend bucket.
      pathRules:
      - service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/CUSTOM_ERRORS_BUCKET
        paths:
        - /assets
    
  4. מעדכנים את מפת ה-URL על ידי ייבוא ההגדרה העדכנית מ-web-map-http.yaml.

    gcloud compute url-maps import web-map-http --source web-map-http.yaml
    
  5. אחרי שמעדכנים את מפת ה-URL, צריך לחכות זמן מה לפני שמתחילים לשלוח תנועה לכתובת ה-IP של מאזן העומסים.

    שולחים בקשה למארח לקבלת כתובת URL שנדרשת לה הרשאה.

    curl -I http://video.example.com/a-page-that-needs-authorization
    

    התוכן של השגיאה מ-video-obtain-authorization.html מוצג, ומוחזר קוד הסטטוס 200 של HTTP.

דוגמה 3: הגדרת מדיניות מפורטת של תגובות שגיאה מותאמות אישית לדומיינים, לנתיבים ולקודי תגובה שונים

בדוגמה הזו אפשר לראות איך להתאים אישית תגובות שגיאה ספציפיות עבור דומיינים שונים של כתובות URL, נתיבי כתובות URL וקודי תגובות שגיאת HTTP.

ההסבר על הגדרת תגובת שגיאה מותאמת אישית בדוגמה הזו מבוסס על ההנחות הבאות:

כפי שמוצג בטבלה הבאה, בדוגמה הזו מוגדרות ארבע מדיניות תגובה לשגיאות בהתאמה אישית. כללי המדיניות האלה נוצרים בשלוש רמות בסדר העדיפות הבא:

  1. נתיב כתובת ה-URL‏ (pathMatchers[].pathRules[].customErrorResponsePolicy)
  2. הדומיין של כתובת ה-URL (pathMatchers[].defaultCustomErrorResponsePolicy)
  3. מאזן עומסים (urlMaps.defaultCustomErrorResponsePolicy)
רמת המדיניות בקש כתובת אתר התאמה של קוד תגובת HTTP שירות שגיאות אובייקט השגיאה שמוחזר
נתיב כתובת ה-URL example.net/video/hd/* 404 BUCKET-2 not-found-hd-videos-404.html
נתיב כתובת ה-URL example.net/video/sd/* 404 BUCKET-2 not-found-sd-videos-404.html
הדומיין של כתובת ה-URL example.net/* All 4xx BUCKET-1 example-net-4xx.html
מאזן עומסים Any כל השגיאות מסוג 4xx או 5xx BUCKET-1 error-page-generic.html

מדיניות תגובת השגיאה המותאמת אישית ברמה של מאזן העומסים מוחלת רק אם המדיניות תואמת לתנאי השגיאה ולא הוגדרה מדיניות תואמת לקוד השגיאה ברמות הנמוכות יותר, כלומר בדומיין של כתובת ה-URL או בנתיב ה-URL. באופן דומה, מדיניות תגובת השגיאה המותאמת אישית ברמה של דומיין כתובת ה-URL מוחלת רק אם המדיניות תואמת לתנאי השגיאה ולא הוגדרה מדיניות תואמת לקוד השגיאה ברמה הנמוכה יותר, כלומר נתיב כתובת ה-URL. בדוגמה הזו, אם בקשה לכתובת ה-URL www.example.net/video/hd נתקלת בתגובה 404, הקובץ not-found-hd-videos-404.html מוחזר. עם זאת, אם מתקבלת תגובה 404 לבקשה לכתובת ה-URL www.example.net/video/, הקובץ example-net-4xx.html מוחזר.

כדי ליצור מדיניות מותאמת אישית לתגובות שגיאה בשלוש רמות של מפת URL, פועלים לפי השלבים הבאים:

  1. מעלים את אובייקטי השגיאה לקטגוריות של Cloud Storage.

    gcloud storage cp Desktop/error-page-generic.html gs://GCS_BUCKET_1_NAME/
    gcloud storage cp Desktop/example-net-4xx.html gs://GCS_BUCKET_1_NAME/
    gcloud storage cp Desktop/not-found-sd-videos-404.html gs://GCS_BUCKET_2_NAME/
    gcloud storage cp Desktop/not-found-hd-videos-404.html gs://GCS_BUCKET_2_NAME/
    
  2. מייצאים את מפת ה-URL (video-org-url-map) לקובץ בשם video-org-url-map.yaml.

    gcloud compute url-maps export video-org-url-map --destination video-org-url-map.yaml
    

    לפני שמוסיפים את מדיניות תגובת השגיאה בהתאמה אישית, מפת URL (video-org-url-map) כוללת הגדרה שדומה להגדרה הבאה.

    creationTimestamp: '2021-03-05T13:34:15.833-08:00'
    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/org-site
    fingerprint: mfyJIT7Zurs=
    hostRules:
    - hosts:
      - '*'
      pathMatcher: video-matcher
    - hosts:
      - example.net
      pathMatcher: video-matcher
    id: '8886405179645041976'
    kind: compute#urlMap
    name: video-org-url-map
    pathMatchers:
    - defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/video-site
      name: video-matcher
      pathRules:
      - paths:
        - /video/hd
        - /video/hd/*
        service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/video-hd
      - paths:
        - /video/sd
        - /video/sd/*
        service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/video-sd
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/video-org-url-map
    
  3. עורכים את video-org-url-map.yaml כדי להוסיף מדיניות מותאמת אישית של תגובות לשגיאות, כמו שמודגש בהגדרת ה-YAML הבאה, בקטע defaultCustomErrorResponsePolicy.

    מכיוון ששירות השגיאות לא מוגדר ברמת הדומיין של כתובת ה-URL, שירות השגיאות ברמת הדומיין של כתובת ה-URL מוגדר כברירת מחדל לשירות השגיאות שמוגדר ברמה גבוהה יותר, כלומר ברמת איזון העומסים.

    creationTimestamp: '2021-03-05T13:34:15.833-08:00'
    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/org-site
    fingerprint: mfyJIT7Zurs=
    hostRules:
    - hosts:
      - '*'
      pathMatcher: video-matcher
    - hosts:
      - example.net
      pathMatcher: video-matcher
    id: '8886405179645041976'
    kind: compute#urlMap
    name: video-org-url-map
    defaultCustomErrorResponsePolicy:
      errorResponseRules:
        - matchResponseCodes:
          - 4xx
          - 5xx
          path: '/error-page-generic.html'
      errorService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/BUCKET-1
    pathMatchers:
    - defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/video-site
      name: video-matcher
      defaultCustomErrorResponsePolicy:
          errorResponseRules:
            - matchResponseCodes:
              - 4xx
              path: '/example-net-4xx.html'
          // The `errorService` in `pathMatchers[].defaultCustomErrorResponsePolicy` references the
          // error service configured in `urlMaps.defaultCustomErrorResponsePolicy`.
      pathRules:
      - paths:
        - /video/hd
        - /video/hd/*
        service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/video-hd
        customErrorResponsePolicy:
              errorResponseRules:
                - matchResponseCodes:
                  - 404
                  path: '/not-found-hd-videos-404.html'
              errorService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/BUCKET-2
      - paths:
        - /video/sd
        - /video/sd/*
        service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/video-sd
        customErrorResponsePolicy:
              errorResponseRules:
                - matchResponseCodes:
                  - 404
                  path: '/not-found-sd-videos-404.html'
              errorService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/BUCKET-2
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/video-org-url-map
    
  4. מעדכנים את מפת ה-URL על ידי ייבוא ההגדרה העדכנית מ-video-org-url-map.yaml.

    gcloud compute url-maps import video-org-url-map --source video-org-url-map.yaml
    
  5. אחרי שמעדכנים את מפת ה-URL, צריך לחכות זמן מה לפני שמתחילים לשלוח תנועה לכתובת ה-IP של מאזן העומסים.

    שליחת בקשה לדף שלא קיים.

    curl -I http://example.net/a-page-that-does-not-exist
    

    התוכן של השגיאה מ-example-net-4xx.html מוצג.

    באופן דומה, כדאי לבדוק כתובות URL אחרות עם דומיינים ונתיבים שונים.