שרת proxy של Envoy נכשל עם שגיאת HTTP 403 אסור במתאם Apigee עבור Envoy

אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X.
מידע

תיאור הבעיה

שרת ה-proxy של Envoy נכשל עם שגיאת HTTP 403 Forbidden כשמפעילים אותו דרך Apigee Adapter ל-Envoy.

הודעת שגיאה

מוצגת הודעת השגיאה הבאה:

HTTP/1.1 403 Forbidden
content-length: 19
content-type: text/plain
date: Tue, 03 Nov 2020 00:20:10 GMT
server: istio-envoy

גורמים אפשריים

שרת ה-proxy של Envoy יציג שגיאת HTTP 403 אם אחד מהתנאים הבאים מתקיים:

סיבה תיאור הוראות לפתרון בעיות שרלוונטיות ל
מוצר ה-API לא מופעל מוצר ה-API לא מופעל בסביבה הספציפית. משתמשים ב-Edge Public Cloud וב-Edge Private Cloud
חסר נתיב URI של שירות היעד במוצר ה-API נתיב ה-URI של שירות היעד חסר או לא נוסף למוצר ה-API בקטע API resources (משאבי API). משתמשים ב-Edge Public Cloud וב-Edge Private Cloud
חסר שם מארח במוצר ה-API שם המארח שצוין בבקשת ה-API של הלקוח חסר במוצר ה-API בקטע Apigee remote service targets. משתמשים ב-Edge Public Cloud וב-Edge Private Cloud
מפתח API חסר בכותרת הבקשה מפתח ה-API לא מועבר בכותרת ה-HTTP‏ x-api-key. משתמשים ב-Edge Public Cloud וב-Edge Private Cloud
מפתח API לא תקין מפתח ה-API שהועבר כחלק מהבקשה לא תקין. משתמשים ב-Edge Public Cloud וב-Edge Private Cloud
ל-Apigee Adapter ל-Envoy אין אפשרות לתקשר עם proxy ל-API של שירות מרוחק ל-Apigee Adapter ל-Envoy אין אפשרות לתקשר עם proxy ל-API של שירות מרוחק. משתמשים ב-Edge Public Cloud וב-Edge Private Cloud
שרת ה-proxy של Envoy לא מצליח לתקשר עם Apigee Adapter ל-Envoy שרת ה-proxy של Envoy לא מצליח לתקשר עם Apigee Adapter ל-Envoy משתמשים ב-Edge Public Cloud וב-Edge Private Cloud

לפני שמתחילים

  1. מוודאים שמקבלים את הודעת התגובה 403 Forbidden משרת ה-proxy של Envoy. לדוגמה:
    curl -i -H "x-api-key: $API_KEY" http://httpbin:8080/echo
    
    HTTP/1.1 403 Forbidden
    content-length: 19
    content-type: text/plain
    date: Tue, 12 Jan 2021 08:18:08 GMT
    server: envoy
    RBAC: access denied
  2. מפעילים יומני ניפוי באגים:

    מוודאים שהפעלתם יומני ניפוי באגים ב-Apigee Adapter ל-Envoy כדי לתעד פרטים נוספים על השגיאה. אם לא, מפסיקים את Apigee Adapter ל-Envoy ומפעילים אותו מחדש, ומפעילים יומני ניפוי באגים באמצעות הפקודה הבאה:

    apigee-remote-service-envoy -c config.yaml -l debug

הגורם: מוצר ה-API לא מופעל

השגיאה הזו תתרחש אם מוצר ה-API הספציפי שבו נעשה שימוש ב-Envoy Proxy לא מופעל בסביבה הספציפית שבה מופעלות הקריאות ל-API.

אבחון

כדי לאבחן את הבעיה, מבצעים את השלבים הבאים:

  1. מפעילים יומני ניפוי באגים כמו שמוסבר בשלב 2 למעלה.
  2. בודקים את היומנים של Apigee Adapter ל-Envoy ומוודאים שההודעה הבאה מוצגת בקטע Authorizing request:
    product: API_PRODUCT_NAME not found

    פלט לדוגמה של יומן ניפוי באגים:

    2021-01-12T08:18:08.124Z        DEBUG   auth/auth.go:98 Authenticate: key: 7mQIG..., claims: map[string]interface {}(nil)
    2021-01-12T08:18:08.124Z        DEBUG   auth/verify_api_key.go:106      fetchToken fetching: 7mQIG...
    2021-01-12T08:18:08.589Z        DEBUG   auth/auth.go:125        using api key from request
    2021-01-12T08:18:08.589Z        DEBUG   auth/auth.go:157        Authenticate success: &auth.Context{Context:(*server.Handle
    r)(0xc0001a0600), ClientID:"7mQIG...", AccessToken:"", Application:"ENVOY-APP-1", APIProducts:[]string{"ENVOY-PRODUCT-1"},
    Expires:time.Time{wall:0x0, ext:63746037188, loc:(*time.Location)(0x14a3be0)}, DeveloperEmail:"[---masked---]", Scopes:[]
    string{""}, APIKey:"7mQIG..."}
    2021-01-12T08:18:08.589Z        DEBUG   product/manager.go:89
    Authorizing request:
      products: [ENVOY-PRODUCT-1]
      scopes: []
      operation: GET /echo
      target: httpbin:8080
      - product: ENVOY-PRODUCT-1
        not found

    בדוגמה שלמעלה אפשר לראות שמוצר ה-API‏ ENVOY-PRODUCT-1 לא נמצא ב-Apigee Adapter ל-Envoy.

    מידע נוסף על רישום ביומן של Apigee Adapter ל-Envoy זמין במאמר בנושא רישום ביומן.

  3. אם ההודעה הזו מופיעה בזמן אישור הבקשה ל-API, סביר להניח שמוצר ה-API הספציפי לא מופעל בסביבה ספציפית שבה מתבצעות הקריאות ל-API.
  4. כדי לאמת את זה, פועלים לפי השלבים הבאים:
    1. מתחברים אל ממשק המשתמש של Edge.
    2. בדף Publish > API products (פרסום > מוצרי API), לוחצים על מוצר ה-API הספציפי שבו השתמשתם כדי להגדיר את Apigee Adapter ל-Envoy.
    3. מוודאים שהסביבה הספציפית שבה אתם שולחים את בקשות ה-API מופעלת במוצר ה-API.
    4. אם הסביבה הספציפית לא מופעלת במוצר ה-API, זו הסיבה לבעיה.
  5. אם הסביבה הספציפית כבר מופעלת, עוברים אל הגורם: חסר נתיב של מזהה URI של שירות היעד במוצר ה-API.

רזולוציה

אם הסביבה הספציפית לא מופעלת במוצר ה-API, צריך לבצע את השלבים הבאים כדי לפתור את הבעיה:

  1. מתחברים אל ממשק המשתמש של Edge.
  2. בדף Publish > API products (פרסום > מוצרי API), לוחצים על מוצר ה-API הספציפי שבו השתמשתם כדי להגדיר את Apigee Adapter ל-Envoy.
  3. בדף מוצרי API > שם המוצר, לוחצים על עריכה.
  4. מסמנים את תיבת הסימון של הסביבה הרלוונטית כדי להפעיל את הסביבה הספציפית שבה רוצים לשלוח בקשות API.
  5. לוחצים על שמירה.

הסיבה: נתיב URI של שירות היעד חסר במוצר ה-API

השגיאה הזו תתרחש אם נתיב ה-URI של היעד לא צוין במוצר ה-API הספציפי שבו נעשה שימוש ב-Envoy Proxy.

אבחון

כדי לאבחן את הבעיה, מבצעים את השלבים הבאים:

  1. מפעילים יומני ניפוי באגים כמו שמוסבר בשלב 2 למעלה.
  2. בודקים את היומנים של Apigee Adapter for Envoy ומוודאים שההודעה הבאה מוצגת עבור מוצר ה-API הספציפי שמשויך ליעד ספציפי בקטע Authorizing request:

    no path: REQUEST_URI_PATH

    פלט לדוגמה של יומן ניפוי באגים:

    2021-01-12T08:09:02.604Z        DEBUG   auth/auth.go:98 Authenticate: key: 7mQIG..., claims: map[string]interface {}(nil)
    2021-01-12T08:09:02.605Z        DEBUG   auth/auth.go:125        using api key from request
    2021-01-12T08:09:02.605Z        DEBUG   auth/auth.go:157        Authenticate success: &auth.Context{Context:(*server.Handle
    r)(0xc0001a4180), ClientID:"7mQIG...", AccessToken:"", Application:"ENVOY-APP-1", APIProducts:[]string{"ENVOY-PRODUCT-1"},
    Expires:time.Time{wall:0x0, ext:63746036507, loc:(*time.Location)(0x14a3be0)}, DeveloperEmail:"[---masked---]", Scopes:[]
    string{""}, APIKey:"7mQIG..."}
    2021-01-12T08:09:02.605Z        DEBUG   product/manager.go:89
    Authorizing request:
      products: [ENVOY-PRODUCT-1]
      scopes: []
      operation: GET /echo1
      target: httpbin:8080
      - product: ENVOY-PRODUCT-1
        no path: /echo1
    2021-01-12T08:09:02.605Z        DEBUG   server/authorization.go:228     sending ok (actual: PERMISSION_DENIED)

    הפלט לדוגמה מציג את ההודעה:

    no path: /echo1

    השגיאה הזו מציינת שהנתיב /echo1 לא נמצא במוצר ה-API ENVOY-PRODUCT-1.

  3. אם ההודעה no path: REQUEST_URI_PATH מופיעה ביומני ניפוי הבאגים של Apigee Adapter ל-Envoy, זו הסיבה לבעיה. אם לא, עוברים אל הסיבה: חסר שם מארח במוצר ה-API.

רזולוציה

אם ה-URI של הבקשה הספציפית לא נוסף למוצר ה-API עבור היעד הספציפי, צריך לבצע את השלבים הבאים כדי לפתור את הבעיה:

  1. מתחברים אל ממשק המשתמש של Edge.
  2. בדף Publish > API products (פרסום > מוצרי API), לוחצים על מוצר ה-API הספציפי שבו השתמשתם כדי להגדיר את Apigee Adapter ל-Envoy.
  3. בדף מוצרי API > שם המוצר, לוחצים על עריכה.
  4. בחלונית API resources, מוסיפים את מזהה ה-URI של בקשת ה-API למוצר ה-API.
  5. עוקבים אחרי היומנים של Apigee Adapter ל-Envoy וממתינים עד ש-Apigee Adapter ל-Envoy יאחזר את מוצר ה-API המעודכן. לאחר מכן, שולחים בקשת API נוספת כדי לאמת את התיקון.

הגורם: חסר שם מארח במוצר ה-API

השגיאה הזו תופיע אם לא מוסיפים את השילוב של שם המארח ויציאת היעד למוצר ה-API הספציפי שבו נעשה שימוש ב-Envoy Proxy.

אבחון

כדי לאבחן את הבעיה, מבצעים את השלבים הבאים:

  1. מפעילים יומני ניפוי באגים כמו שמוסבר בשלב 2 למעלה.
  2. בודקים את היומנים של Apigee Adapter for Envoy ומוודאים שההודעה הבאה מוצגת עבור מוצר ה-API הספציפי שמשויך ליעד ספציפי בקטע Authorizing request:

    no targets: HOSTNAME:PORT

    פלט לדוגמה של יומן ניפוי באגים:

    2021-01-12T08:12:06.019Z        DEBUG   auth/auth.go:98 Authenticate: key: 7mQIG..., claims: map[string]interface {}(nil)
    2021-01-12T08:12:06.019Z        DEBUG   auth/auth.go:125        using api key from request
    2021-01-12T08:12:06.019Z        DEBUG   auth/auth.go:157        Authenticate success: &auth.Context{Context:(*server.Handle
    r)(0xc0001a4180), ClientID:"7mQIG...", AccessToken:"", Application:"ENVOY-APP-1", APIProducts:[]string{"ENVOY-PRODUCT-1"},
    Expires:time.Time{wall:0x0, ext:63746036507, loc:(*time.Location)(0x14a3be0)}, DeveloperEmail:"[---masked---]", Scopes:[]
    string{""}, APIKey:"7mQIG..."}
    2021-01-12T08:12:06.019Z        DEBUG   product/manager.go:89
    Authorizing request:
      products: [ENVOY-PRODUCT-1]
      scopes: []
      operation: GET /echo
      target: httpbin1:8080
      - product: ENVOY-PRODUCT-1
        no targets: httpbin1:8080
    2021-01-12T08:12:06.020Z        DEBUG   server/authorization.go:228     sending ok (actual: PERMISSION_DENIED)

    בדוגמה שלמעלה אפשר לראות שהשילוב של שם המארח והיציאה httpbin1:8080 לא נמצא במוצר ה-API‏ ENVOY-PRODUCT-1.

  3. אם ביומנים של Apigee Adapter ל-Envoy יש רשומה עם ההודעה no targets: HOSTNAME:PORT במהלך אישור הבקשה, זו הסיבה לבעיה. אם לא, עוברים אל הסיבה: מפתח API חסר בכותרת הבקשה.

רזולוציה

אם שילוב של שם מארח ויעד לא נוסף למוצר ה-API, צריך לבצע את השלבים הבאים כדי לפתור את הבעיה:

  1. מתחברים אל ממשק המשתמש של Edge.
  2. בדף Publish > API products (פרסום > מוצרי API), לוחצים על מוצר ה-API הספציפי שבו השתמשתם כדי להגדיר את Apigee Adapter ל-Envoy.
  3. בדף מוצרי API > שם המוצר, לוחצים על עריכה.
  4. בחלונית Apigee remote service targets (יעדים של שירותים מרוחקים ב-Apigee), מוסיפים את שם המארח ואת היציאה של היעד ולוחצים על Save (שמירה).

    אם הקטע Apigee remote service targets לא מופיע בממשק המשתמש, צריך להוסיף מאפיין מותאם אישית למוצר ה-API עם השם apigee-remote-service-targets ולהוסיף את הערך HOSTNAME:PORT באמצעות Edge API. לדוגמה:

    curl https://api.enterprise.apigee.com/v1/organizations/$ORG/apiproducts/$ENVOY_PRODUCT \
        -X GET \
        -H "Authorization: Bearer $ACCESS_TOKEN" \
        -H "Content-Type:application/json" \
        -d \
    {
        "apiResources": [
            "/echo",
            "/verifyApiKey"
        ],
        "approvalType": "auto",
        "attributes": [
            {
                "name": "access",
                "value": "public"
            },
            {
                "name": "apigee-remote-service-targets",
                "value": "localhost:8080"
            }
        ],
        "createdAt": 1610435989556,
        "createdBy": "---masked---",
        "description": "",
        "displayName": "ENVOY-PRODUCT-1",
        "environments": [
            "test"
        ],
        "lastModifiedAt": 1612234134060,
        "lastModifiedBy": "---masked---",
        "name": "ENVOY-PRODUCT-1",
        "proxies": [
            "remote-service"
        ],
        "scopes": []
    }
  5. אחרי שמבצעים את המשימה שלמעלה, עוקבים אחרי היומנים של Apigee Adapter ל-Envoy ומחכים עד ש-Apigee Adapter ל-Envoy יאחזר את מוצר ה-API המעודכן. לאחר מכן, שולחים בקשת API נוספת כדי לאמת את התיקון.

הסיבה: מפתח API חסר בכותרת הבקשה

השגיאה הזו מתרחשת אם מפתח ה-API לא מועבר כחלק מכותרות הבקשה.

אבחון

כדי לאבחן את הבעיה, מבצעים את השלבים הבאים:

  1. מפעילים יומני ניפוי באגים כמו שמוסבר בשלב 2 למעלה.
  2. בודקים את היומנים של Apigee Adapter ל-Envoy ומוודאים שההודעה [missing authentication] מופיעה בקטע Authenticate error.

    פלט לדוגמה של יומן ניפוי באגים:

    2021-01-12T08:20:31.461Z        DEBUG   auth/auth.go:98 Authenticate: key: , claims: map[string]interface {}(nil)
    2021-01-12T08:20:31.461Z        DEBUG   auth/auth.go:159
    Authenticate error: &auth.Context{Context:(*server.Handler)
    (0xc0001a0600), ClientID:"", AccessToken:"", Application:"", APIProducts:[]string(nil), Expires:time.Time{wall:0x0, ext:0,
    loc:(*time.Location)(nil)}, DeveloperEmail:"", Scopes:[]string(nil), APIKey:""} [missing authentication]
    2021-01-12T08:20:31.461Z        DEBUG   server/authorization.go:205     sending denied: UNAUTHENTICATED
    2021-01-12T08:20:32.448Z        DEBUG   server/header_context.go:68     No context header x-apigee-api, using target header
    : :authority

    בפלט לדוגמה שמוצג למעלה מופיעה ההודעה [missing authentication]. ההודעה הזו מציינת שמפתח ה-API לא מועבר כחלק מכותרת הבקשה.

  3. אם ביומנים של Apigee Adapter ל-Envoy יש רשומה ביומן עם ההודעה [missing authentication]בקטע Authenticate error , זו הסיבה לבעיה. אם לא, עוברים אל הסיבה: מפתח API לא תקין.

רזולוציה

אם השגיאה [missing authentication] הוצגה ביומנים של Apigee Adapter ל-Envoy, מבצעים את השלבים הבאים כדי לפתור את הבעיה:

  1. בודקים אם הלקוח שלח את מפתח ה-API באמצעות כותרת ה-HTTP ‏x-api-key בבקשת ה-API. אם לא, מבקשים מהלקוח לשלוח את מפתח ה-API בכותרת ה-HTTP x-api-key.
  2. בודקים את קובץ ההגדרות של Apigee Adapter ל-Envoy ומוודאים ששם הכותרת של מפתח ה-API שמוגדר כברירת מחדל, x-api-key, השתנה. הנה דוגמה:
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: apigee-remote-service-envoy
      namespace: apigee
    data:
      config.yaml: |
        global:
          tls:
            ...
        tenant:
          ...
        auth:
          target_header: api-key

    בדוגמה שלמעלה, שם הכותרת של מפתח ה-API שמוגדר כברירת מחדל שונה ל-api-key. במקרה כזה, צריך להעביר את מפתח ה-API כחלק מהכותרת api-key.

  3. אם השם של כותרת מפתח ה-API שמוגדר כברירת מחדל השתנה, מבקשים מהלקוח להשתמש בשם המעודכן של כותרת מפתח ה-API, לשלוח בקשת API נוספת ולבדוק אם הבעיה נפתרה.

הסיבה: מפתח API לא תקין

השגיאה הזו מתרחשת אם מועבר מפתח API לא תקין כחלק מכותרת הבקשה.

אבחון

כדי לאבחן את הבעיה, מבצעים את השלבים הבאים:

  1. מפעילים יומני ניפוי באגים כמו שמוסבר בשלב 2 למעלה.
  2. בודקים את היומנים של Apigee Adapter ל-Envoy ומוודאים שההודעה [permission denied] מופיעה בקטע Authenticate error. ההודעה הזו מוצגת בדרך כלל אחרי שמפתח ה-API מאוחזר על ידי המתאם, כפי שמצוין בהודעה fetchToken fetching: API_KEY.

    פלט לדוגמה של יומן ניפוי באגים:

    2021-01-12T05:01:07.198Z        DEBUG   auth/auth.go:98 Authenticate: key: 123, claims: map[string]interface {}(nil)
    2021-01-12T05:01:07.198Z        DEBUG   auth/verify_api_key.go:106      fetchToken fetching: API_KEY
    2021-01-12T05:01:09.102Z        DEBUG   server/header_context.go:68     No context header x-apigee-api, using target header: :authority
    2021-01-12T05:01:09.831Z        DEBUG   auth/auth.go:159        Authenticate error: &auth.Context{Context:(*server.Handler)(0xc0001640c0), ClientID:"", AccessToken:"", Application:"", APIProducts:[]string(nil), Expires:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}, DeveloperEmail:"", Scopes:[]string(nil), APIKey:""} [permission denied]
    2021-01-12T05:01:09.832Z        DEBUG   server/authorization.go:228     sending ok (actual: PERMISSION_DENIED)

    בדוגמה הזו, מפתח ה-API שנשלח בבקשת ה-API לא היה תקין.

  3. אם ביומנים של Apigee Adapter ל-Envoy יש רשומה ביומן עם [permission denied] בקטע Authenticate error , המשמעות היא שמפתח ה-API שהועבר כחלק מהבקשה לא תקין והוא הגורם לבעיה. אם לא, עוברים אל הסיבה: Apigee Adapter ל-Envoy לא מצליח לתקשר עם proxy ל-API של השירות המרוחק.

רזולוציה

אם ההודעה [permission denied] מופיעה בקטע Authenticate error ביומנים של Apigee Adapter for Envoy, צריך לבצע את השלבים הבאים כדי לפתור את הבעיה:

  1. בודקים את מפתח ה-API שנשלח בבקשת ה-API מול הערך של מפתח ה-API שנמצא באפליקציה שמחוברת למוצר ה-API.
  2. אם מפתח ה-API שבו הלקוח משתמש לא תקין, צריך לבקש מהלקוח לשלוח את מפתח ה-API התקין.
  3. אם מפתח ה-API שבו הלקוח משתמש תקין, אבל עדיין מוצגת שגיאת HTTP 403, צריך לפנות אל התמיכה של Apigee Edge כדי לבדוק את הבעיה לעומק.

הסיבה: Apigee Adapter ל-Envoy לא מצליח לתקשר עם proxy ל-API של שירות מרוחק

השגיאה הזו תתרחש אם Apigee Adapter ל-Envoy לא יוכל לתקשר עם ה-proxy ל-API של השירות המרוחק, אם המארח של השירות המרוחק שהוגדר לא תקין.

אבחון

כדי לאבחן את הבעיה, מבצעים את השלבים הבאים:

  1. מפעילים יומני ניפוי באגים כמו שמוסבר בשלב 2 למעלה.
  2. בודקים את היומנים של Apigee Adapter ל-Envoy ומוודאים שההודעה הבאה מופיעה:

    Error retrieving products: REQUEST_URI: no such host

    פלט לדוגמה של יומן ניפוי באגים:

    2021-01-12T08:29:06.499Z        DEBUG   product/manager.go:188  retrieving products from: https://foo/remote-service/products
    2021-01-12T08:29:06.505Z        ERROR   product/manager.go:164  Error retrieving products: GET "https://foo/remote-service/pro
    ducts": dial tcp: lookup foo on 169.254.169.254:53: no such host
    github.com/apigee/apigee-remote-service-golib/product.(*manager).start.func1
            /go/pkg/mod/github.com/apigee/apigee-remote-service-golib@v1.4.0/product/manager.go:164
    github.com/apigee/apigee-remote-service-golib/util.(*Looper).Run
            /go/pkg/mod/github.com/apigee/apigee-remote-service-golib@v1.4.0/util/looper.go:87
    github.com/apigee/apigee-remote-service-golib/util.(*Looper).Start.func1
            /go/pkg/mod/github.com/apigee/apigee-remote-service-golib@v1.4.0/util/looper.go:59

    בדוגמה הזו, Apigee Adapter for Envoy לא הצליח לתקשר עם שרת ה-API הפרוקסי המרוחק כי שם המארח שצוין בכתובת ה-URL של שרת ה-API הפרוקסי המרוחק לא תקין, כפי שמצוין בשגיאה no such host .

  3. אם ביומני הרישום של Apigee Adapter ל-Envoy מופיעה רשומה עם ההודעה no such host, זו הסיבה לבעיה. אם לא, עוברים אל הסיבה: שרת ה-Proxy של Envoy לא מצליח לתקשר עם Apigee Adapter ל-Envoy.

רזולוציה

אם השגיאות שלמעלה מוצגות ביומנים של Apigee Adapter ל-Envoy, צריך לבצע את השלבים הבאים כדי לפתור את הבעיה:

  1. בודקים את קובץ ההגדרות של Apigee Adapter ל-Envoy ומוודאים שכתובת ה-URL של ה-proxy ל-API של השירות המרוחק תקינה.

    אם לא, צריך לעצור את Apigee Adapter ל-Envoy, לתקן את כתובת ה-URL של ה-proxy ל-API של השירות המרוחק בקובץ התצורה, להפעיל את Apigee Adapter ל-Envoy, לשלוח עוד בקשת API ולאמת את התיקון.

    תצורה לדוגמה:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: apigee-remote-service-envoy
      namespace: apigee
    data:
      config.yaml: |
        tenant:
          internal_api: https://istioservices.apigee.net/edgemicro
          remote_service_api: https://ORG-ENV.apigee.net/remote-service
          org_name: ORG
          env_name: ENV
          key: KEY
          secret: SECRET
          
  2. מוודאים ש-remote-service proxy ל-API נפרס בסביבת Edge הרלוונטית. אם לא, פורסים את remote-service proxy ל-API בסביבת Edge הרלוונטית ומנסים שוב.
  3. צריך לאמת את הקישוריות לרשת בין Apigee Adapter ל-Envoy לבין נקודת הקצה של proxy ל-API של remote-service. אם נמצאו בעיות בחיבור לרשת, צריך לפנות לצוות הרשת ולנסות לפתור את הבעיה.

הסיבה: שרת ה-Proxy של Envoy לא מצליח לתקשר עם Apigee Adapter ל-Envoy

אבחון

כדי לאבחן את הבעיה, מבצעים את השלבים הבאים:

  1. מוודאים שהפעלתם יומני ניפוי באגים ב-Envoy. אם לא, מפסיקים את Envoy ומפעילים אותו מחדש, ומפעילים את יומני הניפוי באגים. אחר כך שולחים בקשת API נוספת.

    פריסות עצמאיות:

    envoy -c envoy-config.yaml -l debug

    פריסות שמבוססות על Kubernetes/Istio:

    kubectl -n=istio-system get pods
    kubectl -n=istio-system exec -it INGRESS_GATEWAY_NAME bash -- curl -X POST localhost:15000/logging?connection=debug
  2. בודקים את היומנים של Apigee Adapter ל-Envoy ומוודאים שיש רשומה ביומן עם ההודעה:
    connecting to APIGEE_ENVOY_ADAPTER_HOST:5000

    ואחריו יופיעו:

    upstream connect error or disconnect/reset before headers. reset reason: ACTUAL_REASON

    פלט לדוגמה של יומן ניפוי באגים:

    [2021-03-23 05:44:41.867][1303661][debug][connection] [external/envoy/source/common/network/connection_impl.cc:769] [C4] connecting to 127.0.0.1:5000
    [2021-03-23 05:44:41.867][1303661][debug][connection] [external/envoy/source/common/network/connection_impl.cc:785] [C4] connection in progress
    [2021-03-23 05:44:41.868][1303661][debug][http2] [external/envoy/source/common/http/http2/codec_impl.cc:1173] [C4] updating connection-level initial window size to 268435456
    [2021-03-23 05:44:41.869][1303661][debug][connection] [external/envoy/source/common/network/connection_impl.cc:634] [C4] delayed connection error: 111
    [2021-03-23 05:44:41.869][1303661][debug][connection] [external/envoy/source/common/network/connection_impl.cc:203] [C4] closing socket: 0
    [2021-03-23 05:44:41.869][1303661][debug][client] [external/envoy/source/common/http/codec_client.cc:96] [C4] disconnect. resetting 0 pending requests
    [2021-03-23 05:44:41.869][1303661][debug][pool] [external/envoy/source/common/conn_pool/conn_pool_base.cc:314] [C4] client disconnected, failure reason:
    [2021-03-23 05:44:41.869][1303661][debug][router] [external/envoy/source/common/router/router.cc:1031] [C0][S6149963213555558594] upstream reset: reset reason: connection failure, transport failure reason:
    [2021-03-23 05:44:41.869][1303661][debug][http] [external/envoy/source/common/http/async_client_impl.cc:100] async http request response headers (end_stream=true):
    ':status', '200'
    'content-type', 'application/grpc'
    'grpc-status', '14'
    'grpc-message', 'upstream connect error or disconnect/reset before headers. reset reason: connection failure'

    בדוגמה שלמעלה אפשר לראות ש-Envoy לא הצליח לתקשר עם Apigee Adapter ל-Envoy בגלל הסיבה connection failure.

  3. יכולות להיות כמה סיבות לconnection failure. עכשיו נבחן כל אחד מהתרחישים.

תרחיש מספר 1: תהליך המתאם לא פועל

השגיאה הזו יכולה להתרחש אם התהליך של Apigee Adapter ל-Envoy לא פועל.

  1. מריצים את הפקודה הבאה כדי לוודא שתהליך Apigee Adapter ל-Envoy פועל: אם התהליך של Apigee Adapter ל-Envoy פועל, הוא יופיע בתוצאה של הפקודה הבאה:
    ps -ef | grep apigee-remote-service-envoy
  2. אם הוא לא פועל, זו הסיבה לבעיה.

רזולוציה

  1. אם התהליך של Apigee Adapter ל-Envoy לא פועל, צריך להפעיל אותו.
  2. שולחים בקשת API נוספת ובודקים אם הבעיה נפתרה.

תרחיש מספר 2: תהליך המתאם לא מקשיב ליציאה הספציפית

אם תהליך Apigee Adapter ל-Envoy לא מאזין ליציאה הספציפית, יכול להיות שתתרחש השגיאה הזו.

אם התהליך של Apigee Adapter ל-Envoy פועל, מוודאים שיש שקע שמקשיב ביציאה 5000: APIGEE_ENVOY_ADAPTER_HOST:5000. כדי לבדוק את זה, מריצים את הפקודה netstat:

sudo netstat -lnp | grep 5000

פלט לדוגמה:

sudo netstat -lnp | grep 5000

tcp6       0      0 :::5000                 :::*                    LISTEN      1596530/./apigee-re

אם אין שקע שמקשיב ליציאה 5000, יכול להיות שזו הסיבה לבעיה הזו.

רזולוציה

  1. עוצרים את Apigee Adapter ל-Envoy ומפעילים אותו מחדש.
  2. שולחים בקשת API נוספת ובודקים אם הבעיה נפתרה.

תרחיש מספר 3: קישוריות רשת בין Envoy לבין Apigee Adapter ל-Envoy

  1. מאמתים את החיבור לרשת בין Envoy לבין Apigee Adapter ל-Envoy:
    ssh $ENVOY_HOST
    telnet $APIGEE_ENVOY_ADAPTER_HOST 5000

    אם telnet יכול ליצור חיבור TCP ל-Apigee Adapter ל-Envoy יוצג פלט שדומה לזה שמופיע בהמשך:

    telnet $APIGEE_ENVOY_ADAPTER_HOST 5000
    
    Trying ::1...
    Connected to localhost.
    Escape character is '^]'.
  2. אם השגיאה Connection timed out מופיעה ב-telnet, סימן שיש בעיה בקישוריות לרשת בין Envoy לבין Apigee Adapter ל-Envoy.

רזולוציה

אם אתם רואים בעיות בחיבור לרשת בין Envoy לבין Apigee Adapter ל-Envoy, פנו לצוות הרישות שלכם ונסו לפתור את הבעיה.

אם הבעיה נמשכת, צריך לעבור אל איסוף מידע לצורך אבחון.

צריך לאסוף פרטי אבחון

אם הבעיה נמשכת אחרי שמבצעים את ההוראות שלמעלה, צריך לאסוף את פרטי האבחון הבאים ואז לפנות לתמיכה של Apigee Edge:

  1. מוצר Apigee שבו נעשה שימוש:

    דוגמה: Apigee Edge Cloud, ‏ Apigee OPDK, ‏ Apigee Hybrid, ‏ Apigee X

  2. ארגון וסביבה ב-Apigee
  3. קריאה של הגדרת מוצר API באמצעות Edge API:

    curl -i -u $USER:$PASSWORD $MANAGEMENT_SERVER_ENDPOINT/v1/organizations/$ORGANIZATION/apiproducts/$API_PRODUCT

    חומר עזר: ממשקי API של Apigee Edge

  4. מתחילים סשן של מעקב ב-remote-service proxy ל-API באמצעות ממשק המשתמש של Apigee Edge. משחזרים את הבעיה ומשתפים את קובץ ה-XML של סשן המעקב.

    הפניה: שימוש בכלי Trace | Apigee Edge

  5. יומנים של Apigee Adapter ל-Envoy (יומנים מלאים שקשורים לתקופת הזמן שצוינה)

    פריסות עצמאיות:

    # by default Apigee Envoy write logs to stdout and stderr, check your deployment configuration and collect logs accordingly

    פריסות שמבוססות על Kubernetes/Istio:

    kubectl -n=apigee get pods
    kubectl -n=apigee logs APIGEE_REMOTE_SERVICE_ENVOY_POD_NAME > apigee-remote-service-envoy.log
  6. בקשת API שנשלחה ל-Envoy proxy באמצעות פקודה curl (הפלט המלא של הפקודה curl):
    curl -v ENVOY_PROXY_ENDPOINT
  7. בקשת API שנשלחה לשירות היעד באמצעות פקודה curl (הפלט המלא של הפקודה curl):
    curl -v TARGET_SERVICE_ENDPOINT