如何疑難排解 API Gateway 的 HTTP 403 錯誤?

4 分的閱讀內容
0

當我呼叫我的 Amazon API Gateway API 時,我收到 403 錯誤。

簡短說明

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

因為下列任一原因,API Gateway API 可以傳回 403 回應:

問題回應標頭錯誤訊息根本原因
存取遭拒"x-amzn-errortype" = "AccessDeniedException"「使用者未獲得存取此資源的權限,收到明確拒絕」呼叫者未獲得存取使用 API Gateway Lambda 授權者 API 的權限。
存取遭拒"x-amzn-errortype" = "AccessDeniedException"「使用者: <user-arn> 未經授權執行:execute-api: 在資源中調用: <api-resource-arn> 明確拒絕」呼叫者未獲得存取使用 AWS Identity and Access Management (IAM) 授權 API 的權限。或者,API 具有附加的資源政策,該政策明確拒存取呼叫者。<br><br>如需詳細資訊,請參閱 IAM 驗證和資源政策
存取遭拒"x-amzn-errortype" = "AccessDeniedException"「使用者:匿名未經授權執行:execute-api: 在資源中調用:<api-resource-arn>呼叫者未獲得存取使用 IAM 授權 API 的權限。或者,API 具有附加的資源政策,該政策不會明確允許呼叫者調用 API。<br><br>如需詳細資訊,請參閱 IAM 驗證和資源政策
存取遭拒"x-amzn-errortype" = "AccessDeniedException"「請求中包含的安全權杖無效。」呼叫者使用無效的 IAM 金鑰來存取使用 IAM 授權的 API。
缺少驗證權杖"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"「禁止」當 ](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-aws-waf.html)API 中的 AWS WAF 啟用[後,Web 應用程式防火牆篩選會封鎖請求。
資源路徑不存在"x-amzn-errortype" = "MissingAuthenticationTokenException"「缺少驗證權杖」沒有「授權」標頭的請求將傳送到不存在的 API 資源路徑。<br><br>如需詳細資訊,請參閱如何疑難排解來自 API 閘道 REST API 端點的 403「缺少驗證權杖」錯誤?
資源路徑不存在"x-amzn-errortype" = "IncompleteSignatureException"「授權標頭需要『Credential』參數。授權標頭需要『Signature』參數。授權標頭需要『SignedHeaders』參數。授權標頭需要擁有『X-Amz-Date』或『日期』標頭。Authorization=allow」標頭為「授權」的請求會傳送到不存在的 API 資源路徑。
不正確使用公開 DNS 名稱調用私有 API"x-amzn-errortype" = "ForbiddenException"「禁止」不正確使用公開 DNS 名稱從 Amazon Virtual Private Cloud (Amazon VPC) 中調用私有 API。例如:請求缺少**「Host」** 或**「x-apigw-api-id」**標頭。<br><br>如需詳細資訊,請參閱使用端點特定的公用 DNS 主機名稱調用私有 API
使用預設的 execute-api 端點調用具有自訂網域名稱的 REST API"x-amzn-errortype" = "ForbiddenException"「禁止」在停用預設端點後,呼叫者使用預設的 execute-api 端點來調用 REST API。<br><br>如需詳細資訊,請參閱停用 REST API 的預設端點
使用無效的用戶端憑證調用需要相互 Transport Layer Security (TLS) 的 API 閘道自訂網域名稱。"x-amzn-errortype" = "ForbiddenException"「禁止」API 請求中顯示的用戶端憑證不是由自訂網域名稱的信任存放區發出,或者無效。<br><br>如需詳細資訊,請參閱如何從需要相互 TLS 的 API 閘道自訂網域名稱疑難排解 HTTP 403 禁止錯誤?
在沒有基本路徑映射的情況下調用自訂網域名稱"x-amzn-errortype" = "ForbiddenException"「禁止」呼叫者會調用自訂網域,而不會將基本路徑映射到 API。<br><br>如需詳細資訊,請參閱設定 REST API 的自訂網域名稱
當網域 URL 包含階段時,調用啟用自訂網域的 API"x-amzn-errortype" = "MissingAuthenticationTokenException"「缺少驗證權杖」API 映射會指定 API、階段,還可以選擇用於映射的路徑。因此,當 API 的階段映射到自訂網域時,您不再需要在 URL 中包含該階段。<br><br>如需詳細資訊,請參閱使用 REST API 的 API 映射
請求 URL 中的階段無效"x-amzn-errortype" = "ForbiddenException"「禁止」呼叫者的請求 URL 包含不存在的階段。確認階段是否存在,以及請求 URL 的拼寫。<br><br>如需詳細資訊,請參閱在 Amazon API Gateway 中調用 REST API

解決方法

考慮錯誤的來源

如果 403 錯誤是從其他資源報告通報,則可能是其他原因導致錯誤。例如:

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

識別造成錯誤的原因

如果您尚未這樣做,請設定 API 的 Amazon CloudWatch 存取記錄功能。然後,在 CloudWatch 中檢視 API 的執行記錄,以判斷要求是否到達 API。

注意:HTTP API 不支援執行記錄。若要疑難排解由需要相互 TLS 並調用 HTTP API 的自訂網域名稱傳回的 403 錯誤,您必須執行下列操作:

1.    為您的自訂網域名稱建立新的 API 映射,以調用僅用於測試的 REST API。

2.    檢視您 REST API 在 CloudWatch 中的執行日誌,識別造成錯誤的原因。

3.    識別並解決錯誤後,將您自訂網域名稱的 API 映射重新路由至 HTTP API。

確認 API 定義中具備要求的資源

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

使用 API Gateway 主控台AWS CLI 驗證下列項目:

  • API 採用最新的 API 定義](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-deploy-api.html)部署[。
  • 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,請確認下列項目。

驗證介面端點的 DNS 設定是否已根據您使用的 API 類型正確設定。

請記住以下幾點:

  • 若要從 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 進行疑難排解?