一、前言
公有云各区域间都是完全隔离的,互通默认是通过Internet访问。如果有大量复制数据的需求,一般可以通过S3、RDS底层的跨区域复制实现,这种方式是通过AWS的全球骨干网传输,数据不暴露在Internet上。当然,跨区域复制这些,中国区不支持。原因大家懂的。
如果要方便操作,有一批EC2分别位于两个Region,EC2虚拟机之间要互通,那么在通过Internet就麻烦了。最佳实践就是跨Region的VPC Peering。注意,中国区也不支持。
如下图,VPC Peering示意图。

补充:在上百年这张图上,其实Internet是一个事宜,创建VPC Peering并不需要Internet的,底层都是通过AWS的全球骨干网完成。
二、准备工作
所谓准备工作,是指在两个Region各有1个VPC,且IP地址段不能重合。AWS默认每个区域都有一个172.31.0.0/16的VPC地址段,是重复的,所以没办法第二个区域直接使用,因此必须再建立一个VPC,分配10段的IP才可以。
接下来就来新建VPC。进去对应区域,例如我们分别在东京和新加坡两地,使用VPC Peering打通。新加坡使用默认网络172.31.0.0/16,东京新创建10.20.0.0/16。先进入VPC产品页面,然后切换地理位置到东京,再点击下图中的创建。

接下来创建新的VPC时候,输入一个与现有VPC不重叠的网段。如下截图,我选了10.20.0.0/16段。

创建好VPC后,还需要给VPC创建子网。如下图创建子网。

填写子网信息时候,注意VPC一定要选对新创建的VPC,如下截图,红色部分是本次新创建的VPC。

本次为了演示,解决时间,就创建一个子网在可用区A,就不再按照生产环境的标准,给每个可用区都去创建一个子网了。
至此准备工作完成。
三、创建VPC Peering
接下来就要创建Peering了。点击Create。如下图所示。

在创建页面,分别填写名称(随意填),发起人,注意要选择正确的VPC,选择后看下边的IP网段可以double confirm下没选错。在目标选项位置,选择本账户下的另一个Region,然后选择新加坡Region,最后输入远端要链接的VPC ID。这里需要注意,最后一个输入的值,VPC ID是不会自动带出来的,需要手动填写。如下截图。

这里为前一句话做一下补充,到哪里去查看VPC ID呢?如下图位置可见。

按照上边的步骤,创建完成。

这样发起申请就完毕了。可以从发起申请的东京区域看到,有一个VPC Peering申请等待确认。如下截图。

接下来,切换到新加坡区域,也进入VPC模块下的VPC Peering的界面。
如下图可以看到,在新加坡界面中,这个是等待审批。

点击这里的审批按钮,通过审批。

再次确认下,通过审批。

通过审批完成,接下来该配置路由表了。
四、创建跨VPC的路由表
配置路由表要在两地分别完成,即在东京写入去新加坡的路由走向,在新加坡写入去东京的路由走向。
(一)新加坡区域的设置
由于上一步操作,我们正好切换到了新加坡,这里就从新加坡开始配置路由表。在下图中,确认区域是新加坡,在VPC模块下,点击左侧“Route Tables”,然后从右侧可以看到默认的路由表。不需要创建新的路由表,就编辑现有的就可以。点击下方的编辑按钮。如下截图。

在编辑路由表界面,先点击下“Add route”,页面就增加了一行新的空白的。在Destination位置填写目标地址,当前正在配置新加坡的,要填写的目标地址是东京的那么就填写为10.20.0.0/16,即东京的整个VPC。然后在Target位置,点击下拉框,选出来的路由下一跳有多个选项,这里选择“Peering Conenctions”,也就是我们刚才建立并且批准了的那个VPC Peering。如下截图。

接上一步,如果有多个VPC Peering,这里选择后还会进一步提问用哪个,记得看准ID别选错了。

好~的,没有问题!添加路由表完成。
接下来还需要完成路由表和子网的绑定。从下边的截图中,已经可以看到刚添加好的路由了。那么点击“Subnet Associations”切换标签页,完成对路由表和子网的绑定关系设置。

切换标签页完成后,点击编辑“Edit Subnet Assocications”。

在绑定子网界面,把本VPC内的三个子网都绑定上。并点击保存按钮。

好的,新加坡区域配置成功。
(二)东京区域的设置
切换回到东京区域,一样是进入VPC路由表的界面。
这里要注意了,因为在东京区域,为了避免IP地址冲突,我们特意新建立了一个VPC,所以呢,东京区域有两个VPC。那么对应的路由表,也有两个。要编辑的是我们新建立的VPC对应的路由表,这里注意别选错了。如下截图。

在编辑路由表界面,当前是在东京,因此自身就是10.20.0.0/16地址了,要输入的目标地址是新加坡,也就是172.16.0.0/24。在Target位置和刚才一样,选VPC peering。

注意选到正确的Peering,如果有多个Peering的话。

接下来还需要为这个路由表绑定子网。点击绑定按钮。如下截图。

在绑定子网界面,从下拉框里边选中唯一的子网,点击保存就可以了。这里只有一个子网而不是三个的原因是,刚才测试为了省事,就在东京这个区域下新建了一个VPC,VPC内只放了一个子网。所以这个绑定界面也就只能看到一个子网。如下截图。

回到刚才的界面,绑定完成。如下截图。

至此,东京区域也配置好了。接下来该用虚拟机测试了。
五、测试网络访问
测试方法是,在东京和新加坡各建立一个EC2实例,互相ping,互相登录,看对方IP。
(一)准备工作
首先在东京建立一个EC2实例。这里不会讲创建EC2虚拟机的全过程,因为比较简单,只是强调下两点:
1、注意一定要创建在正确的VPC上,我们为了测试新创建的VPC新的子网和远端的Peering,那么虚拟机一定选择正确的子网。EC2一旦创建好了是不能修改子网的,要切换子网要走快照等办法迁移,很不方便。所以创建虚拟机测试时候一定选准确。如下截图,红色框里是确认要选对VPC和Subnet。

2、防火墙要开放ICMP允许ping,如果忘记这点,只是习惯性的开了SSH登录的TCP22,会发现并不能ping通,这是因为没开ICMP协议。如下截图。

以上是东京区域的EC2准备好了,接下来再准备新加坡区域的EC2。
创建EC2过程不再赘述。
(二)互相ping测试
SSH先登录到从新加坡的节点,然后从新加坡的节点ping日本东京节点,ping成功!

接下来,从日本东京节点,ping新加坡节点,ping成功!

(三)互相访问测试
从新加坡登录东京,SSH登录上去后,执行w命令,查看在线的SSH User,可以看到IP地址就是新加坡EC2的内网IP,这里不存在任何NAT,是两个网段直接路由打通。如下截图。

从东京登录到新加坡,也执行w命令,也可以看到,两个网段是直接route打通的,不存在NAT映射问题。

(四)补充说明
需要注意的是,东京的这个新建立的VPC网络,是没有Internet Gateway网关的,因此这里边的EC2是不能上外网的。
通过如下的截图也可以看到,虚拟机无法对外网访问。

通过查看路由表,也可以发现,这个新建的VPC网段是没有0.0.0.0的默认网关的。进一步看Internet Gateway,也是不存在的。如下截图。

如上这样的原因是,AWS要求每个新建立的VPC,必须手工建立Internet网关并挂载到VPC上。如果不建立,那么这个VPC就没有互联网链接,无法打补丁。
这样的补充说明,是为了展现VPC Peering是完全通过AWS的全球骨干网拉通,数据不会暴露在Internet上,即便是纯内网状态的VPC也一样可以打通。
(五)网络延迟(@20190918补充)
AWS海外的VPC Peering是通过AWS的全球骨干网,数据不暴露在Internet上。跨Region的速度受限于海底光缆传输,几千公里的距离一半都有几十毫秒的延迟,这是正常的。例如东京和新加坡ping值反馈如下截图,大约68ms。

如果需要更长时间的测试,可以使用长ping工具对网络进行测试。
六、小结
通过本文的流程可以看出,VPC Peering提供了跨Region的VPC之间的网络链接能力,以路由方式打通两个VPC,可不暴露在公网上就完成网络链接,为EC2管理员提供了方便易用的交互环境。
七、补充
2020年1月,中国区正式上线Transit Gateway,可以将多个VPC用Mesh方式打通,不需要每个VPC互相做一堆复杂的Peering了。但目前截至1月底,跨Region的Transit Gateway还不能互通,海外此功能已经在欧洲、北美等多个地区发布,中国区域发布应在不久后实现。
全文完。