

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用私有端点和应用程序负载均衡器在内部网站上部署 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*

## Summary
<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 时，这可能会破坏其他内部站点。最后，此模式可以帮助您满足使用无法通过 Internet 访问的私有 API 和自定义域名的组织要求。

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

**先决条件**
+ 一个有效的 Amazon Web Services account
+ 用于网站和 API 的 Server Name Indication (SNI) 证书
+ 从本地环境到使用 AWS Direct Connect 或 AWS Site-to-Site VPN 设置的 AWS 账户的连接
+ 带有相应域的[私有托管区](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zones-private.html)（例如 domain.com），该域从本地网络解析，并将 DNS 查询转发到 Route 53
+ 可从本地网络访问的可路由私有子网

**限制**

有关负载均衡器、规则和其他资源的配额（以前称为限制）的更多信息，请参阅 Elastic Load Balancing 文档中的[应用程序负载均衡器配额](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-limits.html)。

## 架构
<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
+ 应用程序负载均衡器
+ AWS Certificate Manager
+ AWS PrivateLink

**目标架构**

下图显示了如何在 VPC 中部署应用程序负载均衡器，该均衡器根据应用程序负载均衡器侦听器规则将 Web 流量引导到网站目标组或 API Gateway 目标组。API Gateway 目标组是 API Gateway 中 VPC 端点的 IP 地址列表。API Gateway 配置为通过其资源策略将 API 设为私有。该策略拒绝所有不是来自特定 VPC 端点的调用。API 网关中的自定义域名已更新为对 API 及其阶段使用 api.domain.com。添加了应用程序负载均衡器规则，以根据主机名路由流量。

![\[使用应用程序负载均衡器侦听器规则来定向 Web 流量的架构。\]](http://docs.aws.amazon.com/zh_cn/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。然后，请求被解析至可路由私有子网的内部应用程序负载均衡器。SSL 在 ui.domain.com 和 api.domain.com 的应用程序负载均衡器处终止。

1. 在应用程序负载均衡器上配置的侦听器规则将检查主机标头。

   a. 如果主机标头为 api.domain.com，则请求将转发到 API Gateway 目标组。应用程序负载均衡器通过端口 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 地址。API 调用[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)返回 IP 地址和安全组，这些地址和安全组可用于创建 API 目标 IP 地址组。

## 工具
<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) 可帮助您创建、发布、维护、监控和保护任何规模的 RES WebSocket APIs T、HTTP。
+ [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) 是一种可用性高、可扩展性强的 DNS Web 服务。
+ [AWS Certifice Manager (ACM)](https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html) 可帮助您创建、存储和续订 X.509 公有和私有 SSL/TLS X.509 证书和密钥，以保护您的 AWS 网站和应用程序。
+ [AWS Cloud Development Kit（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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 SNI 证书，并将该证书导入 ACM。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在 API Gateway 中创建接口 VPC 端点。 | 要创建接口 VPC 端点，请按照 Amazon Virtual Private Cloud (Amazon VPC) 文档中的[使用接口 VPC 端点访问 Amazon Web Services](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html) 中的说明进行操作。 | 云管理员 | 

### 配置应用程序负载均衡器。
<a name="configure-the-application-load-balancer"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 为应用程序创建目标组。 | 为应用程序的 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_cn/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_cn/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_cn/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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建私有托管区。 | 为 domain.com [创建私有托管区](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zone-private-creating.html)。 | 云管理员 | 
| 创建域记录。 | 对于以下，[创建 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_cn/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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建和配置私有 API 端点。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/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_cn/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/)
+ [应用程序负载均衡器](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/)