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

أنت الآن بصدد الاطّلاع على مستندات Apigee Edge.
انتقِل إلى مستندات Apigee X.
info

المشكلة

يتعذّر تنفيذ Envoy Proxy مع ظهور الخطأ 403 Forbidden في HTTP عند استدعائه من خلال محوّل Apigee لـ 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 الخطأ 403 في HTTP إذا تحقّق أحد الشرطين التاليين:

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

قبل البدء

  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 Adapter for Envoy.

    لمزيد من المعلومات حول تسجيل "محوّل Apigee" لـ Envoy، راجِع التسجيل.

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

الدقة

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

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

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

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

التشخيص

يُرجى اتّباع الخطوات التالية لتشخيص المشكلة:

  1. فعِّل سجلّات تصحيح الأخطاء كما هو موضّح في الخطوة 2 أعلاه.
  2. راجِع سجلّات Apigee Adapter for 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 Adapter for Envoy.
  3. في صفحة منتجات واجهة برمجة التطبيقات > اسم المنتج، انقر على تعديل.
  4. في جزء مراجع موارد واجهة برمجة التطبيقات، أضِف معرّف الموارد المنتظم (URI) لطلب بيانات من واجهة برمجة التطبيقات إلى منتج واجهة برمجة التطبيقات.
  5. راقِب سجلات "محوّل Apigee" لـ Envoy وانتظِر إلى أن يجلب "محوّل Apigee" لـ Envoy منتج واجهة برمجة التطبيقات المعدَّل. بعد ذلك، أرسِل طلب بيانات من واجهة برمجة التطبيقات آخر للتحقّق من الإصلاح.

السبب: لم يتم إدخال اسم المضيف في منتج واجهة برمجة التطبيقات

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

التشخيص

يُرجى اتّباع الخطوات التالية لتشخيص المشكلة:

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

الدقة

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

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

    إذا لم يظهر قسم أهداف الخدمة البعيدة في Apigee في واجهة المستخدم، أضِف سمة مخصّصة إلى حزمة واجهة برمجة التطبيقات بالاسم apigee-remote-service-targets وأضِف القيمة HOSTNAME:PORT باستخدام واجهة برمجة التطبيقات Edge. على سبيل المثال:

    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" لـ Envoy وانتظِر إلى أن يجلب "محوّل Apigee" لـ 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 Adapter for Envoy، اتّبِع الخطوات التالية لحلّ المشكلة:

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

الدقة

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

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

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

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

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

الدقة

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

  1. تحقَّق من ملف إعداد Apigee Adapter for Envoy وتأكَّد من أنّ عنوان URL لخادم وكيل API للخدمة البعيدة صالح.

    إذا لم يكن كذلك، أوقِف 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 Adapter for 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 Adapter for Envoy قيد التشغيل.

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

الدقة

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

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

إذا لم تكن عملية Apigee Adapter for 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 Adapter for Envoy.

الدقة

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

إذا استمرت المشكلة، انتقِل إلى المعلومات التشخيصية التي يجب جمعها.

يجب جمع معلومات التشخيص

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

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

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

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

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

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

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

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

  5. سجلّات "محوّل Apigee" لـ 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