พร็อกซี Envoy ทํางานล้มเหลวโดยมีข้อผิดพลาด HTTP 403 ในอะแดปเตอร์ Apigee สําหรับ Envoy

คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่เอกสารประกอบของ Apigee X
info

ลักษณะปัญหา

พร็อกซี Envoy ล้มเหลวโดยมีข้อผิดพลาด 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 หากมีเงื่อนไขต่อไปนี้ เกิดขึ้น

สาเหตุ คำอธิบาย วิธีการแก้ปัญหาที่ใช้ได้กับ
ไม่ได้เปิดใช้ผลิตภัณฑ์ API ไม่ได้เปิดใช้ผลิตภัณฑ์ API สำหรับสภาพแวดล้อมที่เฉพาะเจาะจง ผู้ใช้ Edge Public และ Private Cloud
ไม่มีเส้นทาง URI ของบริการเป้าหมายในผลิตภัณฑ์ API ไม่มีเส้นทาง URI ของบริการเป้าหมายหรือไม่ได้เพิ่มลงในผลิตภัณฑ์ API ภายใต้ทรัพยากร API ผู้ใช้ Edge Public และ Private Cloud
ไม่มีชื่อโฮสต์ในผลิตภัณฑ์ API ชื่อโฮสต์ที่ระบุในคำขอ API ของไคลเอ็นต์ไม่มีอยู่ในผลิตภัณฑ์ API ในส่วนเป้าหมายบริการระยะไกลของ Apigee ผู้ใช้ Edge Public และ Private Cloud
ไม่มีคีย์ API ในส่วนหัวของคำขอ ไม่ได้ส่งคีย์ API ในส่วนหัว HTTP x-api-key ผู้ใช้ Edge Public และ Private Cloud
คีย์ API ไม่ถูกต้อง คีย์ API ที่ส่งเป็นส่วนหนึ่งของคำขอไม่ถูกต้อง ผู้ใช้ Edge Public และ Private Cloud
Apigee Adapter for Envoy ไม่สามารถ สื่อสารกับพร็อกซี API ของบริการระยะไกล Apigee Adapter for Envoy สื่อสารกับพร็อกซี API ของบริการระยะไกลไม่ได้ ผู้ใช้ Edge Public และ Private Cloud
พร็อกซี Envoy สื่อสารกับ Apigee Adapter for Envoy ไม่ได้ พร็อกซี Envoy สื่อสารกับ Apigee Adapter for Envoy ไม่ได้ ผู้ใช้ Edge Public และ 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 สำหรับ 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 for Envoy

    ดูข้อมูลเพิ่มเติมเกี่ยวกับการบันทึกของ Apigee Adapter for Envoy ได้ที่ การบันทึก

  3. หากเห็นข้อความนี้ขณะให้สิทธิ์คำขอ API แสดงว่าผลิตภัณฑ์ API ที่เฉพาะเจาะจงไม่ได้เปิดใช้สำหรับสภาพแวดล้อมที่คุณทำการเรียก API
  4. โปรดทำตามขั้นตอนต่อไปนี้เพื่อยืนยัน
    1. เข้าสู่ระบบ Edge UI
    2. ในหน้าเผยแพร่ > ผลิตภัณฑ์ API ให้คลิกผลิตภัณฑ์ API ที่คุณใช้กำหนดค่า Apigee Adapter สำหรับ Envoy
    3. ตรวจสอบว่าสภาพแวดล้อมที่เฉพาะเจาะจงซึ่งคุณใช้ส่งคำขอ API นั้น เปิดใช้ในผลิตภัณฑ์ API แล้ว
    4. หากไม่ได้เปิดใช้สภาพแวดล้อมที่เฉพาะเจาะจงในผลิตภัณฑ์ API นั่นคือสาเหตุ ของปัญหานี้
  5. หากเปิดใช้สภาพแวดล้อมที่เฉพาะเจาะจงแล้ว ให้ไปที่ สาเหตุ: ไม่มีเส้นทาง URI ของบริการเป้าหมายในผลิตภัณฑ์ API

ความละเอียด

หากไม่ได้เปิดใช้สภาพแวดล้อมที่เฉพาะเจาะจงในผลิตภัณฑ์ API ให้ทำตามขั้นตอนต่อไปนี้เพื่อ แก้ไขปัญหา

  1. เข้าสู่ระบบ Edge UI
  2. ในหน้าเผยแพร่ > ผลิตภัณฑ์ API ให้คลิกผลิตภัณฑ์ API ที่คุณใช้ เพื่อกำหนดค่า Apigee Adapter สำหรับ Envoy
  3. ในหน้าผลิตภัณฑ์ API > ชื่อผลิตภัณฑ์ ให้คลิกแก้ไข
  4. เปิดใช้สภาพแวดล้อมที่ต้องการส่งคำขอ API โดยเลือก ช่องทําเครื่องหมายสภาพแวดล้อมที่เกี่ยวข้อง
  5. คลิกบันทึก

สาเหตุ: ไม่มีเส้นทาง URI ของบริการเป้าหมายในผลิตภัณฑ์ API

ข้อผิดพลาดนี้จะเกิดขึ้นหากไม่ได้ระบุเส้นทาง URI ของเป้าหมายในผลิตภัณฑ์ API ที่เฉพาะเจาะจงซึ่งใช้โดย Envoy Proxy

การวินิจฉัย

ทำตามขั้นตอนต่อไปนี้เพื่อวินิจฉัยปัญหา

  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 UI
  2. ในหน้าเผยแพร่ > ผลิตภัณฑ์ API ให้คลิกผลิตภัณฑ์ API ที่คุณใช้กำหนดค่า Apigee Adapter สำหรับ Envoy
  3. ในหน้า API Products > Product Name ให้คลิกแก้ไข
  4. ในบานหน้าต่างทรัพยากร API ให้เพิ่ม URI คำขอ API ลงในผลิตภัณฑ์ API
  5. ตรวจสอบบันทึกของ Apigee Adapter for Envoy และรอจนกว่า Apigee Adapter for 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 for Envoy มีรายการที่มีข้อความ no targets: HOSTNAME:PORT ขณะให้สิทธิ์คำขอ แสดงว่านี่คือสาเหตุของปัญหา หากไม่เป็นเช่นนั้น ให้ไปที่ สาเหตุ: ไม่มีคีย์ API ในส่วนหัวของคำขอ

ความละเอียด

หากไม่ได้เพิ่มชุดค่าผสมชื่อโฮสต์และพอร์ตเป้าหมายลงในผลิตภัณฑ์ API ให้ทำตาม ขั้นตอนต่อไปนี้เพื่อแก้ไขปัญหา

  1. เข้าสู่ระบบ Edge UI
  2. ในหน้าเผยแพร่ > ผลิตภัณฑ์ API ให้คลิกผลิตภัณฑ์ API ที่คุณใช้กำหนดค่า Apigee Adapter สำหรับ Envoy
  3. ในหน้าผลิตภัณฑ์ API > ชื่อผลิตภัณฑ์ ให้คลิกแก้ไข
  4. ในแผงเป้าหมายบริการระยะไกลของ Apigee ให้เพิ่มชื่อโฮสต์และ พอร์ตเป้าหมาย แล้วคลิกบันทึก

    หากไม่เห็นส่วนเป้าหมายบริการระยะไกลของ Apigee ใน UI ให้เพิ่มแอตทริบิวต์ที่กำหนดเองลงในผลิตภัณฑ์ 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 for Envoy และรอจนกว่า Apigee Adapter for Envoy จะดึงข้อมูลผลิตภัณฑ์ API ที่อัปเดตแล้ว หลังจากนั้น ให้ส่งคำขอ API อีกครั้งเพื่อยืนยันการแก้ไข

สาเหตุ: ไม่มีคีย์ API ในส่วนหัวของคำขอ

ข้อผิดพลาดนี้จะเกิดขึ้นหากไม่ได้ส่งคีย์ API เป็นส่วนหนึ่งของส่วนหัวของคำขอ

การวินิจฉัย

ทำตามขั้นตอนต่อไปนี้เพื่อวินิจฉัยปัญหา

  1. เปิดใช้บันทึกการแก้ไขข้อบกพร่องตามที่อธิบายไว้ในขั้นตอนที่ 2 ด้านบน
  2. ตรวจสอบบันทึกของ Apigee Adapter for 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 for 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 for Envoy และยืนยันว่าคุณเห็นข้อความ [permission denied] ในส่วนAuthenticate error โดยปกติแล้วข้อความนี้จะแสดงหลังจากที่ Adapter ดึงข้อมูลคีย์ 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 for Envoy สื่อสารกับพร็อกซี API ของบริการระยะไกลไม่ได้

ความละเอียด

หากเห็นข้อความ [permission denied] ในส่วน Authenticate error ในบันทึกของ Apigee Adapter สำหรับ Envoy ให้ทำตามขั้นตอนต่อไปนี้ เพื่อแก้ไขปัญหา

  1. ตรวจสอบคีย์ API ที่ส่งในคำขอ API กับค่าคีย์ API ที่พบใน แอปพลิเคชันที่เชื่อมต่อกับผลิตภัณฑ์ API
  2. หากคีย์ API ที่ไคลเอ็นต์ใช้ไม่ถูกต้อง ให้ขอให้ไคลเอ็นต์ส่งคีย์ API ที่ถูกต้อง
  3. หากคีย์ API ที่ไคลเอ็นต์ใช้ถูกต้องและคุณยังเห็นข้อผิดพลาด HTTP 403 โปรดติดต่อทีมสนับสนุนของ Apigee Edge เพื่อตรวจสอบเพิ่มเติม

สาเหตุ: Apigee Adapter for Envoy สื่อสารกับพร็อกซี API ของบริการระยะไกลไม่ได้

ข้อผิดพลาดนี้จะเกิดขึ้นหาก Apigee Adapter สำหรับ Envoy สื่อสารกับพร็อกซี API ของบริการระยะไกลไม่ได้ในกรณีที่โฮสต์บริการระยะไกลที่กำหนดค่าไม่ถูกต้อง

การวินิจฉัย

ทำตามขั้นตอนต่อไปนี้เพื่อวินิจฉัยปัญหา

  1. เปิดใช้บันทึกการแก้ไขข้อบกพร่องตามที่อธิบายไว้ในขั้นตอนที่ 2 ด้านบน
  2. ตรวจสอบบันทึกของ Apigee Adapter for 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 ของ remote-service ไม่ได้เนื่องจากชื่อโฮสต์ที่ระบุใน URL ของพร็อกซี API ของเซิร์ฟเวอร์ระยะไกลไม่ถูกต้องตามที่ระบุโดยข้อผิดพลาด no such host

  3. หากบันทึกของ Apigee Adapter for Envoy มีรายการบันทึกที่มีข้อความ no such host แสดงว่านี่คือสาเหตุของปัญหา หากไม่เป็นเช่นนั้น ให้ไปที่ สาเหตุ: พร็อกซี Envoy สื่อสารกับ Apigee Adapter สำหรับ Envoy ไม่ได้

ความละเอียด

หากข้อผิดพลาดข้างต้นแสดงในบันทึกของ Apigee Adapter for 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 ที่เกี่ยวข้องแล้ว หากไม่ได้ ให้ติดตั้งใช้งานremote-serviceพร็อกซี API ในสภาพแวดล้อม Edge ที่เกี่ยวข้อง แล้วลองอีกครั้ง
  3. ตรวจสอบการเชื่อมต่อเครือข่ายระหว่าง Apigee Adapter สำหรับ Envoy กับ remote-service ปลายทางของพร็อกซี API หากพบปัญหาการเชื่อมต่อเครือข่าย โปรดติดต่อทีมเครือข่ายและพยายามแก้ไขปัญหา

สาเหตุ: พร็อกซี Envoy สื่อสารกับ Apigee Adapter for 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 for 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 for Envoy ได้เนื่องจากเหตุผล connection failure

  3. connection failure อาจเกิดจากหลายสาเหตุ มาดูแต่ละสถานการณ์กัน

สถานการณ์ #1: กระบวนการของอแดปเตอร์ไม่ทำงาน

หากกระบวนการ Apigee Adapter สำหรับ Envoy ไม่ทํางาน ข้อผิดพลาดนี้อาจเกิดขึ้น

  1. ตรวจสอบว่ากระบวนการ Apigee Adapter สำหรับ Envoy ทำงานอยู่โดยการเรียกใช้คำสั่งต่อไปนี้ หากกระบวนการ Apigee Adapter for Envoy ทำงานอยู่ ผลลัพธ์ของคำสั่งต่อไปนี้ ควรแสดงรายการ
    ps -ef | grep apigee-remote-service-envoy
  2. หากไม่ได้ทำงาน แสดงว่านั่นคือสาเหตุของปัญหา

ความละเอียด

  1. หากกระบวนการ Apigee Adapter for Envoy ไม่ทํางาน ให้เริ่ม Apigee Adapter for Envoy
  2. ส่งคำขอ API อีกครั้งและตรวจสอบว่าปัญหาได้รับการแก้ไขแล้วหรือไม่

สถานการณ์ #2: กระบวนการของอแดปเตอร์ไม่ได้ฟังในพอร์ตที่เฉพาะเจาะจง

หากกระบวนการ Apigee Adapter for Envoy ไม่ได้กําลังรับฟังในพอร์ตที่เฉพาะเจาะจง ข้อผิดพลาดนี้อาจเกิดขึ้น

หากกระบวนการ Apigee Adapter for 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 for Envoy แล้วเริ่มอีกครั้ง
  2. ส่งคำขอ API อีกครั้งและตรวจสอบว่าปัญหาได้รับการแก้ไขแล้วหรือไม่

สถานการณ์ #3: การเชื่อมต่อเครือข่ายระหว่าง Envoy กับ Apigee Adapter for Envoy

  1. ตรวจสอบการเชื่อมต่อเครือข่ายระหว่าง Envoy กับ Apigee Adapter for 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

    ข้อมูลอ้างอิง: Apigee Edge APIs

  4. เริ่มเซสชันการติดตามในremote-serviceพร็อกซี API โดยใช้ UI ของ 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. คำขอ API ที่ส่งไปยังพร็อกซี Envoy โดยใช้คำสั่ง curl (เอาต์พุตทั้งหมดของคำสั่ง curl)
    curl -v ENVOY_PROXY_ENDPOINT
  7. คำขอ API ที่ส่งไปยังบริการเป้าหมายโดยใช้คำสั่ง curl (เอาต์พุตทั้งหมดของคำสั่ง curl)
    curl -v TARGET_SERVICE_ENDPOINT