共计 10153 个字符,预计需要花费 26 分钟才能阅读完成。
一、背景介绍
本文次要探讨的问题是在应用 Amazon API Gateway,通过 Private Integration、Private API 来实现公有网络环境下的跨账号或跨网络的 API 集成。API 治理平台会被设计在独自的账号中 (亚马逊云科技提供的是多租户的环境),因为主观上不同业务零碎的存在,都须要和 API 治理平台集成,所以 API 治理平台很有可能会连贯不同网络环境,可能是亚马逊云科技提供的其余的区域、线下的环境、或是其余云的环境。
亚马逊云科技开发者社区为开发者们提供寰球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、流动与比赛等。帮忙中国开发者对接世界最前沿技术,观点,和我的项目,并将中国优良开发者或技术举荐给寰球云社区。如果你还没有关注 / 珍藏,看到这里请肯定不要匆匆划过,点这里让它成为你的技术宝库! |
在探讨正题之前, 咱们先来议论下 API 治理平台。API 是古代利用开发的一个典型局部。它们使应用程序、零碎和服务可能无效沟通,突破了底层技术的孤岛。为了以无效和可扩大的形式最大限度地利用这些 API,API 治理是必须的。利用 API 治理平台能够使企业可能以平安、简便和高效的形式布局、设计、测试、公布、经营、平安和版本控制其 API,从而取得企业所能提供的数据和服务的最大后劲。
Amazon API Gateway 是一种齐全托管的服务,能够帮忙开发人员轻松创立、公布、保护、监控和爱护任意规模的 API。API 充当应用程序的前门,可从您的后端服务拜访数据、业务逻辑或性能。应用 API Gateway,您能够创立 RESTful API、Http API 和 WebSocket API,以便实现实时双向通信应用程序。API Gateway 反对容器化和无服务器工作负载,以及 Web 应用程序。
API Gateway 负责管理所有工作,波及承受和解决成千上万个并发 API 调用,包含流量治理、CORS 反对、受权和访问控制、限度、监控,以及 API 版本治理。API Gateway 没有最低费用或启动老本。您只需为您收到的 API 调用和传出的数据量付费。
咱们察看到不同的客户都在评估或是部署 API 治理平台,Amazon API Gateway 作为一个云原生无服务器架构的 API 治理平台,将能很好的满足您对 API 治理的需要。
另外,基于 OpenAPI 接口标准实现的应用程序能够主动生成办法、参数和模型的文档。这有助于放弃文档、客户端库和源代码的同步。并且 OpenAPI 标准是不分语言的。通过 OpenAPI 的申明性资源标准,客户能够了解和生产服务,而无需理解服务器的实现或拜访服务器代码。API Gateway 也反对 OpenAPI v2.0 和 OpenAPI v3.0 的标准。
二、概念介绍
当您在应用 API Gateway 的过程中,有一些要害的概念和定义,是达成 API Gateway 次要性能的前置条件。
Integration (集成),这个是 API Gateway 实现其性能的外围概念。不论是 Restful API、HTTP API 还是 WebSocket API,都是通过 Integration (集成) 这个要害动作将 API Gateway 暴露出的供拜访的接口和后端的具体实现相连接。这里的后端可能是 Lambda 函数、其余 Amazon 服务、或是其余的 HTTP 资源、亦或是置放于 VPC 内的公有资源或外部网络中的资源。只是,REST API 由资源和办法组成;HTTP API 由路由和资源组成;WebSocket API 也是由路由和路由键组成;
REST API 由资源和办法组成。资源是一种逻辑实体,应用程序能够通过资源门路来拜访资源。办法与您的 API 用户提交的 REST API 申请以及返回给该用户的相应响应对应。
HTTP API 由路由和资源组成。将间接传入 API 申请路由到后端资源。路由蕴含两局部:HTTP 办法和资源门路,例如,GET /pets。您能够为路由定义特定的 HTTP 办法。或者,您能够应用 ANY 办法匹配尚未为资源定义的所有办法。您能够创立一个 $default 路由,用作与任何其余路由不匹配的申请的“捕捉全副”办法。
WebSocket API 由路由和路由键组成。与接管和响应申请的 REST API 不同,WebSocket API 反对客户端应用程序与后端之间的双向通信。后端能够向连贯的客户端发送回调音讯。
Private Integration: 正如下面形容的那样,Integration (集成) 是 API Gateway 中的一个要害动作。Private Integration 强调的是集成置放于 VPC 内的公有资源或外部网络中的资源。官网文档介绍:
https://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/set-up-private-integration.html
VPC Link: 通过 VPC 链接 (VPC Link),您能够创立公有集成,将 HTTP API 路由连贯到 VPC 中的公有资源,例如 Network/Application Load Balancer 或基于 Amazon ECS 容器的应用程序。公有集成应用 VPC Link 来封装 API Gateway 与指标 VPC 资源之间的连贯。您能够跨不同的路由和 API 重复使用 VPC 链接。创立 VPC Link 时,API Gateway 在您的账户中为 VPC 链接创立和治理弹性网络接口。
其实 VPC Link 就是为了实现 Private Integration 的一个技术组件。
Private API: 指的是 API Gateway 裸露的 API 只能在公有网络外部拜访,不能从公网拜访。
以上的 Private Integration,Private API 和 VPC Link,这里还有一个博客文章,可供大家学习参考:https://aws.amazon.com/blogs/compute/understanding-vpc-links-in-amazon-api-gateway-private-integrations/
Proxy Integration (代理集成): 借助无所不包的代理资源 {proxy+} 和 REST/HTTP 办法, 名为 ANY,也就能匹配任何 REST/HTTP 办法,您能够应用代理集成来创立一个办法为 ANY 的 API。该办法会裸露后端的一整套可拜访的 HTTP 资源和操作。当后端 Web 服务器凋谢更多资源以供公开拜访时,客户端能够通过这同一个 API 来拜访新资源。
PrivateLink:Amazon PrivateLink 是一项具备高可用性的可扩大技术,它反对将您的 VPC 私密地连贯到反对的亚马逊云科技服务、由其余 Amazon 账户托管的服务(通过 VPC 终端节点服务来实现)以及反对亚马逊云科技 Marketplace 合作伙伴服务。您无需应用互联网网关、NAT 设施、私有 IP 地址、Direct Connect 连贯或 Amazon Site-to-Site VPN 连贯,就能与该服务通信。
VPC Endpoint services (VPC 终端节点服务):您 VPC 中本人的应用程序或服务。
VPC Endpoint (VPC 终端节点):在 VPC 中可让您私密地连贯到 VPC 终端节点服务的入口点。
三、架构图和问题定义
1) 架构图介绍
1.1) 因为在实在的场景中,API 治理平台会被设计在独自的账号中 (亚马逊云科技提供的是多租户的环境),又因为主观上不同业务零碎的存在,都须要和 API 治理平台集成,所以 API 治理平台很有可能会连贯不同网络环境,可能是亚马逊云科技提供的其余的区域、线下的环境、或是其余云的环境。因而下面的架构图设计了跨账号、跨不同网络的环境。
1.2) 这里设定 3 个云上的账号,别离是 API-Gateway Account,Application Account 和 Consumer Account。为了配置不便,这里 Consumer 和 API-Gateway 在同一个账号中雷同的 VPC 中。同时还有一个 Other Place 来表征可能是亚马逊云科技提供的其余的区域、线下的环境、或是其余云的环境。
2) 问题定义
如下面的架构图, 本文次要探讨的问题是在应用 API Gateway 状况下,通过 Private Integration、Private API、VPC Link 以及 VPC Endpoint services、VPC Endpoint。来实现公有网络环境下的跨账号或跨网络的 API 集成。
四、具体配置
配置次要分两块,一是和跨账号的外部利用 API 进行集成,二是通过和外部网络资源集成。
1. 和跨账号的外部利用 API 进行集成
1) 配置接口终端节点服务 (VPC Endpoint Services)
登陆到 Application Account (01477*), 在 EC2 中抉择 Load Balancers, 查看通过 EKS 创立好的 Service (以 internal NLB 的模式呈现),这里相当于架构图上的紫色 1 和 2
参考官网手册 https://docs.amazonaws.cn/vpc/latest/privatelink/create-endpoint-service.html
实现“接口终端节点服务”创立,这里相当于架构图上的紫色 3。
抉择服务 –VPC 中的 Endpoint Services, 而后点击 Create endpoint service
抉择之前 EKS 创立好的 Service(以 NLB 裸露的)
其余选项放弃默认。
https://docs.amazonaws.cn/vpc/latest/privatelink/add-endpoint-service-permissions.html
在创立终端节点服务配置后,您能够管制哪些服务使用者可能创立连贯您服务的接口终端节点。
输出容许拜访此接口终端节点服务的 Amazon 账号中的 IAM user 或 role 的 ARN,能够参考如下官网手册:
https://docs.amazonaws.cn/vpc/latest/privatelink/add-endpoint-service-permissions.html
创立好的“接口终端节点服务”如下,复制 Service name, 接下来会用。
2) 配置接口终端节点 VPC Endpoint
登陆到 API-Gateway Account (84234*), 抉择服务 –VPC 中的 Endpoint, 而后点击 Create endpoint,输出 Name 和之前复制的 Service name,并 Verify
service。这里相当于架构图上的紫色 4 和 5。
这里抉择 VPC 和 Subnets 时须要留神,因为会别离在选定的子网中创立一个端点网络接口 (ENI)。一个端点网络接口会从你的子网的 IP 地址范畴内调配一个公有 IP 地址,并放弃这个 IP 地址,直到接口端点被删除。
留神创立好的在子网中的网络接口 (ENI), 记录对应的子网和 ip 地址。
3) 承受终端节点连贯申请 (Endpoint connections)
登陆到 Application Account (01477*), 在 VPC 中抉择 Endpoint services, 抉择之前创立的 Endpoint services。在 Endpoint connections 中抉择 Accept endpoint connection request。
4) 创立供 VPC link 应用的 NLB
登陆到 API-Gateway Account (84234*), 抉择服务 –EC2 中的 Target groups, 而后抉择 IP addresses, 配置如下,其余放弃默认。这里相当于架构图上的紫色 6。
在下一步中 network 抉择对应的 VPC,IP 地址输出上一步记录下来的 IP 地址。
登陆到 API-Gateway Account (84234*), 抉择服务 –EC2 中的 Load balancers, 而后点击 Network Load Balancer 处的 Create。抉择 Internal。
这里抉择对应的 VPC 和子网。
创立实现后,记录 NLB DNS name(nlb-vpc-link-bbbd845d48779f09.elb.us-east-1.amazonaws.com)
5) 创立供 VPC Link
登陆到 API-Gateway Account (84234*), 抉择服务 –API Gateway 中的 VPC links, 而后点击 Create 抉择 VPC link for REST APIs, 在点击 Create。这里相当于架构图上的紫色 6。
在 Target NLB 中抉择刚创立的 NLB:
留神创立好的 VPC Link 的状态是 Available, 同时记录 VPC Link ID 是 nlb-vpc-link(wo74ch), 接下来须要应用。
6) 为创立 Private Restful API 而筹备针对 API Gateway 的 VPC Endpoint
这里先解释一下,尽管都是叫 VPC Endpoint,这里的 VPC Endpoint 是为 API Gateway 这 Serverless 服务创立一个 Interface VPC Endpoint,也就是在指定的 VPC 中的子网创立 ENI。而之前的创立的 VPC Endpoint 是为了拜访其余账号的通过 VPC Endpoint services 裸露进去的服务。共同点是它们都用了 Private Link 的技术。
登陆到 API-Gateway Account (84234*), 抉择服务 –VPC 中的 Endpoints, 而后点击 Create endpoint。这里相当于架构图上的紫色 8。
记录创立好的 VPC Endpoint ID,接下来须要应用
7) 针对跨账号的资源创立 Private Restful API
登陆到 API-Gateway Account (84234*), 抉择服务 –API Gateway 中的 APIs, 而后抉择 REST API Private, 在点击 Build。这里相当于架构图上的紫色 7。
配置如下图,在 Endpoint Type 处抉择 Private, VPC Endpoint IDs 输出上一步记录的 VPC Endpoint ID。
接下来,咱们接下来创立资源 (Resource) 和办法 (Method)
创立 Resource,勾选 Configure as proxy resource 和 Enable API Gateway CORS,因为抉择了 Configure as proxy resource,所以将 /{proxy+} 配置为代理资源,能够捕捉所有对其子资源的申请。例如,它实用于对 /foo 的 GET 申请。为了解决对 / 的申请,在 / 资源上增加一个新的 ANY 办法。否则资源的拜访只能通过门路 https://.execute-api..amazonaws.com/test/{proxy+} 拜访资源,无奈通过门路 https://.execute-api..amazonaws.com/test/ 拜访资源。
在跳出的页面中配置 private integration, 具体配置如下,Integration type 处抉择 VPC Link,勾选 Use Proxy Integration,VPC Link 处抉择之前创立的 VPC Link — nlb-vpc-link(wo74ch). Endpoint URL 输出 NLB DNS name(nlb-vpc-link-bbbd845d48779f09.elb.us-east-1.amazonaws.com). 留神此处的 Endpoint URL 参数不是用于将申请路由到终端节点,而是用于设置 Host 标头和证书验证。
同样的在 / 下如下面的步骤创立 ANY method。否则资源的拜访只能通过门路 https://.execute-api..amazonaws.com/test/{proxy+} 拜访资源,无奈通过门路 https://.execute-api..amazonaws.com/test/ 拜访资源。
在 Deploy API 之前须要创立 Resource Policy,来限定和爱护你的 API 可供满足什么条件的拜访,比方限定 ip 地址,VPC,只能通过 API Gateway VPC endpoint 能力拜访。抉择 Resource Policy 输出如下内容:
{
"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:sourceVpce”:“vpce-0416bbea8fb2bd63a”为限定只能从名为 vpce-0416bbea8fb2bd63a 的 VPC endpoint 来拜访此 API。
通过 Deploy API 来部署 API:
因为 Resource Policy 的限度,只能通过私网环境拜访。
8) 跨账号通过公有网络测试 Private Restful API
当初模仿从 Consumer Account 发动对 api — https://3eqr0osoc3.execute-api.us-east-1.amazonaws.com/test 拜访
测试胜利。
2. 和外部网络资源集成
和外部网络资源集成又分两种状况
(1) 须要被集成的资源是通过 IP 地址来拜访的
(2) 须要被集成的资源是通过 Endpoint/URL 来拜访的
接下来针对被集成的资源是通过 IP 地址来拜访的来探讨,具体的配置过程:
1) 确保网络买通
在架构图中,通过 Transit Gateway 以及 Direct connect 和线下或是其余网络环境曾经建设了网络连接。我在这里是通过同一个亚马逊云科技的账号跨不同的区域来模仿此种场景。
这里相当于架构图上的红色 2,3,4,5。
我曾经在 Other Region 部署好了 nginx 的 EC2 的环境, 用来模仿在 Other Place
(Amazon other Region/On-premise/3rd location) 中资源,有 IP 地址是 172.31.12.59。这里相当于架构图上的红色 1。
2) 利用之前创立好的针对 API Gateway 的 VPC Endpoint
也能够参考之前的步骤:
6) 为创立 Private Restful API 而筹备针对 API Gateway 的 VPC Endpoint
这里相当于架构图上的红色 9。
3) 创立为 VPC link 筹备的 NLB 登陆到 API-Gateway Account (84234*), 抉择服务 –EC2 中的 Target groups, 而后抉择 IP addresses, 抉择曾经和 Other Place
(Amazon other Region/On-premise/3rd location) 建设了连贯的 VPC,协定抉择 TCP。配置如下,其余放弃默认。
在下一步中 network 抉择对应的 Other private IP address,IP 地址输出在 Other Place
(Amazon other Region/On-premise/3rd location) 中部署的资源 EC 的 IP 地址 172.31.12.59。再点击 Include as pending below. 这样你就能够在 Review Targets 看到增加的 Target.
登陆到 API-Gateway Account(84234*), 抉择服务 –EC2 中的 Load balancers, 而后点击 Network Load Balancer 处的 Create。抉择 Internal。
这里抉择对应的 VPC 和子网。
抉择方才创立好的 Target Group。
创立实现后,记录 NLB DNS name(nlb-other-network-137d7c7c7e159265.elb.us-east-1.amazonaws.com)
4) 创立 VPC Link
登陆到 API-Gateway Account(84234*), 抉择服务 –API Gateway 中的 VPC links, 而后点击 Create 抉择 VPC link for REST APIs, 在点击 Create。这里相当于架构图上的红色 6,7。在 Target NLB 中抉择刚创立的 NLB:
留神创立好的 VPC Link 的状态是 Available, 同时记录 VPC Link ID 是 nlb-other-network (6h953x), 接下来须要应用。
5) 针对跨网络的资源创立 Private Restful API
登陆到 API-Gateway Account (84234*), 抉择服务 –API Gateway 中的 APIs, 而后抉择 REST API Private, 在点击 Build。这里相当于架构图上的红色 8。
配置如下图,在 Endpoint Type 处抉择 Private, VPC Endpoint IDs 输出之前创立的 VPC Endpoint ID。
接下来,咱们接下来创立资源 (Resource) 和办法 (Method)
创立 Resource,勾选 Configure as proxy resource 和 Enable API Gateway CORS,因为抉择了 Configure as proxy resource,所以将 /{proxy+} 配置为代理资源,能够捕捉所有对其子资源的申请。例如,它实用于对 /foo 的 GET 申请。为了解决对 / 的申请,在 / 资源上增加一个新的 ANY 办法。否则资源的拜访只能通过门路 https://.execute-api..amazonaws.com/test/{proxy+} 拜访资源,无奈通过门路 https://.execute-api..amazonaws.com/test/ 拜访资源。
在跳出的页面中配置 private integration, 具体配置如下,Integration type 处抉择 VPC Link,勾选 Use Proxy Integration,VPC Link 处抉择之前创立的 VPC Link — nlb-other-network (6h953x). Endpoint URL 输出上一步筹备的 NLB DNS name(nlb-other-network-137d7c7c7e159265.elb.us-east-1.amazonaws.com)。留神此处的 Endpoint URL 参数不是用于将申请路由到终端节点,而是用于设置 Host 标头和证书验证。
同样的在 / 下如下面的步骤创立 ANY method。此处不赘述。
在 Deploy API 之前须要创立 Resource Policy 和 Deploy API,遵循之前的步骤就能够了。
通过 Deploy API 来部署 API:
Serverless
创立好的 API 如下:
5) 跨网络通过公有网络测试 Private Restful API
当初模仿从 Consumer Account 发动对 api — https://buw9ocq5f5.execute-api.us-east-1.amazonaws.com/newtest 拜访 测试胜利。
五、总结
通过以上的步骤,咱们通过亚马逊云科技 API 治理平台 API Gateway 实现跨账号和外部利用 API 进行集成,另外通过和外部网络资源集成。很好的满足了在公有网络状况下通过 Rest 对 API 治理和集成。
参考资料 :
https://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/set-up-api-with-vpclink-cli.html
https://docs.amazonaws.cn/aws/latest/userguide/api-gateway.html
https://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/set-up-private-integration.html
https://aws.amazon.com/blogs/compute/understanding-vpc-links-in-amazon-api-gateway-private-integrations/
https://docs.amazonaws.cn/vpc/latest/privatelink/create-endpoint-service.html
https://docs.amazonaws.cn/vpc/latest/privatelink/add-endpoint-service-permissions.html
本篇作者
金忠敏
Amazon 解决方案架构师,当初专一于云计算解决方案和架构的工作。具备超过 15 年的 IT 从业教训,曾从事软件开发,售后反对,零碎交付,售前等工作。参加过很多大型项目架构设计和施行交付。
文章起源:https://dev.amazoncloud.cn/column/article/630a3483d4155422a46…