一图胜千言
问题
我有两个AWS账号,其中一个账号提供业务接口服务,其中一个账号提供集中统一网关服务,即Api Gateway。
- 账号A:提供API Gateway网关服务
- 账号B:提供业务接口服务,即将自身接口服务以VPC Endpoint服务方式对外暴露。
现在的问题是,需要在账号A中代理账号B的接口服务,并且,让用户流量通过账号A的业务接口服务统一访问。
前提
这里假设账号B已经准备好接口服务的NLB负载均衡器和VPC端点服务。账号A已经存在API Gateway网关。
步骤
创建VPC端点安全组
在账号A中,创建一个安全组,来保障下一步账号A中内网机器,能够通过创建的VPC端点来访问账号B业务接口。下面就是对账号A内网ip段和业务端口(9011)进行放行。内容如下:
创建VPC端点
打开创建vpc端点页面,如下图:
开始创建,如下图:
这里第3步需要由账号B的VPC端点服务提供委托。现在我们回到账号B,开始对账号A进行委托授权后,再来账号A中验证服务名称。
VPC端点服务委托授权
在账号B中的VPC端点服务部分,对账号A进行委托授权。找到需要授权的VPC端点服务,如下图:
进入永许委托人管理界面,输入账号A对ARN即可,内容如下:
arn:aws-cn:iam::账号id:root
委托授权管理,具体如下:
这里在账号B中设置账号A的委托人,有资格调用这个账号B的VPC端点服务。委托授权完成后,继续在账号B中找到这个VPC端点服务,并复制它的服务名称后,准备回到账号A中继续服务名称验证。具体如下图:
继续创建VPC端点之服务名称验证
复制账号B的服务名称后,回到账号A继续进行创建VPC端点,粘贴服务名称到对应的输入框中,开始验证服务。如下图:
但出现服务名称已验证,则可以继续下一步配置VPC和安全组了。配置vpc和安全组如下:
注意,这里的子网都选择私有的的子网。第9步点击创建后,则需要回到账号B中进行审核。
审核VPC端点连接
再次回到账号B的VPC端点服务页面,对账号A的连接进行审批,具体入口下图:
这里因为我已经接受过连接了,这个截图没有截图成功,就只能这样了。接下来回到账号A看看VPC端点是否成功。
检查创建的VPC端点
回到账号A查看VPC端点状态,如下图:
如果账号A对VPC端点状态为可用,就表示没有问题了。现在就可以尝试通过账号A内网测试访问账号B中的接口了。
验证VPC端点
登录到账号A内网任意一台服务器,发送如下请求:
curl -v http://vpce-xxxxxxxxx-xxxxxxxx.vpce-svc-xxxxxxx.cn-north-1.vpce.amazonaws.com.cn:9011/actuator/health
如果出现正常响应200,说明账号A内网可以通过privateLink方式访问到账号B的业务接口。这个健康是Spring Actuator的健康检查接口。
创建目标组
继续在账号A创建一个目标组,如下图:
接下来,将VPC端点的ip注册到目标组中即可,先找到VPC端点IP地址,如下:
将这些VPC端点子网IP地址注册到目标组中即可。如下图:
最后点击创建目标组即可。
创建NLB
接下来,继续在账号A的控制面板操作。创建NLB,找到入口如下:
下面选择NLB进行创建,如下图:
接下来,进行详细的NLB创建设置,如下图:
配置DNS
注意这里我使用了自定义域名来配置这个内网NLB的,因为这个项目有严格云安全要求,如果是一般项目,就没必要这样做了。有了这个自定义域名设置,我们还需要配置一下这个NLB的CNAME设置。先要找到我们创建的NLB的DNS名称,如下图:
然后,在我们自己的自定义域名DNS服务器,配置自定义域名CNAME记录即可:
xxx.xxx.xxxx.cn 300 IN CNAME xxxx-xxxx.elb.cn-north-1.amazonaws.com.cn
测试验证
在账号A内网中随意找一台机器,通过自定义域名发起如下请求:
curl -v https://xxx.xxx.xxxx.cn/actuator/health
如果出现正常响应200,说明账号A内网可以通过NLB访问到账号B的业务接口。验证通过后,继续下一步。
创建VPC Link
我们接下来在账号A的API Gateway控制面板开始准备创建VPC Link,以便后续API Gateway能够正常代理使用。找到VPC Link创建入口如下:
选择上面创建的NLB,开始创建VPC Link,如下图:
等待一段时间(等的时间有点久),VPC Link创建成功后,就可以继续设置API Gateway了。
设置API Gateway
在账号A中的网关中创建,如下路径资源:
等待VPC Link创建完成后,开始在这个{proxy+}资源下面创建ANY方法,如下图开始:
下面开始设置ANY方法如下图:
然后,点击API Gateway重新部署这个API Gateway即可。如果需要对这个资源进行IP白名单现在,还需要设置如下资格策略,内容如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws-cn:execute-api:cn-north-1:账号ID:网关ID/*/*/资源路径/*"
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws-cn:execute-api:cn-north-1:账号ID:网关ID/*/*/资源路径/*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"23.6.3.162/32"
]
}
}
}
]
}
到这里就可以通过API Gateway进行测量效果了,如果API Gateway是通过CloudFront(CDN服务)出去的。需要进一步配置CloudFront行为方式,最后,通过CloudFront测试接口即可。CloudFront行为创建配置类似如下:
等待一段时间,等CloudFront部署完成后,就可以开始测试验证了。
测试验证
打开浏览器,访问cloudfront如下地址,看看是否有正常响应:
https://xxxx.xxxxxx.cn/xxxx/actuator/health
效果如下图:
也可以在API Gateway资源策略里面关闭这个Spring Actuator对外的访问,拒绝策略内容如下:
{
"Effect": "Deny",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws-cn:execute-api:cn-north-1:账号ID:网关ID/*/*/资源路径/actuator/*"
}
添加这个资格策略后,重新部署API Gateway,就发现浏览器无法通过CloudFront方式打开Spring Actuator相关状态监控接口了。这样来说,更加安全一些。
总结
这就是AWS跨账号的云服务发现机制。通过PrivateLink实现内网打通后,通过VPC端口方式来发现服务。