跳至內容

為什麼我從 VPC 嘗試連線到 API Gateway 公共 API 時,會收到 HTTP「403 Forbidden」錯誤?

2 分的閱讀內容
0

當我從 Amazon Virtual Private Cloud (Amazon VPC) 呼叫 Amazon API Gateway 公共 API 時,出現 HTTP「403 Forbidden」錯誤。

簡短說明

由於 Amazon VPC 介面端點只會將流量路由至私有 API,因此當您嘗試存取 API Gateway 公共 API 時,可能會出現 HTTP「403 Forbidden」錯誤。

當您從啟用了私有 DNS 名稱的 Amazon VPC 存取 API Gateway 公共 API 時,就會發生 HTTP「403 Forbidden」錯誤。若您啟用了私有 DNS 名稱,則來自 Amazon VPC 至 API Gateway 的所有請求都會解析至介面 VPC 端點。

但您無法使用介面 VPC 端點連線至公共 API,因為該端點的私有 DNS 名稱格式為 *.execute-api.{region}.amazonaws.com。其中的 * 字元是 API ID 的預留位置。此格式同時符合公共與私有 API 的 API Gateway 預設調用網址。

啟用私有 DNS 名稱後,以 *.execute-api.{region}.amazonaws.com 格式呼叫 API Gateway API 的網址會解析至介面 VPC 端點的私有 IP 位址。這個設定會使所有傳輸到 API Gateway 的流量 (無論公共或私有 API) 都透過介面 VPC 端點傳送。

當您使用 AWS Direct Connect 調用預設 execute-api 網址,從內部部署網路連線至私有 API 時,也會出現「403 Forbidden」錯誤。

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。

檢查您的 Amazon VPC 是否使用私有 DNS 設定

若要解決 HTTP「403 Forbidden」錯誤,請先判斷您的 Amazon VPC 是使用私有還是公共 DNS 設定。您可以使用 AWS CLI 或 Amazon VPC 主控台。

AWS CLI

執行以下 describe-vpc-endpoints 命令:

export VPC_ID=YOUR_VPC_ID  
export REGION=YOUR_REGION  
aws ec2 describe-vpc-endpoints \  
  --filters "Name=vpc-id,Values=${VPC_ID}" \  
            "Name=service-name,Values=com.amazonaws.${REGION}.execute-api" \  
  --query 'Amazon VPC endpointndpoints[].{Name:Tags[?Key==`Name`].Value|[0],Amazon VPC endpointndpointId:Amazon VPC endpointndpointId,PrivateDnsEnabled:PrivateDnsEnabled}' \  
  --output table

**注意:**請將 YOUR_VPC_ID 替換為您的 VPC ID,並將 YOUR_REGION 替換為您的 AWS 區域。

Amazon VPC 主控台

檢查您是否在介面 VPC 端點組態中啟用了私有 DNS 名稱。同時,檢查 VPC 中是否存在用於存取私有 REST API 的介面 VPC 端點。如果存在介面 VPC 端點,請檢查是否啟用了 DNS 屬性。

在啟用私有 DNS 名稱的情況下連線至公共 API

若您已啟用私有 DNS,請設定邊緣最佳化自訂網域名稱或區域型自訂網域名稱,以連線至您的公共 API。接著,您可以使用自訂網域名稱 (例如 api.example.com) 來調用 API Gateway 公共 API。而私有 REST API 的連線將持續透過私有 REST API 端點運作。

如果用戶端從內部部署網路連線,請設定 Amazon Route 53 Resolver 傳入端點。若要使用 execute-api 調用網址,請將所有來自內部部署網路的私有 DNS 查詢轉發至傳入端點。

**注意:**您的 VPC 資源必須具有網際網路連線,才能連線到您的公共 API。

在關閉私有 DNS 名稱的情況下連線至公共 API

若要允許傳出流量至公共 API,請使用 VPC 的安全群組。同時,修改附加於您 API 的資源政策,以允許從 VPC 存取。

若您的 VPC 有權存取公共 REST API,請使用預設 execute-api 命令連線至公共 REST API。您也可以使用自訂網域名稱連線至公共 REST API。如需相關資訊,請參閱在 API Gateway 中控制和管理 REST API 的存取。

若您關閉介面 VPC 端點的私有 DNS 名稱,則預設 execute-api 調用網址將無法再連線至私有 REST API。

若要調用私有 REST API,請採取以下其中一種作法:

  • 使用以 Amazon VPC 端點為 DNS 的主機標頭,例如:

    curl -H "Host: {your-api-id}.execute-api.{region}.amazonaws.com" \  
         https://Amazon VPC endpoint-xxxxx-xxxxx.execute-api.{region}.Amazon VPC endpoint.amazonaws.com/stage/path
  • 為 execute-api.{region}.amazonaws.com 建立私有託管區域。在私有託管區域中,為您的 API 識別碼新增 A 記錄。將 A 記錄指向介面 VPC 端點的 IP 位址,使您可以使用私有 REST API 的預設 execute-api 調用網址。

變更介面 VPC 端點的私有 DNS 屬性

您可以變更介面端點的私有 DNS 屬性。此變更會影響 API 階段網址解析至介面 VPC 端點的私有 IP 位址的方式。此變更也會影響您如何從 VPC 連線至私有 API 及公共 API。如需更多資訊,請參閱 VPC 的 DNS 屬性。

相關資訊

使用介面 VPC 端點存取 AWS 服務