تعذُّر الخادم الوكيل في Envoy مع ظهور الخطأ HTTP 403 Forbidden في محول Apigee لـ Envoy

يتم الآن عرض مستندات Apigee Edge.
انتقِل إلى مستندات Apigee X.
المعلومات

المشكلة

تعذَّر خادم Envoy Proxy مع ظهور خطأ HTTP 403 Forbidden عند استدعائه من خلال Apigee Adapter for 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

الأسباب المحتملة

سيعرض الخادم الوكيل Envoy خطأ HTTP 403 في حال حدوث أحد الشروط التالية:

السبب الوصف تعليمات تحديد المشاكل وحلّها السارية على
عدم تفعيل منتج واجهة برمجة التطبيقات لم يتم تفعيل منتج واجهة برمجة التطبيقات للبيئة المحدّدة. مستخدمو Edge العام والخاص على السحابة الإلكترونية
عدم توفّر مسار معرّف الموارد المنتظم (URI) للخدمة المستهدَفة في منتج واجهة برمجة التطبيقات مسار معرّف الموارد المنتظم (URI) للخدمة المستهدفة غير متوفّر أو لم تتم إضافته إلى منتج واجهة برمجة التطبيقات ضمن موارد واجهة برمجة التطبيقات. مستخدمو Edge العام والخاص على السحابة الإلكترونية
اسم المضيف غير متوفّر في منتج واجهة برمجة التطبيقات اسم المضيف المُقدَّم في طلب واجهة برمجة التطبيقات للعميل غير متوفّر في منتج واجهة برمجة التطبيقات ضمن أهداف الخدمة عن بُعد في Apigee. مستخدمو Edge العام والخاص على السحابة الإلكترونية
مفتاح واجهة برمجة التطبيقات غير متوفّر في عنوان الطلب لم يتم تمرير مفتاح واجهة برمجة التطبيقات في عنوان HTTP يتضمّن العنصر x-api-key. مستخدمو Edge العام والخاص على السحابة الإلكترونية
مفتاح واجهة برمجة التطبيقات غير صالح مفتاح واجهة برمجة التطبيقات الذي تم تمريره كجزء من الطلب غير صالح. مستخدمو Edge العام والخاص على السحابة الإلكترونية
يتعذّر على محوِّل Apigee Adapt for Envoy الاتصال بالخادم الوكيل لواجهة برمجة التطبيقات للخدمة عن بُعد يتعذّر على محوِّل Apigee لخدمة Envoy الاتصال بالخادم الوكيل لواجهة برمجة التطبيقات للخدمة عن بُعد. مستخدمو Edge العام والخاص على السحابة الإلكترونية
يتعذّر على وكيل Envoy التواصل مع محوِّل Apigee لخدمة Envoy. يتعذّر على وكيل Envoy التواصل مع محوِّل Apigee لخدمة Envoy. مستخدمو Edge العام والخاص على السحابة الإلكترونية

قبل البدء

  1. تأكَّد من أنك تتلقّى رسالة الاستجابة 403 Forbidden من الخادم الوكيل لـ 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 for Envoy للحصول على مزيد من التفاصيل عن الخطأ. إذا لم يكن الأمر كذلك، أوقِف Apigee Adapter for Envoy ثم شغِّله مرة أخرى مع تفعيل سجلات تصحيح الأخطاء باستخدام الأمر التالي:

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

السبب: منتج واجهة برمجة التطبيقات غير مفعَّل

يحدث هذا الخطأ إذا كان منتج واجهة برمجة التطبيقات المحدّد الذي يستخدمه خادم Envoy Proxy غير مفعّل في البيئة المحدّدة التي يتم فيها استدعاء طلبات البيانات من واجهة برمجة التطبيقات.

التشخيص

يمكنك اتّباع الخطوات التالية لتشخيص المشكلة:

  1. فعِّل سجلات تصحيح الأخطاء كما هو موضّح في الخطوة 2 أعلاه.
  2. تحقَّق من محوِّل Apigee لسجلّات 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
    

    يوضِّح المثال أعلاه أنّ منتج واجهة برمجة التطبيقات ENVOY-PRODUCT-1 لم يتم العثور عليه في محوِّل Apigee لخدمة Envoy.

    لمزيد من المعلومات عن محوِّل Apigee لتسجيل الدخول إلى Envoy، يُرجى الاطّلاع على التسجيل.

  3. إذا رأيت هذه الرسالة أثناء تفويض طلب البيانات من واجهة برمجة التطبيقات، يعني ذلك على الأرجح أنّ منتج واجهة برمجة التطبيقات المحدّد غير مفعّل لبيئة معيّنة يتم فيها إجراء طلبات البيانات من واجهة برمجة التطبيقات.
  4. نفِّذ الخطوات التالية للتحقّق من ذلك:
    1. سجِّل الدخول إلى واجهة مستخدم Edge.
    2. في صفحة النشر > منتجات واجهة برمجة التطبيقات، انقر على منتج واجهة برمجة التطبيقات المحدّد الذي استخدمته لإعداد محوِّل Apigee لـ Envoy.
    3. تأكَّد من أنّ البيئة المحدّدة التي تقدّم فيها طلبات البيانات من واجهة برمجة التطبيقات مفعّلة في منتج واجهة برمجة التطبيقات.
    4. إذا لم تكن البيئة المحدّدة مفعّلة في منتج واجهة برمجة التطبيقات، يكون سبب هذه المشكلة هو السبب.
  5. إذا سبق أن تم تفعيل البيئة المحدّدة، انتقِل إلى السبب: لا يتوفّر مسار معرّف الموارد المنتظم (URI) للخدمة المستهدَفة في منتج واجهة برمجة التطبيقات.

درجة الدقّة

إذا لم تكن البيئة المحدّدة مفعّلة في منتج واجهة برمجة التطبيقات، يُرجى اتّباع الخطوات التالية لحلّ المشكلة:

  1. سجِّل الدخول إلى واجهة مستخدم Edge.
  2. في صفحة النشر > منتجات واجهة برمجة التطبيقات، انقر على منتج واجهة برمجة التطبيقات المحدّد الذي استخدمته لإعداد محوِّل Apigee لـ Envoy.
  3. في صفحة منتجات واجهة برمجة التطبيقات > اسم المنتج، انقر على تعديل.
  4. فعِّل البيئة المحدّدة التي تريد تقديم طلبات واجهة برمجة التطبيقات فيها، وذلك من خلال وضع علامة في مربّع اختيار البيئة المناسبة.
  5. انقر على حفظ.

السبب: عدم توفّر مسار معرّف الموارد المنتظم (URI) للخدمة المستهدَفة في منتج واجهة برمجة التطبيقات

يحدث هذا الخطأ إذا لم يتم تحديد مسار معرّف الموارد المنتظم (URI) للاستهداف في منتج واجهة برمجة التطبيقات المحدّد الذي يستخدمه خادم Envoy Proxy.

التشخيص

يمكنك اتّباع الخطوات التالية لتشخيص المشكلة:

  1. فعِّل سجلات تصحيح الأخطاء كما هو موضّح في الخطوة 2 أعلاه.
  2. تحقَّق من محوِّل Apigee لسجلّات Envoy وتحقَّق من عرض الرسالة التالية لمنتج واجهة برمجة التطبيقات المحدّد المرتبط بهدف محدّد ضمن القسم 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 في منتج واجهة برمجة التطبيقات ENVOY-PRODUCT-1.

  3. إذا رأيت الرسالة no path: REQUEST_URI_PATH في سجلّات تصحيح أخطاء Apigee Adapter for Envoy، هذا هو سبب هذه المشكلة. وإذا لم يكن الأمر كذلك، انتقِل إلى السبب: اسم المضيف غير متوفّر في منتج واجهة برمجة التطبيقات.

درجة الدقّة

في حال عدم إضافة معرّف الموارد المنتظم (URI) للطلب المحدّد إلى منتج واجهة برمجة التطبيقات للاستهداف المحدّد، عليك تنفيذ الخطوات التالية لحل المشكلة:

  1. سجِّل الدخول إلى واجهة مستخدم Edge.
  2. في صفحة النشر > منتجات واجهة برمجة التطبيقات، انقر على منتج واجهة برمجة التطبيقات المحدّد الذي استخدمته لإعداد محوِّل Apigee لـ Envoy.
  3. في صفحة منتجات واجهة برمجة التطبيقات > اسم المنتج، انقر على تعديل.
  4. في جزء موارد واجهة برمجة التطبيقات، أضف عنوان URI لطلب واجهة برمجة التطبيقات إلى منتج واجهة برمجة التطبيقات.
  5. راقِب محوِّل Apigee لسجلّات Envoy وانتظر إلى أن يجلب محوِّل Apigee لـ Envoy منتج واجهة برمجة التطبيقات المعدَّل. بعد ذلك، يمكنك إرسال طلب آخر من واجهة برمجة التطبيقات للتحقّق من إصلاح المشكلة.

السبب: اسم المضيف غير متوفّر في منتج واجهة برمجة التطبيقات

يحدث هذا الخطأ إذا لم تتم إضافة اسم المضيف المستهدَف ومجموعة المنفذ إلى منتج واجهة برمجة التطبيقات المحدّد الذي يستخدمه خادم Envoy Proxy.

التشخيص

يمكنك اتّباع الخطوات التالية لتشخيص المشكلة:

  1. فعِّل سجلات تصحيح الأخطاء كما هو موضّح في الخطوة 2 أعلاه.
  2. تحقَّق من محوِّل Apigee لسجلّات Envoy وتحقَّق من عرض الرسالة التالية لمنتج واجهة برمجة التطبيقات المحدّد المرتبط بهدف محدّد ضمن القسم 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 في منتج واجهة برمجة التطبيقات ENVOY-PRODUCT-1.

  3. إذا كانت سجلّات Apigee Adapter for Envoy تحتوي على إدخال بالرسالة no targets: HOSTNAME:PORT أثناء السماح بالطلب، يكون هذا هو سبب المشكلة. وإذا لم يكن الأمر كذلك، انتقِل إلى السبب: مفتاح واجهة برمجة التطبيقات غير متوفّر في عنوان الطلب.

درجة الدقّة

في حال عدم إضافة اسم المضيف المستهدَف ومجموعة المنفذ إلى منتج واجهة برمجة التطبيقات، عليك اتّباع الخطوات التالية لحلّ المشكلة:

  1. سجِّل الدخول إلى واجهة مستخدم Edge.
  2. في صفحة النشر > منتجات واجهة برمجة التطبيقات، انقر على منتج واجهة برمجة التطبيقات المحدّد الذي استخدمته لإعداد محوِّل Apigee لـ Envoy.
  3. في صفحة منتجات واجهة برمجة التطبيقات > اسم المنتج، انقر على تعديل.
  4. في لوحة Apigee البعيدة لاستهدافات الخدمة، أضِف اسم المضيف والمنفذ المستهدف، ثم انقر على حفظ.

    إذا لم يظهر قسم أهداف الخدمة عن بُعد في Apigee في واجهة المستخدم، أضِف سمة مخصّصة إلى منتج واجهة برمجة التطبيقات باسم 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 for Envoy وانتظر إلى أن يجلب محوِّل Apigee for Envoy منتج واجهة برمجة التطبيقات المعدّل. بعد ذلك، يمكنك إرسال طلب آخر من واجهة برمجة التطبيقات للتحقّق من إصلاح المشكلة.

السبب: مفتاح واجهة برمجة التطبيقات غير متوفّر في عنوان الطلب

يحدث هذا الخطأ إذا لم يتم تمرير مفتاح واجهة برمجة التطبيقات كجزء من عناوين الطلب.

التشخيص

يمكنك اتّباع الخطوات التالية لتشخيص المشكلة:

  1. فعِّل سجلات تصحيح الأخطاء كما هو موضّح في الخطوة 2 أعلاه.
  2. تحقَّق من محوِّل Apigee لسجلّات 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]. تشير هذه الرسالة إلى أنّ مفتاح واجهة برمجة التطبيقات لا يتم تمريره كجزء من عنوان الطلب.

  3. إذا كانت سجلّات Apigee Adapter for Envoy تحتوي على إدخال سجلّ يتضمّن الرسالة [missing authentication]ضمن القسم Authenticate error ، يكون هذا هو سبب المشكلة. وإذا لم يكن الأمر كذلك، انتقِل إلى السبب: مفتاح واجهة برمجة التطبيقات غير صالح.

درجة الدقّة

إذا تم عرض الخطأ [missing authentication] في سجلّات محوِّل Apigee لـ Envoy، نفِّذ الخطوات التالية لحل المشكلة:

  1. تحقَّق مما إذا كان العميل قد أرسل مفتاح واجهة برمجة التطبيقات باستخدام عنوان HTTP x-api-key في طلب البيانات من واجهة برمجة التطبيقات. إذا لم يكن الأمر كذلك، اطلب من العميل إرسال مفتاح واجهة برمجة التطبيقات في عنوان HTTP x-api-key.
  2. تحقَّق من محوِّل Apigee لملف إعداد Envoy وتحقَّق من تغيير اسم العنوان التلقائي لمفتاح واجهة برمجة التطبيقات 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-key. في هذه الحالة، عليك ضبط مفتاح واجهة برمجة التطبيقات كجزء من العنوان api-key.

  3. إذا تم تغيير اسم العنوان التلقائي لمفتاح واجهة برمجة التطبيقات، اطلب من العميل استخدام اسم عنوان مفتاح واجهة برمجة التطبيقات المعدَّل وإرسال طلب آخر لواجهة برمجة التطبيقات والتأكّد مما إذا كان هذا سيؤدي إلى حلّ المشكلة.

السبب: مفتاح واجهة برمجة التطبيقات غير صالح

يحدث هذا الخطأ في حال تمرير مفتاح غير صالح لواجهة برمجة التطبيقات كجزء من عنوان الطلب.

التشخيص

يمكنك اتّباع الخطوات التالية لتشخيص المشكلة:

  1. فعِّل سجلات تصحيح الأخطاء كما هو موضّح في الخطوة 2 أعلاه.
  2. تحقَّق من محوِّل Apigee لسجلّات Envoy وتأكَّد من ظهور الرسالة [permission denied] ضمن القسم Authenticate error. ويتم عرض هذا عادةً بعد أن يجلب المحوِّل مفتاح واجهة برمجة التطبيقات الذي تحدّده الرسالة 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)
    

    في هذا المثال، لم يكن مفتاح واجهة برمجة التطبيقات الذي تم إرساله في طلب البيانات من واجهة برمجة التطبيقات صالحًا.

  3. إذا كانت سجلّات Apigee Adapter for Envoy تحتوي على إدخال سجلّ يتضمّن [permission denied] ضمن القسم Authenticate error ، يعني ذلك أنّ مفتاح واجهة برمجة التطبيقات الذي تم تمريره كجزء من الطلب غير صالح وأنّه سبب المشكلة. إذا لم يكن الأمر كذلك، انتقِل إلى السبب: يتعذّر على محوِّل Apigee لخدمة Envoy الاتصال بالخادم الوكيل لواجهة برمجة التطبيقات للخدمة عن بُعد.

درجة الدقّة

إذا ظهرت الرسالة [permission denied] ضمن القسم Authenticate error في سجلّات Apigee Adapter for Envoy، عليك اتّباع الخطوات التالية لحلّ المشكلة:

  1. تحقَّق من مفتاح واجهة برمجة التطبيقات الذي تم إرساله في طلب البيانات من خلال قيمة مفتاح واجهة برمجة التطبيقات التي تم العثور عليها في التطبيق المرتبط بمنتج واجهة برمجة التطبيقات.
  2. إذا كان مفتاح واجهة برمجة التطبيقات الذي يستخدمه العميل غير صالح، اطلُب من العميل إرسال مفتاح واجهة برمجة التطبيقات الصالح.
  3. إذا كان مفتاح واجهة برمجة التطبيقات الذي يستخدمه العميل صالحًا وكنت لا تزال ترى خطأ HTTP 403، يُرجى التواصل مع فريق دعم Apigee Edge لفحص هذا الخطأ بشكل أكبر.

السبب: يتعذّر على محوِّل Apigee لخدمة Envoy الاتصال بالخادم الوكيل لواجهة برمجة التطبيقات للخدمة عن بُعد.

يحدث هذا الخطأ إذا تعذَّر على محوِّل Apigee لخدمة Envoy الاتصال بالخادم الوكيل لواجهة برمجة التطبيقات للخدمة البعيدة إذا كان مضيف الخدمة البعيد الذي تم إعداده غير صالح.

التشخيص

يمكنك اتّباع الخطوات التالية لتشخيص المشكلة:

  1. فعِّل سجلات تصحيح الأخطاء كما هو موضّح في الخطوة 2 أعلاه.
  2. تحقَّق من محوِّل Apigee لسجلّات 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 لخدمة Envoy الاتصال بالخادم الوكيل لواجهة برمجة التطبيقات للخدمة البعيدة لأنّ اسم المضيف المقدَّم في عنوان URL للخادم الوكيل لواجهة برمجة تطبيقات الخادم البعيد غير صالح على النحو المُشار إليه في الخطأ no such host .

  3. إذا كانت سجلّات Apigee Adapter for Envoy تحتوي على إدخال سجلّ يتضمّن الرسالة no such host، يكون هذا هو سبب المشكلة. إذا لم يكن الأمر كذلك، يُرجى الانتقال إلى السبب: يتعذّر على وكيل Envoy التواصل مع محوِّل Apigee لخدمة Envoy.

درجة الدقّة

في حال ظهور الأخطاء المذكورة أعلاه في سجلّات Apigee Adapter for Envoy، نفِّذ الخطوات التالية لحل المشكلة:

  1. تحقَّق من محوّل Apigee لملف إعداد Envoy وتحقَّق من أنّ عنوان URL المحدّد للخادم الوكيل لواجهة برمجة التطبيقات للخدمة عن بُعد صالح.

    وإذا لم يكن الأمر كذلك، أوقِف Apigee Adapter for Envoy وأصلح عنوان URL للخادم الوكيل لواجهة برمجة التطبيقات للخدمة عن بُعد في ملف الإعداد، وشغِّل Apigee Adapter for Envoy وأرسِل طلبًا آخر لواجهة برمجة التطبيقات ثم نفِّذ عملية الإصلاح.

    نموذج الضبط:

    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 في بيئة Edge ذات الصلة. وإذا لم يكن الأمر كذلك، يمكنك نشر الخادم الوكيل لواجهة برمجة التطبيقات remote-service في بيئة Edge ذات الصلة وإعادة المحاولة.
  3. تحقَّق من اتصال الشبكة بين محوِّل Apigee لخدمة Envoy ونقطة نهاية الخادم الوكيل لواجهة برمجة التطبيقات remote-service. إذا تم العثور على أي مشكلات في الاتصال بالشبكة، تواصَل مع فريق الشبكات الذي تتعامل معه وحاوِل حلّ المشكلة.

السبب: يتعذّر على وكيل Envoy التواصل مع محوِّل Apigee لخدمة Envoy.

التشخيص

يمكنك اتّباع الخطوات التالية لتشخيص المشكلة:

  1. تأكَّد من تفعيل سجلات تصحيح الأخطاء في Envoy. إذا لم يكن الأمر كذلك، أوقِف Envoy وأعِد تشغيله، مع تفعيل سجلات تصحيح الأخطاء. بعد ذلك، يمكنك إرسال طلب آخر من واجهة برمجة التطبيقات.

    عمليات النشر المستقلة:

    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 لسجلّات 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 لخدمة Envoy بسبب السبب connection failure.

  3. وقد يرجع السبب في connection failure إلى عدة أسباب. لنلقِ نظرة على كل موقف من السيناريوهات.

السيناريو 1: عملية المحوِّل ليست قيد التشغيل

إذا كانت عملية محوِّل Apigee لخدمة Envoy لا تعمل، قد يحدث هذا الخطأ.

  1. تأكَّد من أنّ عملية محوِّل Apigee لخدمة Envoy تعمل من خلال تنفيذ الأمر التالي. في حال كانت عملية محوّل Apigee لـ Envoy قيد التشغيل، يجب أن تتضمّنها نتيجة الأمر التالي.
    ps -ef | grep apigee-remote-service-envoy
    
  2. وإذا كان لا يعمل، هذا هو سبب المشكلة.

درجة الدقّة

  1. إذا كانت عملية محوِّل Apigee لخدمة Envoy لا تعمل، ابدأ تشغيل محوِّل Apigee لخدمة Envoy.
  2. يُرجى تقديم طلب آخر من خلال واجهة برمجة التطبيقات والتأكّد مما إذا تم حلّ المشكلة.

السيناريو 2: عدم استماع عملية المحوِّل في المنفذ المحدد

قد يحدث هذا الخطأ إذا كانت عملية محوِّل Apigee لـ Envoy لا تستمع إلى المنفذ المحدّد.

إذا كانت عملية محوِّل Apigee لخدمة 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 لخدمة Envoy وشغِّله مرة أخرى.
  2. يُرجى تقديم طلب آخر من خلال واجهة برمجة التطبيقات والتأكّد مما إذا تم حلّ المشكلة.

السيناريو 3: اتصال الشبكة بين Envoy ومحوِّل Apigee لـ Envoy

  1. تحقق من اتصال الشبكة بين Envoy ومحوِّل Apigee لخدمة Envoy:
    ssh $ENVOY_HOST
    telnet $APIGEE_ENVOY_ADAPTER_HOST 5000

    إذا تمكن telnet من إجراء اتصال TCP بمحوّل Apigee لخدمة Envoy، فسيتم عرض مخرجات مشابهة لما يلي:

    telnet $APIGEE_ENVOY_ADAPTER_HOST 5000
    
    Trying ::1...
    Connected to localhost.
    Escape character is '^]'.
    
  2. إذا لاحظت الخطأ Connection timed out في telnet، هذا يعني أن هناك مشكلة في الاتصال بالشبكة بين Envoy ومحوّل Apigee لـ Envoy.

درجة الدقّة

إذا واجهت أي مشاكل في اتصال الشبكة بين Envoy وApigee Adapter for Envoy، يُرجى التواصل مع فريق الشبكات ومحاولة حل المشكلة.

في حال استمرار المشكلة، انتقِل إلى ضرورة جمع معلومات التشخيص.

ضرورة جمع معلومات التشخيص

في حال استمرار المشكلة بعد اتّباع التعليمات الواردة أعلاه، يمكنك جمع معلومات التشخيص التالية، ثم التواصل مع فريق دعم Apigee Edge:

  1. منتج Apigee المستخدَم:

    مثال: Apigee Edge Cloud وApigee OPDK وApigee Hybrid وApigee X

  2. تنظيم وبيئة Apigee
  3. قراءة تعريف منتج واجهة برمجة التطبيقات باستخدام واجهة برمجة تطبيقات Edge:

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

    المرجع: واجهات برمجة تطبيقات Apigee Edge

  4. يمكنك بدء جلسة تتبُّع في الخادم الوكيل لواجهة برمجة التطبيقات remote-service باستخدام واجهة مستخدم Apigee Edge. عليك إعادة تنفيذ هذه المشكلة ومشاركة ملف XML الخاص بجلسة التتبُّع.

    المرجع: استخدام أداة التتبُّع | Apigee Edge

  5. Apigee Adapter for 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. تم إرسال طلب بيانات من واجهة برمجة التطبيقات إلى الخادم الوكيل Envoy باستخدام أمر curl (النتيجة الكاملة للأمر curl):
    curl -v ENVOY_PROXY_ENDPOINT
  7. تم إرسال طلب بيانات من واجهة برمجة التطبيقات إلى الخدمة الهدف باستخدام الأمر curl (النتيجة الكاملة للأمر curl):
    curl -v TARGET_SERVICE_ENDPOINT