跳至內容

如何對連線至 API Gateway 私有 API 端點時出現的問題進行疑難排解?

3 分的閱讀內容
0

我想對連線到 Amazon Virtual Private Cloud (Amazon VPC) 中的 Amazon API Gateway 私有 API 端點時出現的問題進行疑難排解。

簡短描述

Amazon VPC 中的 AWS 資源可能因為下列原因而無法連線至私有 API 端點

若要確定原因,您可以為 API 啟用 Amazon CloudWatch Logs,並查看日誌。

如果在啟用 CloudWatch Logs 後,API 請求未產生日誌,則表示該請求未到達端點。如果您的 API 請求未到達端點,請檢查您是否正確設定了私有 API 的調用網址。
如需詳細資訊,請參閱如何在我的 CloudWatch 日誌中尋找 API Gateway REST API 錯誤?

**注意:**API Gateway 資源政策設定錯誤,或私有 API 端點調用網址中的 DNS 名稱不正確,都可能導致連線問題。

解決方法

確認問題原因

請完成下列步驟:

  1. 為您的私有 REST API 啟用 CloudWatch Logs
  2. 日誌層級,選擇 INFO,然後選擇記錄完整請求/回應資料
  3. 查看 CloudWatch 中的 REST API 執行日誌,以確定問題的原因。

如果 API 請求到達端點,則會出現下列其中一種範例錯誤訊息:

  • 「使用者:匿名使用者未經授權執行:execute-api:在資源中調用:」
  • 「SSL:沒有與目標主機名稱 custom-domain.com/resource 相符的替代憑證主題名稱」
  • 「連線逾時」
  • 「無法解析主機:https://example.com/resource」

「使用者:匿名使用者未經授權執行:execute-api:在資源中調用:」

若要解決此問題,請設定以下政策:

  • 私有 API 的 API Gateway 資源政策必須允許從介面 VPC 端點或來源 VPC 到 API 端點的流量。
  • VPC 端點政策必須可讓用戶端存取私有 API 端點。這是 execute-api 服務的資源政策。
  • 自訂網域名稱的資源政策必須允許存取您的 VPC 端點,才能調用您的私有自訂網域名稱。預設情況下,API Gateway 會佈建自訂網域名稱,並在該自訂網域名稱的資源政策中明確拒絕。如需詳細資訊,請參閱教學課程: 建立並調用私有 API 的自訂網域名稱
    **重要:**如果您修改了 API 的資源政策,請將 API 部署到階段以儲存變更。

「SSL:沒有與目標主機名稱 custom-domain.com/resource 相符的替代憑證主題名稱」

若要解決此問題,請檢查您是否為 execute-api 服務的私有 VPC 端點建立了私有自訂網域名稱存取關聯

「連線逾時」

若要解決連線逾時問題,請完成以下步驟:

  1. 確認您託管用戶端的 VPC 中是否存在 API Gateway execute-api VPC 端點。然後,確認端點與私有 API 位於相同 AWS 區域。如端點不存在,請針對 API Gateway execute-api 建立介面 VPC 端點。

  2. 使用 traceroute 確認調用私有 API 的用戶端是否存在於同一個 VPC 中,或是否可以使用 VPC 端點存取該 VPC。

    若要安裝 traceroute,請執行下列命令:

    Amazon Linux:

    sudo yum install traceroute

    Ubuntu:

    sudo apt-get install traceroute

    若要使用 traceroute 測試連線,請執行下列命令:

    sudo traceroute -n -T -p 443 VPC-endpoint IP-address

    **注意:**引數 T -p 443 -n 會在連接埠 443 上執行 TCP 型追蹤。將 VPC-endpoint IP-address 替換為您 VPC 端點的 IP 位址。

  3. 確認您 Amazon VPC 安全群組的規則設定正確。
    若要測試您的 Amazon VPC 安全群組,請從向私有 API 端點發出請求的用戶端執行下列命令:

    telnet public-dns-hostname.execute-api.region.vpce.amazonaws.com 443

    **注意:**將 public-dns-hostname 替換為包含您 API VPC 端點 ID 的公有 DNS 主機名稱。另外,將 region 替換為您介面 VPC 端點所在的區域。

    或者,從向私有 API 自訂網域名稱發出請求的用戶端執行以下命令:

    telnet custom-domain-name 443

    **注意:**將 custom-domain-name 替換為您的私有 API 自訂網域名稱。

如果連線逾時,則表示您沒有正確設定 Amazon VPC 安全群組的規則。

請求資源必須具有安全群組規則,該規則允許 TCP 連接埠 443 傳出流量到 VPC 端點的 IP 位址範圍或安全群組。此外,VPC 端點必須具有安全群組規則,該規則允許來自請求資源的 IP 位址範圍或安全群組的 TCP 連接埠 443 傳入流量。

如需詳細資訊,請參閱如何限制往返 Amazon VPC 資源的流量?

「無法解析主機:https://www.example.com/resource」

若要解決此問題,請執行下列動作:

測試私有 API 端點的網域是否正確解析為 VPC 端點的 IP 位址

**注意:**確認用戶端位於 execute-api VPC 端點存在的 VPC 內。

請完成下列步驟:

  1. 從向私有 API 端點發出請求的用戶端執行以下 nslookup 命令:
    nslookup restapi-id.execute-api.region.amazonaws.com
    **注意:**將 rest api-id 替換為您的私有 API ID,將 region 替換為您私有 API 端點所在的區域。
  2. 從向私有 API 自訂網域名稱發出請求的用戶端執行以下 nslookup 命令:
    nslookup custom-domain-name
    **注意:**將 custom-domain-name 替換為您的私有 API 自訂網域名稱。成功的輸出會顯示 VPC 端點的私有 IP 位址。
  3. 執行下列 nslookup 命令:
    nslookup public-dns-hostname.execute-api.region.vpce.amazonaws.com
    **注意:**將 public-dns-hostname 替換為包含您 API VPC 端點 ID 的公有 DNS 主機名稱。將 region 替換為您介面 VPC 端點所在的區域。成功的輸出會顯示 VPC 端點的私有 IP 位址。
  4. 比較每個命令輸出中的 IP 位址。如果每個命令輸出的 IP 位址相符,表示設定如預期運作。

若要為您的 VPC 端點啟用私有 DNS,請完成下列步驟。

  1. 開啟 Amazon VPC console (Amazon VPC 主控台)。
  2. Endpoints (端點) 窗格中,選取您的介面 VPC 端點。
  3. 選擇 Actions (動作)。
  4. 選擇 Modify Private DNS names(修改私有 DNS 名稱)。
  5. 選取 Enable Private DNS Name (啟用私有 DNS 名稱),然後選擇 Save Changes (儲存變更)。

啟用 CloudWatch Logs 後,API 請求並未產生任何 CloudWatch Logs

若要解決此問題,請執行下列動作:

  • 正確設定私有 API 端點的 API Gateway 資源政策。
  • 正確格式化您私有 API 的調用網址,以存取私有 API 端點。
    **注意:**如果您啟用了私有 DNS,則必須使用特定端點的公有 DNS 主機名稱。如果您未啟用私有 DNS,請使用私有 DNS 名稱。
  • 將私有 API 自訂網域名稱對應到正確的 API 階段。

相關資訊

如何使用介面 VPC 端點存取其他帳戶中的 API Gateway 私有 REST API?

從 VPC 連線至我的 API Gateway API 時,為什麼會出現 HTTP 403 禁止錯誤?

如何使用流程日誌監控 VPC 中的流量?

如何開啟 CloudWatch 日誌,以對我的 API Gateway REST API 或 WebSocket API 進行疑難排解?