基于 Amazon API Gateway 的跨账号跨网络的私有 API 集成
一、背景介绍
本文主要讨论的问题是在使用 API ,通过 、 API 来完成私有网络环境下的跨账号或跨网络的 API 集成。API 管理平台会被设计在单独的账号中(亚马逊云科技提供的是多租户的环境),因为客观上不同业务系统的存在,都需要和 API 管理平台集成,所以API管理平台很有可能会连接不同网络环境,可能是亚马逊云科技提供的其他的区域、线下的环境、或是其他云的环境。
亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库!
在讨论正题之前,我们先来谈论下 API 管理平台。API 是现代应用开发的一个典型部分。它们使应用程序、系统和服务能够有效沟通,打破了底层技术的孤岛。为了以有效和可扩展的方式最大限度地利用这些 API,API 管理是必须的。利用 API 管理平台可以使企业能够以安全、简便和高效的方式规划、设计、测试、发布、运营、安全和版本控制其 API,从而获得企业所能提供的数据和服务的最大潜力。
API 是一种完全托管的服务,可以帮助开发人员轻松创建、发布、维护、监控和保护任意规模的 API。API 充当应用程序的前门,可从您的后端服务访问数据、业务逻辑或功能。使用 API ,您可以创建 API、Http API 和 API,以便实现实时双向通信应用程序。API 支持容器化和无服务器工作负载,以及 Web 应用程序。
API 负责管理所有任务,涉及接受和处理成千上万个并发 API 调用,包括流量管理、CORS 支持、授权和访问控制、限制、监控,以及 API 版本管理。API 没有最低费用或启动成本。您只需为您收到的 API 调用和传出的数据量付费。
我们观察到不同的客户都在评估或是部署 API 管理平台, API 作为一个云原生无服务器架构的 API 管理平台,将能很好的满足您对 API 管理的需求。
另外,基于 接口规范实现的应用程序可以自动生成方法、参数和模型的文档。这有助于保持文档、客户端库和源代码的同步。并且 规范是不分语言的。通过 的声明性资源规范,客户可以理解和消费服务,而无需了解服务器的实现或访问服务器代码。API 也支持 v2.0 和 v3.0 的规范。
二、概念介绍
当您在使用 API 的过程中,有一些关键的概念和定义,是达成 API 主要功能的前置条件。
(集成),这个是 API 实现其功能的核心概念。不论是 API、HTTP API还是 API,都是通过 (集成) 这个关键动作将 API 暴露出的供访问的接口和后端的具体实现相连接。这里的后端可能是 函数、其他 服务、或是其他的 HTTP 资源、亦或是置放于 VPC 内的私有资源或内部网络中的资源。只是,REST API 由资源和方法组成;HTTP API 由路由和资源组成; API 也是由路由和路由键组成;
REST API 由资源和方法组成。资源是一种逻辑实体,应用程序可以通过资源路径来访问资源。方法与您的 API 用户提交的 REST API 请求以及返回给该用户的相应响应对应。
HTTP API 由路由和资源组成。将直接传入 API 请求路由到后端资源。路由包含两部分:HTTP 方法和资源路径,例如,GET /pets。您可以为路由定义特定的 HTTP 方法。或者,您可以使用 ANY 方法匹配尚未为资源定义的所有方法。您可以创建一个 $ 路由,用作与任何其他路由不匹配的请求的 “捕获全部” 方法。
API 由路由和路由键组成。与接收和响应请求的 REST API 不同, API 支持客户端应用程序与后端之间的双向通信。后端可以向连接的客户端发送回调消息。
: 正如上面描述的那样, (集成)是 API 中的一个关键动作。 强调的是集成置放于 VPC 内的私有资源或内部网络中的资源。官方文档介绍:
设置 API 私有集成 - API
VPC Link: 通过 VPC 链接 (VPC Link),您可以创建私有集成,将 HTTP API 路由连接到 VPC 中的私有资源,例如 / Load 或基于 ECS 容器的应用程序。私有集成使用 VPC Link 来封装 API 与目标 VPC 资源之间的连接。您可以跨不同的路由和 API 重复使用 VPC 链接。创建 VPC Link时,API 在您的账户中为 VPC 链接创建和管理弹性网络接口。
其实 VPC Link 就是为了实现 的一个技术组件。
API: 指的是 API 暴露的 API 只能在私有网络内部访问,不能从公网访问。
以上的 , API 和 VPC Link,这里还有一个博客文章,可供大家学习参考: VPC links in API | AWS Blog
Proxy (代理集成): 借助无所不包的代理资源 {proxy+} 和 REST/HTTP 方法,名为 ANY,也就能匹配任何 REST/HTTP 方法,您可以使用代理集成来创建一个方法为 ANY 的 API。该方法会暴露后端的一整套可访问的 HTTP 资源和操作。当后端 Web 服务器开放更多资源以供公开访问时,客户端可以通过这同一个 API 来访问新资源。
: 是一项具有高可用性的可扩展技术,它支持将您的 VPC 私密地连接到支持的亚马逊云科技服务、由其他 账户托管的服务(通过VPC 终端节点服务来实现)以及支持亚马逊云科技 合作伙伴服务。您无需使用互联网网关、NAT 设备、公有 IP 地址、 连接或 Site-to-Site VPN 连接,就能与该服务通信。
VPC (VPC 终端节点服务):您 VPC 中自己的应用程序或服务。
VPC (VPC 终端节点):在 VPC 中可让您私密地连接到VPC 终端节点服务的入口点。
三、架构图和问题定义
1) 架构图介绍
1.1)因为在真实的场景中,API 管理平台会被设计在单独的账号中(亚马逊云科技提供的是多租户的环境),又因为客观上不同业务系统的存在,都需要和API管理平台集成,所以 API 管理平台很有可能会连接不同网络环境,可能是亚马逊云科技提供的其他的区域、线下的环境、或是其他云的环境。因此上面的架构图设计了跨账号、跨不同网络的环境。
1.2)这里设定 3 个云上的账号,分别是 API- , 和 。为了配置方便,这里 和 API- 在同一个账号中相同的 VPC 中。同时还有一个 Other Place 来表征可能是亚马逊云科技提供的其他的区域、线下的环境、或是其他云的环境。
2) 问题定义
如上面的架构图,本文主要讨论的问题是在使用 API 情况下,通过 、 API、VPC Link 以及 VPC 、VPC 。来完成私有网络环境下的跨账号或跨网络的 API 集成。
四、具体配置
配置主要分两块,一是和跨账号的内部应用 API 进行集成,二是通过和内部网络资源集成。
1. 和跨账号的内部应用API进行集成
1) 配置接口终端节点服务 (VPC )
登陆到 (01477*******),在 EC2 中选择 Load ,查看通过 EKS 创建好的 (以 NLB 的形式出现),这里相当于架构图上的紫色 1 和 2
参考官方手册创建由 提供支持的服务 - Cloud
完成 “接口终端节点服务” 创建,这里相当于架构图上的紫色 3。
选择服务 –VPC 中的 ,然后点击
选择之前 EKS 创建好的 (以 NLB 暴露的)
其他选项保持默认。
配置端点服务 - Cloud
在创建终端节点服务配置后,您可以控制哪些服务使用者能够创建连接您服务的接口终端节点。
输入允许访问此接口终端节点服务的 账号中的 IAM user 或 role 的 ARN,可以参考如下官方手册:
配置端点服务 - Cloud
创建好的 “接口终端节点服务” 如下,复制 name, 接下来会用。
2) 配置接口终端节点 VPC
登陆到 API- (84234*******),选择服务 –VPC 中的 ,然后点击 ,输入 Name 和之前复制的 name,并
。这里相当于架构图上的紫色 4 和 5 。
这里选择 VPC 和 时需要注意,因为会分别在选定的子网中创建一个端点网络接口 (ENI)。一个端点网络接口会从你的子网的IP地址范围内分配一个私有 IP 地址,并保持这个 IP 地址,直到接口端点被删除。
注意创建好的在子网中的网络接口 (ENI),记录对应的子网和 ip 地址。
3) 接受终端节点连接请求 ( )
登陆到 (01477*******),在 VPC 中选择 , 选择之前创建的 。在 中选择 。
4) 创建供 VPC link 使用的 NLB
登陆到 API- (84234*******),选择服务 –EC2 中的 , 然后选择 IP , 配置如下,其他保持默认。这里相当于架构图上的紫色 6。
在下一步中 选择对应的 VPC,IP 地址输入上一步记录下来的 IP 地址。
登陆到 API- (84234*******), 选择服务 –EC2 中的 Load , 然后点击 Load 处的 。选择 。
这里选择对应的 VPC 和子网。
创建完成后,记录 NLB DNS name( )
5) 创建供 VPC Link
登陆到 API- (84234*******),选择服务 –API 中的 VPC links, 然后点击 选择 VPC link for REST APIs, 在点击 。这里相当于架构图上的紫色 6。
在 NLB 中选择刚创建的 NLB:
注意创建好的 VPC Link 的状态是 , 同时记录 VPC Link ID是 nlb-vpc-link(), 接下来需要使用。
6) 为创建 API 而准备针对 API 的 VPC
这里先解释一下,虽然都是叫 VPC ,这里的 VPC 是为 API 这 服务创建一个 VPC ,也就是在指定的 VPC 中的子网创建ENI。而之前的创建的 VPC 是为了访问其他账号的通过 VPC 暴露出来的服务。共同点是它们都用了 Link 的技术。
登陆到 API- (84234*******),选择服务 –VPC 中的, 然后点击 。这里相当于架构图上的紫色 8。
记录创建好的 VPC ID,接下来需要使用
7) 针对跨账号的资源创建 API
登陆到 API- (84234*******),选择服务 –API 中的 APIs, 然后选择 REST API , 在点击 Build。这里相当于架构图上的紫色 7。
配置如下图,在 Type 处选择 , VPC IDs 输入上一步记录的 VPC ID。
接下来,我们接下来创建资源 () 和方法 ()
创建 ,勾选 as proxy 和 API CORS,因为选择了 as proxy ,所以将 /{proxy+} 配置为代理资源,可以捕获所有对其子资源的请求。例如,它适用于对 /foo 的 GET 请求。为了处理对/的请求,在/资源上添加一个新的 ANY 方法。否则资源的访问只能通过路径{proxy+}访问资源,无法通过路径访问资源。
在跳出的页面中配置 , 具体配置如下, type 处选择 VPC Link,勾选 Use Proxy ,VPC Link 处选择之前创建的 VPC Link — nlb-vpc-link(). URL 输入NLB DNS name( ). 注意此处的 URL 参数不是用于将请求路由到终端节点,而是用于设置 Host 标头和证书验证。
同样的在/下如上面的步骤创建 ANY 。否则资源的访问只能通过路径{proxy+}访问资源,无法通过路径访问资源。
在 API 之前需要创建 ,来限定和保护你的API可供满足什么条件的访问,比如限定 ip 地址,VPC,只能通过 API VPC 才能访问。选择 输入如下内容:
{"Version": "2012-10-17","Statement": [{"Effect": "Deny","Principal": "*","Action": "execute-api:Invoke","Resource": "execute-api:/*","Condition": {"StringNotEquals": {"aws:sourceVpce": "vpce-0416bbea8fb2bd63a"}}},{"Effect": "Allow","Principal": "*","Action": "execute-api:Invoke","Resource": "execute-api:/*"}]
}
复制代码
“aws:”: “vpce-” 为限定只能从名为 vpce- 的 VPC 来访问此 API。
通过 API 来部署 API:
因为 的限制,只能通过私网环境访问。
8) 跨账号通过私有网络测试 API
现在模拟从 发起对 api —访问
测试成功。
2. 和内部网络资源集成
和内部网络资源集成又分两种情况
(1)需要被集成的资源是通过 IP 地址来访问的
(2)需要被集成的资源是通过 /URL 来访问的
接下来针对被集成的资源是通过 IP 地址来访问的来讨论,具体的配置过程:
1) 确保网络打通
在架构图中,通过 以及 和线下或是其他网络环境已经建立了网络连接。我在这里是通过同一个亚马逊云科技的账号跨不同的区域来模拟此种场景。
这里相当于架构图上的红色 2,3,4,5。
我已经在 Other 部署好了 nginx 的 EC2 的环境,用来模拟在 Other Place
( other /On-/3rd ) 中资源,有 IP 地址是 172.31.12.59。这里相当于架构图上的红色 1。
2)利用之前创建好的针对 API 的 VPC
也可以参考之前的步骤:
6)为创建 API 而准备针对 API 的 VPC
这里相当于架构图上的红色 9。
3)创建为 VPC link 准备的 NLB 登陆到 API- (84234*******),选择服务 –EC2 中的 , 然后选择 IP , 选择已经和 Other Place
( other /On-/3rd ) 建立了连接的 VPC,协议选择 TCP。配置如下,其他保持默认。
在下一步中 选择对应的 Other IP ,IP 地址输入在 Other Place
( other /On-/3rd ) 中部署的资源 EC 的 IP 地址 172.31.12.59。再点击 as below.这样你就可以在 看到添加的 .
登陆到 API- (84234*******),选择服务 –EC2 中的 Load , 然后点击 Load 处的 。选择 。
这里选择对应的 VPC 和子网。
选择刚才创建好的 Group。
创建完成后,记录 NLB DNS name( )
4) 创建VPC Link
登陆到 API- (84234*******),选择服务 –API 中的 VPC links, 然后点击 选择 VPC link for REST APIs, 在点击 。这里相当于架构图上的红色 6,7。在 NLB 中选择刚创建的 NLB:
注意创建好的 VPC Link 的状态是 , 同时记录 VPC Link ID是 nlb-other- (), 接下来需要使用。
5)针对跨网络的资源创建 API
登陆到 API- (84234*******),选择服务 –API 中的 APIs, 然后选择 REST API , 在点击 Build。这里相当于架构图上的红色 8。
配置如下图,在 Type 处选择 , VPC IDs 输入之前创建的 VPC ID。
接下来,我们接下来创建资源 () 和方法 ()
创建 ,勾选 as proxy 和 API CORS,因为选择了 as proxy ,所以将 /{proxy+} 配置为代理资源,可以捕获所有对其子资源的请求。例如,它适用于对 /foo 的 GET 请求。为了处理对/的请求,在/资源上添加一个新的 ANY 方法。否则资源的访问只能通过路径{proxy+}访问资源,无法通过路径访问资源。
在跳出的页面中配置 , 具体配置如下, type 处选择 VPC Link,勾选 Use Proxy ,VPC Link 处选择之前创建的 VPC Link — nlb-other- (). URL 输入上一步准备的 NLB DNS name( )。注意此处的 URL 参数不是用于将请求路由到终端节点,而是用于设置 Host 标头和证书验证。
同样的在/下如上面的步骤创建 ANY 。此处不赘述。
在 API 之前需要创建 和 API,遵照之前的步骤就可以了。
通过 API 来部署 API:
创建好的 API 如下:
5) 跨网络通过私有网络测试 API
现在模拟从 发起对 api —访问 测试成功。
五、总结
通过以上的步骤,我们通过亚马逊云科技 API 管理平台 API 完成跨账号和内部应用 API 进行集成,另外通过和内部网络资源集成。很好的满足了在私有网络情况下通过 Rest 对 API 管理和集成。
参考材料:
使用 AWS CLI 设置具有私有集成的 API API - API
API - Web s 入门
设置 API 私有集成 - API
VPC links in API | AWS Blog
创建由 提供支持的服务 - Cloud
配置端点服务 - Cloud
本篇作者
金忠敏
解决方案架构师,现在专注于云计算解决方案和架构的工作。具有超过 15 年的 IT 从业经验,曾从事软件开发,售后支持,系统交付,售前等工作。参与过很多大型项目架构设计和实施交付。
文章来源:;=&=CSDN