如何針對 API Gateway 的 HTTP 403 錯誤進行疑難排解?

4 分的閱讀內容
0

當我呼叫 Amazon API Gateway API 時,出現 403 錯誤。如何針對 API Gateway 的 403 錯誤進行疑難排解?

簡短描述

HTTP 403 回應程式碼表示禁止用戶端存取有效 URL。伺服器了解請求,但由於用戶端問題而無法履行請求。

API Gateway API 會因為下列任何原因而傳回 403 回應:

問題回應標題錯誤訊息根本原因
存取遭拒"x-amzn-errortype" = "AccessDeniedException"「使用者沒有授權可以存取此資源且系統明確拒絕」呼叫者沒有授權,無法存取使用 API Gateway Lambda 授權方的 API。
存取遭拒"x-amzn-errortype" = "AccessDeniedException"「使用者 <user-arn> 沒有授權可以在資源 <api-resource-arn> 上執行 execute-api:Invoke 且系統明確拒絕」呼叫者沒有授權可以存取使用 AWS Identity and Access Management (IAM) 授權的 API。或者,API 具有附加的資源政策,明確拒絕呼叫者的存取。 如需詳細資訊,請參閱 IAM 身分驗證和資源政策
存取遭拒"x-amzn-errortype" = "AccessDeniedException"「使用者 anonymous 沒有授權可以在資源 <api-resource-arn> 上執行 execute-api:Invoke」呼叫者沒有授權可以存取使用 IAM 授權的 API。或者,API 有附加的資源政策,未明確允許呼叫者叫用 API。 如需詳細資訊,請參閱 IAM 身分驗證和資源政策
存取遭拒"x-amzn-errortype" = "AccessDeniedException"「請求中包含的安全字符無效。」呼叫者使用了對於存取使用 IAM 授權 的 API 無效的 IAM 金鑰。
缺少身分驗證字符"x-amzn-errortype" = "MissingAuthenticationTokenException"「缺少身分驗證字符」在請求中找不到身分驗證字符。
身分驗證字符已過期"x-amzn-errortype" = "InvalidSignatureException"「簽章已過期」請求中的身分驗證字符已過期。
API 金鑰無效"x-amzn-errortype" = "ForbiddenException"「指定的 API 金鑰識別符無效」呼叫者使用了對於需要 API 金鑰的方法無效的 API 金鑰
簽章無效"x-amzn-errortype" = "InvalidSignatureException"「我們計算的請求簽章不符合您提供的簽章。請檢查您的 AWS 私密存取金鑰和簽署方法。」當存取使用 IAM 授權的 API 時,請求中的簽章不符合伺服器上的簽章。
已篩選的 AWS WAF"x-amzn-errortype" = "ForbiddenException"「禁止」AWS WAF 在 API 中啟動時,請求遭到 Web 應用程式防火牆篩選條件封鎖。
資源路徑不存在"x-amzn-errortype" = "MissingAuthenticationTokenException"「缺少身分驗證字符」沒有「授權」標題的請求傳送到不存在的 API 資源路徑。 若需詳細資訊,請參閱如何解決 API Gateway REST API 端點的 403「缺少身份驗證字符」錯誤?
資源路徑不存在"x-amzn-errortype" = "IncompleteSignatureException"「授權標題需要 'Credential' 參數。授權標題需要 'Signature' 參數。Authorization header requires 'SignedHeaders' parameter.授權標題需要有 'X-Amz-Date' 或 'Date' 標題。Authorization=allow"具有「授權」標題的請求傳送到不存在的 API 資源路徑。
未正確地使用公有 DNS 名稱叫用私有 API"x-amzn-errortype" = "ForbiddenException"「禁止」未正確地使用公有 DNS 從 Amazon Virtual Private Cloud (Amazon VPC) 內叫用私有 API。例如:在請求中遺漏 "Host""x-apigw-api-id" 標題。 如需詳細資訊,請參閱使用端點特定公有 DNS 主機名稱叫用您的私有 API
使用預設 execute-api 端點叫用具有自訂網域的 REST API"x-amzn-errortype" = "ForbiddenException"「禁止」在停用預設端點之後,呼叫者使用預設 execute-api 端點來叫用 REST API。 如需詳細資訊,請參閱停用 REST API 的預設端點
使用無效的用戶端憑證叫用需要相互 Transport Layer Security (TLS) 的 API Gateway 自訂網域。"x-amzn-errortype" = "ForbiddenException"「禁止」API 請求中呈現的用戶端憑證並非由自訂網域名稱的信任庫核發,或者它是無效的。 如需詳細資訊,請參閱如何對來自需相互 TLS 的 API Gateway 自訂網域名稱的 HTTP 403 禁止錯誤,進行故障排除?
在沒有基本路徑映射的情況下叫用自訂網域名稱"x-amzn-errortype" = "ForbiddenException"「禁止」呼叫者會叫用自訂網域,而不會將基本路徑映射至 API。   如需詳細資訊,請參閱為 REST API 設定自訂網域名稱
在網域 URL 包含階段時,叫用已啟用自訂網域的 API"x-amzn-errortype" = "MissingAuthenticationTokenException"「缺少身分驗證字符」API 映射會指定 API 及階段,並選擇性地指定用於映射的路徑。因此,當 API 的階段映射至自訂網域時,您不再需要在 URL 中包含階段。 如需詳細資訊,請參閱搭配使用 REST API 的 API 映射
要求 URL 中的階段無效"x-amzn-errortype" = "ForbiddenException"「禁止」呼叫者的要求 URL 包含不存在的階段。確認階段存在以及要求 URL 的拼寫。 如需詳細資訊,請參閱在 Amazon API 閘道中叫用 REST API

解決方案

考慮錯誤來源

如果是其他資源報告 403 錯誤,則可能存在其他錯誤原因。例如:

  • 如果 Web 瀏覽器報告錯誤,則該錯誤可能由不正確的代理設定所致。如果不允許 HTTP 存取,代理服務器會傳回 403 錯誤。
  • 如果 API 前面有另一個 AWS 服務,則該服務可以拒絕請求,並在回應中出現 403 錯誤。例如:Amazon CloudFront。

識別導致錯誤的原因

如果您還未這麼做,為您的 API 設定 Amazon CloudWatch 存取記錄日誌。然後,在 CloudWatch 中檢視 API 的執行日誌,以判斷請求是否送達 API。

注意:HTTP API 不支援執行記錄功能。若要對需相互 TLS 並叫用 HTTP API 的自訂網域名稱傳回的 403 錯誤,進行故障診斷,您必須執行下列操作:

1.    為您叫用 REST API 僅進行測試的自訂網域名稱,建立新 API 映射

2.    在 CloudWatch 中檢視 REST API 的執行日誌,找出導致錯誤的原因。

3.    找到並解決錯誤後,將自訂網域名稱的 API 映射重新路由回 HTTP API。

確認 API 定義中存在請求的資源

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請確保您使用的是最新的 AWS CLI 版本

使用 API Gateway 主控台AWS CLI 驗證以下內容:

  • API 使用最新的 API 定義進行部署
  • API 定義中存在請求的資源。

使用 curl 獲取請求和回應詳細資訊

如果可以重製錯誤,則使用 curl -v 命令獲取用戶端和類似下列 API 之間的更多詳細資訊:

curl -X HTTP_VERB -v https://{api_id}.execute-api.{region}.amazonaws.com/{stage_name}/{resource_name}

**注意:**如需詳細資訊,請參閱 curl 專案網站

驗證請求標題是否正確

如果錯誤是無效的 API 金鑰造成的結果,則驗證是否在請求中傳送 "x-api-key" 標題。

驗證任何界面 Amazon VPC 端點上的 DNS 設定皆已正確設定

**注意:**針對從僅有界面 VPC 端點的 Amazon VPC 叫用的 API,確認下列項目。

根據您使用的 API 類型,驗證界面端點上的 DNS 設定為正確設定。

請記住以下幾點:

  • 若要從 Amazon VPC 內叫用區域 API,私有 DNS 名稱必須在界面端點上停用。然後,可以透過公有 DNS 解析端點的主機名稱。如需詳細資訊,請參閱在 Amazon API Gateway 中建立私有 API
  • 若要使用 API 的私有 DNS 名稱從 Amazon VPC 內叫用私有 API,私有 DNS 名稱必須在界面端點上啟用。然後,介面端點的主機名稱可解析為 Amazon VPC 的本地子網路資源。如需詳細資訊,請參閱如何叫用私有 API
    **注意:**如果您使用以下任一項目叫用私有 API,則不需要設定私有 DNS:
    私有 API 的公有 DNS 名稱
    -或-
    Amazon Route 53 別名

檢閱 API 的資源政策

檢閱 API 的資源政策以驗證下列項目:

檢閱 HTTP 請求和回應訊息

如果可能,在 Web 瀏覽器中重現錯誤。然後,使用瀏覽器的網絡工具擷取 HTTP 請求和回應訊息,並對其進行分析以判斷錯誤發生的位置。

**注意:**對於離線分析,請將訊息儲存在 HTTP 封存 (HAR) 檔案


相關資訊

常見錯誤 – Amazon API Gateway

如何僅允許特定 IP 地址存取我的 API Gateway REST API?

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

如何開啟 Amazon CloudWatch Logs 以對 API Gateway REST API 或 WebSocket API 進行疑難排解?