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

上次更新日期:2021 年 12 月 16 日

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

簡短描述

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

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

問題 回應標題 錯誤訊息 根本原因
存取遭拒 "x-amzn-errortype" = "AccessDeniedException" 「使用者沒有授權可以存取此資源且系統明確拒絕」 呼叫者沒有授權可以存取使用 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 應用程式防火牆 (WAF) 篩選條件封鎖。
資源路徑不存在 "x-amzn-errortype" = "MissingAuthenticationTokenException" 「缺少身分驗證字符」 沒有「授權」標題的請求傳送到不存在的 API 資源路徑。
資源路徑不存在 "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 禁止錯誤,進行故障排除?

解決方案

考慮錯誤來源

如果是其他資源報告 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 -v 命令範例

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

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

驗證請求標題是否正確

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

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

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

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

請記住以下幾點:

檢閱 API 的資源政策

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

檢閱 HTTP 請求和回應訊息

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

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