שרת 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 הציבוריים והפרטיים
חסר נתיב URI של שירות יעד במוצר API נתיב ה-URI של שירות היעד חסר או לא נוסף למוצר ה-API במשאבי ה-API. משתמשי Edge הציבוריים והפרטיים
חסר שם מארח במוצר ה-API שם המארח שצוין בבקשת ה-API של הלקוח חסר במוצר ה-API בקטע של יעדי השירות המרוחקים של Apigee. משתמשי Edge הציבוריים והפרטיים
חסר מפתח API בכותרת הבקשה מפתח ה-API לא מועבר בכותרת ה-HTTP x-api-key. משתמשי Edge הציבוריים והפרטיים
מפתח API לא חוקי מפתח ה-API שהועבר כחלק מהבקשה לא תקין. משתמשי Edge הציבוריים והפרטיים
Apigee Adapter ל-Envoy לא יכול לתקשר עם שרת proxy של API לשירות מרוחק Apigee Adapter ל-Envoy לא יכול לתקשר עם שרת ה-API של השירות המרוחק. משתמשי Edge הציבוריים והפרטיים
לשרת proxy ל-Envoy אין אפשרות לתקשר עם Apigee Adapter ל-Envoy שרת ה-proxy של Envoy לא יכול לתקשר עם Apigee Adapter ל-Envoy משתמשי Edge הציבוריים והפרטיים

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

  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 הספציפי שבו משתמש שרת ה-Proxy של Envoy לא מופעל בסביבה הספציפית שבה מופעלות קריאות ל-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 זמין במאמר Logging.

  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 הספציפי שבו משתמש שרת ה-proxy של Envoy.

אבחון

כדי לאבחן את הבעיה:

  1. מפעילים יומני ניפוי באגים כמו שמוסבר בשלב 2 למעלה.
  2. צריך לבדוק את Apigee Adapter ליומני 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 למוצר.
  5. בודקים את המתאם של Apigee ליומני Envoy וממתינים עד ש-Apigee Adapter ל-Envoy יאחזר את מוצר ה-API המעודכן. אחר כך, צריך לשלוח בקשת API נוספת כדי לאמת את התיקון.

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

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

אבחון

כדי לאבחן את הבעיה:

  1. מפעילים יומני ניפוי באגים כמו שמוסבר בשלב 2 למעלה.
  2. צריך לבדוק את Apigee Adapter ליומני 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, מוסיפים את שם המארח של היעד ואת היציאה שלו, ולוחצים על Save.

    אם הקטע יעדי שירות מרוחקים של Apigee לא מופיע בממשק המשתמש, מוסיפים מאפיין מותאם אישית למוצר ה-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 ולוודא שהשם של הכותרת x-api-key שמשמש כברירת המחדל של מפתח ה-API השתנה. לדוגמה:
    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 ליומני Envoy, צריך לבצע את הפעולות הבאות כדי לפתור את הבעיה:

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

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

השגיאה הזו תופיע אם Apigee Adapter ל-Envoy לא יכול לתקשר עם שרת ה-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 ל-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 שצוינה לשרת ה-API של השירות מרחוק תקינה.

    אם לא, עליכם להפסיק את השימוש ב-Apigee Adapter ל-Envoy, לתקן את כתובת ה-URL של שרת ה-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. צריך לוודא ששרת ה-API של remote-service נפרס בסביבת Edge הרלוונטית. אם לא, צריך לפרוס את שרת ה-Proxy של remote-service API בסביבת Edge הרלוונטית ולנסות שוב.
  3. בודקים את הקישוריות לרשת בין Apigee Adapter ל-Envoy לבין נקודת הקצה של ה-API מסוג remote-service של שרת ה-API. אם יש בעיות בקישוריות הרשת, פנו לצוות הרישות ונסו לפתור אותן.

הסיבה: שרת ה-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 לא פועל, צריך להפעיל את 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

אם אין האזנה ל-socket ביציאה 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. מתחילים סשן מעקב בשרת proxy ל-API של remote-service באמצעות ממשק המשתמש של Apigee Edge. משחזרים את הבעיה הזו ומשתפים את קובץ ה-XML של סשן המעקב.

    הפניה: שימוש בכלי המעקב | 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 שנשלחה לשרת ה-proxy של Envoy באמצעות פקודת curl (הפלט המלא של הפקודה curl):
    curl -v ENVOY_PROXY_ENDPOINT
  7. בקשת API שנשלחה לשירות היעד באמצעות פקודת curl (הפלט המלא של הפקודה curl):
    curl -v TARGET_SERVICE_ENDPOINT