logo

Amazon VPC图解指南:为什么它被称为云,如果它不是云?

Published on

为什么需要VPC?

如果你正在阅读这篇文章,也许你有一个应用程序,但刚刚发现要把它部署到AWS上,你需要了解这些复杂的概念:VPC、子网、互联网网关等。

应用程序和AWS基础设施对比 图1:简单应用与复杂AWS基础设施的对比

这篇文章将帮助你理解所有这些组件。首先,让我们从VPC(虚拟私有云)的故事开始。

很久以前(其实也不是太久),一些AWS工程师坐在一个会议室里,他们面临一个严重的问题。

"为什么更多的公司不迁移到AWS呢?"他们问道。

"也许是因为所有实例都运行在同一个共享网络中,这意味着用户可以访问彼此的实例,并看到彼此的数据,"有人说。

"也许是因为他们很难将现有服务器迁移到AWS,因为存在IP地址冲突,"另一个人说。

"等等...什么是IP地址冲突?"

"还有现有服务器?他们不应该迁移到我们的服务器吗?"

IP地址冲突问题

这是公司不迁移到AWS的第一个原因。我所说的IP地址冲突是指:我拥有一些服务器,其中一台的IP地址是172.98.0.1。我的邻居也有一台服务器,她喜欢我的IP地址,所以她也使用了同样的地址!现在我们两个都有IP地址为172.98.0.1的服务器!

两个网络使用相同IP地址 图2:不同网络中的相同IP地址

你可能会想"那又怎样?"。实际上...你完全正确。即使我们的服务器有相同的IP地址,但它们在不同的网络中,所以不会有问题。

但问题来了。因为我们都想迁移到AWS。如果我们在AWS上有两台IP地址相同的服务器,这就是个问题!

AWS中的IP冲突 图3:AWS中的IP地址冲突

这就是IP地址冲突。网络中的每台服务器都需要有唯一的IP地址,就像城市中的每栋房子都需要有唯一的地址一样。否则,如果有人要发送包裹,他们不知道应该送到哪栋房子。

现在你可能在想:为什么不直接在AWS上创建新服务器?为什么要将本地("on-premises")服务器连接到AWS?整个迁移到AWS的意义不就是要搬到AWS吗?

没错,我们可以这样做,但有些公司拥有数十台本地服务器。完全迁移到AWS对他们来说并不可行。他们需要能够在AWS上创建新服务器,同时将现有本地服务器连接到同一个网络。当所有人都在同一个网络中时,由于IP地址冲突,这是行不通的。

这对AWS来说是个大问题!

这个IP冲突问题意味着拥有本地服务器的公司没有简单的方法逐步迁移到AWS。想想他们可能失去的所有潜在客户!

增长图表对比 图4:理想增长与实际增长对比

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

共享网络 图5:共享网络中的所有服务器

基于这两个原因,Amazon需要给每个客户提供自己的私有网络,而不是让所有人都在同一个共享网络中。因此,VPC诞生了。

为什么叫VPC而不是看不见的云!

我们正在尝试解决两个问题:

  1. IP地址冲突
  2. 用户可以访问彼此的实例,因为它们都在一个大共享网络中

记住:当我的网络和我邻居的网络是分开的时,重复的IP地址完全没问题。Amazon需要的是一种方法,为每个人提供自己的私有网络,但在AWS内部。这样,他们就可以带着自己的IP地址迁移,而不会与其他人的IP地址冲突。

也许您想知道,“为什么我们不能更改 IP 地址,以便所有计算机都有一个唯一的 IP 地址?嗯,在联网中,你根据特定的 IP 地址设置一些东西(我稍后会具体介绍什么),所以这个想法在实践中需要做很多工作。

独立的网络也解决了安全问题。

这就是VPC背后的核心思想:每个人在AWS内部都获得自己的私有网络。

顺便说一下,为什么我要花这么长时间讨论VPC?这篇文章不是关于把应用程序放在云上吗?

有两个原因:

  1. 因为我们构建的所有东西都将在VPC中进行,所以它是我们的起点。
  2. 因为VPC不是你能看到的东西,而我喜欢可视化我的互联网架构。其他人以一种对我来说非常混乱的方式可视化它,我想让它对你来说不那么混乱。

人们这样可视化VPC。首先,他们会说:"哦,我在一个区域内创建了一个新的VPC,里面有四个子网,分布在两个可用区内。"

然后他们会画一个类似这样的图:

AWS VPC示意图 图6:区域内的VPC和可用区

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

AWS官方VPC图 图7:AWS官方文档中的VPC图(来自AWS VPC文档)

现在,

  • 区域是一个你可以去的地方,
  • 可用区有你可以走进去的数据中心,这些数据中心里有很多服务器。

这两者都是实际的物理地点。但VPC是什么?它是覆盖在数据中心上的一个大型防水布?它是一片黑暗的迷雾?它是一种不安的感觉,笼罩着整个区域,所有数据中心都在循环播放Radiohead的"Fitter, Happier"?

VPC是什么?

我们已经讨论了为什么AWS需要VPC,以及VPC背后的想法,但它们是如何实现的?它们实际上是如何工作的?

你在AWS中的实例总是运行在VPC内。但在现实中,当然,你的实例只是在AWS数据中心的服务器上运行。

你可能有多个实例运行在多个不同的服务器上。Amazon如何将这些实例(跨不同服务器)连接到它们自己的私有网络中?它使用了一种称为映射服务的东西。

映射服务

假设我在服务器1上有一个实例A,我想与服务器2上的另一个实例B通信。

两台服务器上的实例 图8:两台服务器上的实例

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

映射服务 图9:映射服务

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

映射服务就是隔离我们的服务器的关键。

AWS中的两个VPC 图10:AWS中具有相同IP地址服务器的两个VPC

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

所以当你想到VPC时,想象一个服务,它将所有这些实例连接在一起。

连接的实例 图11:通过VPC连接的实例

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

VPC跨可用区 图12:跨越两个可用区的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文件中,你还需要一些用于terraformprovider的样板代码块。

总结

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