亚马逊AWS官方博客

从托管服务 Amazon API Gateway 集成 Amazon VPC 内部私有服务

专题摘要

亚马逊云科技托管服务访问用户 Amazon VPC 内部私有资源,通常发生在计算或接口类的托管服务访问用户 VPC 内部资源的情形下。本文主要讲述,在微服务 API 的架构下,如何利用 Amazon API Gateway 管理 API,并私有集成 VPC 中的负载均衡等资源,将访问请求分发给后端的服务。

本文是“在亚马逊云科技上围绕 Amazon VPC 打造内外兼修的合适架构”系列主题的第五部分,本系列专题由如下几部分组成:

场景介绍

在亚马逊云科技,Amazon API Gateway 可以和后端的多种服务等进行集成,例如 Amazon Lambda,Amazon S3,Amazon Kinesis,以及 VPC 内部的资源 NLB(Network Load Balancer)/ALB(Application Load Balancer)等,通过这种集成,可以将应用程序公开给客户或其他系统进行调用。Amazon API Gateway 不仅仅可以对 API 进行管理和流量控制,还能够实现多阶段部署。

公有的 API Gateway 支持 REST API, HTTP API 和 WebSocket API 三种类型。WebSocket API 支持客户端和服务器端的双向通信。而 REST API 和 HTTP API 后端可以和 VPC 中面向互联网的公有的负载均衡进行 HTTP 协议集成,但是这种集成方式,需要将负载均衡直接面对互联网,因而面临网络安全的风险。而通过 VPC Link 私有集成的方式,API Gateway 可以将流量私有地传输给后端的 VPC 中私有的负载均衡,提升网络安全性。

在 API Gateway 中可以创建两种类型的 VPC Link,VPC link for REST APIs 和  VPC link for HTTP APIs。VPC Link 将 API Gateway 路由连接到 VPC 内的 HTTP/HTTPS 私有资源,方便 API Gateway 和这些 VPC 中资源的私有集成。

VPC  Link 借助 Amazon Hyperplane 网络虚拟化平台,支持 API Gateway 这一托管服务运行所在的亚马逊云科技管理的 VPC 和客户 VPC 之间的连接和路由,该平台也是实现 Amazon PrivateLink 的基础。 VPC Link for HTTP APIs 直接基于 Amazon Hyperplane 实现,而 VPC link for REST APIs 则是基于 PrivateLink 实现,间接依托于 Amazon Hyperplane 服务。

实现机制不同,也决定了这两个服务和 VPC 中的 NLB,ALB 甚至是 Amazon Cloud Map 进行私有集成的灵活性不同。

VPC links for REST API

VPC links for REST APIs 基于 PrivateLink 实现,因而只能和后端 VPC 中的 NLB 进行集成,不能和 ALB 直接集成。因此,在某些情况下,需要通过 NLB 把访问流量传给 ALB 或者 EC2 目标组,如下图所示:

由于基于 Amazon PrivateLink 实现,目标端(ALB 或 Target Group)接收到的是  NLB 的专用 IP 地址,而不是服务访问者的 IP 地址。由于 NLB 不可以配置安全组,因而在配置后面集成的 ALB 或者 Target Group 的安全组的时候,需要配置 NLB 的 IP 地址或 VPC 的 CIDR 块,而不是实际服务访问者的 IP 范围。示例 ALB 的安全组“alb-sg”的设置如下:

Security Group “alb-sg” Inbound Rule
Protocol Port range Source Description
HTTP 80 VPC CIDR / NLB IP 允许来自 NLB 在指定端口的入站流量。可以直接配置 NLB 所在 VPC 的 CIDR,或者直接配置 NLB 在每个子网中的 CIDR 或者 NLB 的 IP。
HTTP 8080 VPC CIDR / NLB IP 指定端口的健康检查入站流量。可以直接配置 NLB 所在 VPC 的 CIDR,或者直接配置 NLB 在每个子网中的 CIDR 或者 NLB 的 IP。
Security Group “alb-sg” Outbound Rule
Protocol Port range Destination Description
HTTP 80 target-a-sg 允许在指定端口访问目标组 target-a 的出站流量。
HTTP 8080 target-a-sg 允许在指定端口访问目标组 target-a 的健康检查出站流量。

安全组 target-a-sg 的示例规则配置如下表所示:

Security Group “target-a-sg” Inbound Rule
Protocol Port range Source Description
HTTP 80 alb-sg 允许来自 ALB 在指定端口的入站流量。
HTTP 8080 alb-sg 允许来自 ALB 在指定端口的健康检查入站流量。

REST API 类型的 API Gateway 可以和亚马逊云科技的应用防火墙 Amazon WAF 天然集成,而 HTTP API 却不可以,这是 REST API 相对于 HTTP API 的一个比较优势。

VPC links for HTTP API

HTTP API 是最新类型的 API Gateway,比 REST API 成本更低,速度更快。HTTP API 类型的 API Gateway 可以和各种私有的 HTTP/HTTPS 服务进行集成,不仅仅包括 NLB,还可以是 ALB 以及 EC2 目标组等。

HTTP API 类型的 VPC Link 是基于 Hyperplane 的 VPC-to-VPC NAT 实现,而不是传统的 Private Link,因而不需要创建 VPC 端点服务(VPC Endpoint Service)。因此,后端集成的选项不仅限于 NLB,甚至可以直接集成 ALB 或者 Amazon Cloud Map 服务,这样的配置具有更大的灵活性和可扩展性。

相比之下,REST API 类型的 VPC Link 只能与单个 NLB 关联,如果需要配置多个后端端点,需要考虑在 NLB 上使用多个侦听器,与不同的目标组相关联。而 HTTP API 类型的 VPC Link,单个 VPC 连接无需额外配置即可与多个后端端点相关联。另外,基于 HTTP API 类型的 VPC Link,更加方便容器化应用程序直接使用 ALB 来做到第 7 层网络负载均衡,并实现身份验证和授权等其他功能。如下图所示:

HTTP API 类型的 API Gateway 类似于两个 VPC 之间的隧道。这个隧道是基于在 API Gateway 所在的 VPC 和客户 VPC 两端生成由 Amazon Hyperplane 管理的弹性网络接口的挂载点构建的。 API Gateway 直接连接这些弹性网络接口,可以直接从自己的 VPC 访问服务提供者 VPC 内的资源,因此可以通过配置该网络弹性接口的安全组来控制其网络的流量。

上图中安全组”httpapi-sg”的规则配置如下表所示:

Security Group “httpapi-sg” Outbound Rule
Protocol Port range Destination Description
HTTP 80 alb-sg 允许在指定端口访问 ALB 的出站访问流量

安全组“alb-sg”的规则配置如下表所示:

Security Group “alb-sg” Inbound Rule
Protocol Port range Source Description
HTTP 80 httpapi-sg 允许来自 HTTP API Gateway 所配置的 VPC Link 所在的 ENI 在指定端口的入站流量
Security Group “alb-sg” Outbound Rule
Protocol Port range Destination Description
HTTP 80 target-alb-sg 允许在指定端口访问目标组 target-alb 的出站流量。
HTTP 8080 target-alb-sg 允许在指定端口访问目标组 target-alb 的健康检查出站流量。

安全组 target-alb-sg 的规则配置如下表所示:

Security Group “target-alb-sg” Inbound Rule
Protocol Port range Source Description
HTTP 80 alb-sg 允许来自 ALB 在指定端口的入站流量。
HTTP 80 alb-sg 允许来自 ALB 在指定端口的健康检查入站流量。

结论和总结

本文中,我们对两种不同的 API Gateway 在私有集成 VPC 中的 HTTP 服务时,所建的两种 VPC link 进行了对比和总结,在实际应用场景中,需要考虑多种因素进行选取。

REST API 类型的 API Gateway 和客户 VPC 中的私有资源集成 VPC Link,其后台是通过在 API Gateway 所在的亚马逊云科技管理的 VPC 中建立 VPC 终端节点,通过 Private Link 来访问基于 NLB 的终端节点服务来实现的。这个 API Gateway 所在的 VPC 中的终端节点会在建立 VPC Link 的时候被隐式自动创建。 这种方式和客户 VPC 内部资源访问外部亚马逊云科技托管服务,建立客户 VPC 终端节点技术完全一致,但方向正好相反。

而 HTTP API 类型 API Gateway 的 VPC Link 实际上和前面章节中讲到的托管服务 Amazon Lambda 和 Amazon Glue 访问 VPC 中的资源更加类似,通过在客户 VPC 中生成弹性网络访问接口 ENI,和 VPC 中的资源进行交互集成。

REST API 还可以支持私有部署,在这种情况下,REST API 中的接口只能被其他 VPC 通过建立 VPC 终端节点进行访问,而 HTTP API 目前还不支持私有部署。

另外,相对于 HTTP API,REST API 支持比 HTTP API 更多的功能,诸如 API 密钥、客户端请求限制、请求验证、和 Amazon WAF 原生集成等。而 HTTP API 的设计的功能更少,价格也相对更低。

在对安全要求比较高,原生的 Amazon WAF 应用防火墙成为必选的情况下,可以考虑 REST API。通过基于 Private Link 的 VPC Link 连接 VPC 中的 NLB。如果需要在网络 7 层的负载均衡,可以在 NLB 后面接入 ALB,并将流量进一步转发给 EC2 的 Target Group,但这样的调用链路会导致网络效率变低。

参考链接

Introducing Amazon API Gateway Private Endpoints

https://aws.amazon.com/blogs/compute/introducing-amazon-api-gateway-private-endpoints/

Understanding VPC links in Amazon API Gateway private integrations

https://aws.amazon.com/blogs/compute/understanding-vpc-links-in-amazon-api-gateway-private-integrations/

Choosing between REST APIs and HTTP APIs

https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-vs-rest.html

Tutorial: Building an HTTP API with a private integration to an Amazon ECS service

https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-private-integration.html

Tutorial: Build a REST API with API Gateway private integration

https://docs.aws.amazon.com/apigateway/latest/developerguide/getting-started-with-private-integration.html

Target groups for your Network Load Balancer

https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-target-groups.html

Security groups for your Application Load Balancer

https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-update-security-groups.html

本篇作者

张亮

亚马逊云科技解决方案架构师,有近 17 年的 IT 从业经验,曾就职于 DXC,Misys 等公司。在多个行业的企业应用开发、架构设计及建设方面有丰富的实践经验。目前主要负责合作伙伴的架构咨询和方案设计,致力于亚马逊云科技云服务在国内的应用及推广。