Amazon VPC图解指南:为什么它被称为云,如果它不是云?
- Published on
为什么需要VPC?
如果你正在阅读这篇文章,也许你有一个应用程序,但刚刚发现要把它部署到AWS上,你需要了解这些复杂的概念:VPC、子网、互联网网关等。

这篇文章将帮助你理解所有这些组件。首先,让我们从VPC(虚拟私有云)的故事开始。
很久以前(其实也不是太久),一些AWS工程师坐在一个会议室里,他们面临一个严重的问题。
"为什么更多的公司不迁移到AWS呢?"他们问道。
"也许是因为所有实例都运行在同一个共享网络中,这意味着用户可以访问彼此的实例,并看到彼此的数据,"有人说。
"也许是因为他们很难将现有服务器迁移到AWS,因为存在IP地址冲突,"另一个人说。
"等等...什么是IP地址冲突?"
"还有现有服务器?他们不应该迁移到我们的服务器吗?"
IP地址冲突问题
这是公司不迁移到AWS的第一个原因。我所说的IP地址冲突是指:我拥有一些服务器,其中一台的IP地址是172.98.0.1
。我的邻居也有一台服务器,她喜欢我的IP地址,所以她也使用了同样的地址!现在我们两个都有IP地址为172.98.0.1
的服务器!

你可能会想"那又怎样?"。实际上...你完全正确。即使我们的服务器有相同的IP地址,但它们在不同的网络中,所以不会有问题。
但问题来了。因为我们都想迁移到AWS。如果我们在AWS上有两台IP地址相同的服务器,这就是个问题!

这就是IP地址冲突。网络中的每台服务器都需要有唯一的IP地址,就像城市中的每栋房子都需要有唯一的地址一样。否则,如果有人要发送包裹,他们不知道应该送到哪栋房子。
现在你可能在想:为什么不直接在AWS上创建新服务器?为什么要将本地("on-premises")服务器连接到AWS?整个迁移到AWS的意义不就是要搬到AWS吗?
没错,我们可以这样做,但有些公司拥有数十台本地服务器。完全迁移到AWS对他们来说并不可行。他们需要能够在AWS上创建新服务器,同时将现有本地服务器连接到同一个网络。当所有人都在同一个网络中时,由于IP地址冲突,这是行不通的。
这对AWS来说是个大问题!
这个IP冲突问题意味着拥有本地服务器的公司没有简单的方法逐步迁移到AWS。想想他们可能失去的所有潜在客户!

我提供这些背景是为了帮助你理解为什么VPC被发明出来。IP地址冲突并不是唯一的问题。在AWS中,所有人的服务器都在同一个网络上,这意味着如果你不小心,任何人都可以连接到你的服务器并查看各种敏感数据!

基于这两个原因,Amazon需要给每个客户提供自己的私有网络,而不是让所有人都在同一个共享网络中。因此,VPC诞生了。
为什么叫VPC而不是看不见的云!
我们正在尝试解决两个问题:
- IP地址冲突
- 用户可以访问彼此的实例,因为它们都在一个大共享网络中
记住:当我的网络和我邻居的网络是分开的时,重复的IP地址完全没问题。Amazon需要的是一种方法,为每个人提供自己的私有网络,但在AWS内部。这样,他们就可以带着自己的IP地址迁移,而不会与其他人的IP地址冲突。
也许您想知道,“为什么我们不能更改 IP 地址,以便所有计算机都有一个唯一的 IP 地址?嗯,在联网中,你根据特定的 IP 地址设置一些东西(我稍后会具体介绍什么),所以这个想法在实践中需要做很多工作。
独立的网络也解决了安全问题。
这就是VPC背后的核心思想:每个人在AWS内部都获得自己的私有网络。
顺便说一下,为什么我要花这么长时间讨论VPC?这篇文章不是关于把应用程序放在云上吗?
有两个原因:
- 因为我们构建的所有东西都将在VPC中进行,所以它是我们的起点。
- 因为VPC不是你能看到的东西,而我喜欢可视化我的互联网架构。其他人以一种对我来说非常混乱的方式可视化它,我想让它对你来说不那么混乱。
人们这样可视化VPC。首先,他们会说:"哦,我在一个区域内创建了一个新的VPC,里面有四个子网,分布在两个可用区内。"
然后他们会画一个类似这样的图:

但不够漂亮 - 这是他们的样子:

现在,
- 区域是一个你可以去的地方,
- 可用区有你可以走进去的数据中心,这些数据中心里有很多服务器。
这两者都是实际的物理地点。但VPC是什么?它是覆盖在数据中心上的一个大型防水布?它是一片黑暗的迷雾?它是一种不安的感觉,笼罩着整个区域,所有数据中心都在循环播放Radiohead的"Fitter, Happier"?
VPC是什么?
我们已经讨论了为什么AWS需要VPC,以及VPC背后的想法,但它们是如何实现的?它们实际上是如何工作的?
你在AWS中的实例总是运行在VPC内。但在现实中,当然,你的实例只是在AWS数据中心的服务器上运行。
你可能有多个实例运行在多个不同的服务器上。Amazon如何将这些实例(跨不同服务器)连接到它们自己的私有网络中?它使用了一种称为映射服务的东西。
映射服务
假设我在服务器1上有一个实例A,我想与服务器2上的另一个实例B通信。

实例A只知道实例B的IP地址。它用这个IP地址访问映射服务。映射服务然后检查实例A所在的VPC,找到该VPC内具有该IP的实例,并将请求转发给它。

"在该VPC内"这部分很重要。映射服务使得我和我的邻居都可以在AWS上拥有相同IP地址的实例,但当我访问该IP地址时,映射服务会将我连接到我的VPC中的实例,而当我的邻居访问该IP地址时,映射服务会将他们连接到他们的VPC中的实例。
映射服务就是隔离我们的服务器的关键。

映射服务确保我们永远不能连接到彼此的实例。通过映射服务,我的所有实例都连接在一起,它们可以拥有我想要的任何IP地址,因为它们对我来说是命名空间化的。映射服务创建了我在AWS内部的私有网络。
所以当你想到VPC时,想象一个服务,它将所有这些实例连接在一起。

回到这个图,我们现在可以理解它的含义:

那个VPC框只是映射服务的范围。映射服务可以连接位于不同可用区的服务器上的EC2实例,这就是为什么VPC覆盖了两个可用区。但映射服务不能连接不同区域的实例,所以VPC不会跨越区域。
如今,一切都在VPC中进行。你的实例总是在VPC中。每个人在开设AWS账户时都会获得一个默认VPC。我们不再有用户可以访问彼此实例的问题,也不再有IP冲突问题。
所以,我们发现数据中心里并不播放"Fitter, Happier"。也许只是Jeff Bezos在唱Pink Floyd的"Money"。
Terraform代码
在本指南中,我将展示如何使用Terraform创建AWS资源。我发现Terraform比在AWS控制台上点击更容易理解,因为你可以直接复制代码并运行它。
以下是创建VPC的Terraform代码:
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
}
在任何Terraform文件中,你还需要一些用于terraform
和provider
的样板代码块。
总结

- 在AWS中,每个客户都有自己的私有网络,称为VPC。
- 没有私有网络,我们会遇到IP地址冲突。
- 没有私有网络,所有人都在同一个网络上,这对安全性非常不利。
- VPC是通过映射服务实现的。