

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用私有端點和 Application Load Balancer 在內部網站上部署 Amazon API Gateway API
<a name="deploy-an-amazon-api-gateway-api-on-an-internal-website-using-private-endpoints-and-an-application-load-balancer"></a>

*Saurabh Kothari，Amazon Web Services*

## 總結
<a name="deploy-an-amazon-api-gateway-api-on-an-internal-website-using-private-endpoints-and-an-application-load-balancer-summary"></a>

此模式說明如何在可從內部部署網路存取的內部網站上部署 Amazon API Gateway API。您學習使用以私有端點、Application Load Balancer、AWS PrivateLink 和 Amazon Route 53 設計的架構，為私有 API 建立自訂網域名稱。此架構可防止使用自訂網域名稱和代理伺服器在 API 上協助以網域為基礎的路由的意外後果。例如，如果您在不可路由的子網路中部署虛擬私有雲端 (VPC) 端點，您的網路就無法連線到 API Gateway。常見的解決方案是使用自訂網域名稱，然後在可路由子網路中部署 API，但這可能會在代理組態將流量 (`execute-api.{region}.vpce.amazonaws.com`) 傳遞至 AWS Direct Connect 時破壞其他內部網站。最後，此模式可協助您滿足使用無法從網際網路和自訂網域名稱連線的私有 API 的組織需求。

## 先決條件和限制
<a name="deploy-an-amazon-api-gateway-api-on-an-internal-website-using-private-endpoints-and-an-application-load-balancer-prereqs"></a>

**先決條件**
+ 作用中的 AWS 帳戶
+ 網站和 API 的伺服器名稱指示 (SNI) 憑證
+ 使用 AWS Direct Connect 或 AWS Site-to-Site VPN，從內部部署環境連線到已設定的 AWS 帳戶
+ 具有對應網域 （例如 domain.com) 的[私有託管區域](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zones-private.html)，已從內部部署網路解析，並將 DNS 查詢轉送至 Route 53
+ 可從內部部署網路連線的可路由私有子網路

**限制**

如需負載平衡器、規則和其他資源配額 （先前稱為限制） 的詳細資訊，請參閱 Elastic Load Balancing 文件中的 [Application Load Balancer 配額](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-limits.html)。

## Architecture
<a name="deploy-an-amazon-api-gateway-api-on-an-internal-website-using-private-endpoints-and-an-application-load-balancer-architecture"></a>

**技術堆疊**
+ Amazon API Gateway
+ Amazon Route 53
+ Application Load Balancer
+ AWS Certificate Manager
+ AWS PrivateLink

**目標架構**

下圖顯示 Application Load Balancer 如何部署在根據 Application Load Balancer 接聽程式規則將 Web 流量導向網站目標群組或 API Gateway 目標群組的 VPC 中。API Gateway 目標群組是 API Gateway 中 VPC 端點的 IP 地址清單。API Gateway 已設定為使用其資源政策讓 API 私有。此政策會拒絕來自特定 VPC 端點的所有呼叫。API 閘道中的自訂網域名稱會更新為針對 API 及其階段使用 api.domain.com。Application Load Balancer 規則會新增，以根據主機名稱路由流量。

![\[使用 Application Load Balancer 接聽程式規則來引導 Web 流量的架構。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/83145062-4535-4ad0-8947-4ea8950cd174/images/12715186-26ea-4123-b9ef-e3105a934ff3.png)


該圖顯示以下工作流程：

1. 內部部署網路的使用者嘗試存取內部網站。請求會傳送至 ui.domain.com 和 api.domain.com。然後，請求會解析為可路由私有子網路的內部 Application Load Balancer。SSL 會在 ui.domain.com 和 api.domain.com 的 Application Load Balancer 中終止。

1. 在 Application Load Balancer 上設定的接聽程式規則會檢查主機標頭。

   a. 如果主機標頭是 api.domain.com，請求會轉送到 API Gateway 目標群組。Application Load Balancer 透過連接埠 443 啟動 API Gateway 的新連線。

   b. 如果主機標頭是 ui.domain.com，請求會轉送到網站目標群組。

1. 當請求到達 API Gateway 時，在 API Gateway 中設定的自訂網域映射會決定主機名稱和要執行的 API。

**自動化和擴展**

此模式中的步驟可以使用 AWS CloudFormation 或 AWS Cloud Development Kit (AWS CDK) 自動化。若要設定 API Gateway 呼叫的目標群組，您必須使用自訂資源來擷取 VPC 端點的 IP 地址。[describe-vpc-endpoints](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/describe-vpc-endpoints.html) 和 [describe-network-interfaces](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/describe-network-interfaces.html) 的 API 呼叫會傳回 IP 地址和安全群組，可用於建立 IP 地址的 API 目標群組。

## 工具
<a name="deploy-an-amazon-api-gateway-api-on-an-internal-website-using-private-endpoints-and-an-application-load-balancer-tools"></a>
+ [Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) 可協助您建立、發佈、維護、監控和保護任何規模的 REST、HTTP 和 WebSocket APIs。
+ [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) 是一種可用性高、可擴展性強的 DNS Web 服務。
+ [AWS Certificate Manager (ACM)](https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html) 可協助您建立、存放和續約公有和私有 SSL/TLS X.509 憑證和金鑰，以保護 AWS 網站和應用程式。
+ [AWS 雲端開發套件 (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) 是一種軟體開發架構，可協助您在程式碼中定義和佈建 AWS 雲端基礎設施。
+ [AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/what-is-privatelink.html) 可協助您建立從 VPCs 到 VPC 外部服務的單向私有連線。

## 史詩
<a name="deploy-an-amazon-api-gateway-api-on-an-internal-website-using-private-endpoints-and-an-application-load-balancer-epics"></a>

### 建立 SNI 憑證
<a name="create-an-sni-certificate"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 SNI 憑證並將憑證匯入 ACM。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-an-amazon-api-gateway-api-on-an-internal-website-using-private-endpoints-and-an-application-load-balancer.html) | 網路管理員 | 

### 在不可路由的私有子網路中部署 VPC 端點
<a name="deploy-a-vpc-endpoint-in-a-non-routable-private-subnet"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 在 API Gateway 中建立介面 VPC 端點。 | 若要建立介面 VPC 端點，請遵循 Amazon Virtual Private Cloud (Amazon VPC) 文件中的[使用介面 VPC 端點存取 AWS 服務](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html)的指示。 | 雲端管理員 | 

### 設定 Application Load Balancer
<a name="configure-the-application-load-balancer"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 為您的應用程式建立目標群組。 | 為應用程式的 UI 資源[建立目標群組](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-target-group.html)。 | 雲端管理員 | 
| 建立 API Gateway 端點的目標群組。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-an-amazon-api-gateway-api-on-an-internal-website-using-private-endpoints-and-an-application-load-balancer.html) | 雲端管理員 | 
| 建立 Application Load Balancer。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-an-amazon-api-gateway-api-on-an-internal-website-using-private-endpoints-and-an-application-load-balancer.html) | 雲端管理員 | 
| 建立接聽程式規則。 | 建立[接聽程式規則](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-listeners.html#listener-rules)以執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-an-amazon-api-gateway-api-on-an-internal-website-using-private-endpoints-and-an-application-load-balancer.html) | 雲端管理員 | 

### 設定 Route 53
<a name="configure-route-53"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立私有託管區域。 | [為 建立私有託管區域](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zone-private-creating.html)。 domain.com | 雲端管理員 | 
| 建立網域記錄。 | 建立下列項目的 [CNAME 記錄](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-creating.html)：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-an-amazon-api-gateway-api-on-an-internal-website-using-private-endpoints-and-an-application-load-balancer.html) | 雲端管理員 | 

### 在 API Gateway 中建立私有 API 端點
<a name="create-a-private-api-endpoint-in-api-gateway"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立和設定私有 API 端點。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-an-amazon-api-gateway-api-on-an-internal-website-using-private-endpoints-and-an-application-load-balancer.html) | 應用程式開發人員、雲端管理員 | 
| 建立自訂網域名稱。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-an-amazon-api-gateway-api-on-an-internal-website-using-private-endpoints-and-an-application-load-balancer.html) | 雲端管理員 | 

## 相關資源
<a name="deploy-an-amazon-api-gateway-api-on-an-internal-website-using-private-endpoints-and-an-application-load-balancer-resources"></a>
+ [Amazon API Gateway](https://aws.amazon.com/api-gateway/)
+ [Amazon Route 53](https://aws.amazon.com/route53/)
+ [Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/)
+ [AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/what-is-privatelink.html)
+ [AWS Certificate Manager](https://aws.amazon.com/certificate-manager/)