VPC 简介 — 简化服务到服务通信的联网(预览版)by 04 12月

现代化应用程序使用模块化和分布式组件进行构建。每个组件都是一项实现其自身功能子集的服务。要使这些服务相互通信,您需要一种方法使其发现其自身的位置、授予访问权限和路由流量。在对问题进行故障排除时,您需要控制通信配置,以便快速了解应用程序、服务和网络层面正在发生的情况。这可能会花费您很多时间。

我们现在推出了 VPC 预览版,这是 Cloud( VPC)的一项新功能,可让您以一致的方式连接、保护和监控服务之间的通信。借助 VPC ,您可以定义流量管理、网络访问和监控策略,这样您就可以通过 AWS 计算服务(实例、容器和无服务器函数)以简单一致的方式连接应用程序。VPC 自动处理 VPC 和账户之间的网络连接,以及 IPv4、IPv6 和重叠 IP 地址之间的网络地址转换。VPC 与 AWS and (AWS IAM)集成,为您提供当今与 AWS 服务交互时您所熟悉的相同身份验证和授权功能,但仅用于您自己的服务到服务通信。使用 VPC ,您可以根据请求特征和加权路由,对蓝/绿和金丝雀式部署进行通用控制来路由流量。例如,VPC 允许您混合搭配给定服务的计算类型,这有助于您实现整体式应用程序架构现代化,将其改造为微服务。

VPC 采用非侵入性设计,允许组织内的团队随着时间的推移逐渐选择加入。通过这种方式,VPC 可以处理服务到服务的联网、安全和监控需求,而您可以通过专注于应用程序逻辑来更快地交付应用程序。

VPC 工作原理

使用 VPC ,您可以创建一个称为服务网络的逻辑应用程序层网络,该网络连接不同的 VPC 和账户之间的客户端和服务,从而抽象了网络的复杂性。服务网络是一个逻辑边界,用于自动实现服务发现和连接,以及将访问和可观察性策略应用于服务集合。它在 VPC 内通过 HTTP/HTTPS 和 gRPC 协议提供应用程序间连接。

为服务网络启用 VPC 后,该 VPC 中的客户端将能够自动通过 DNS 发现服务网络中的服务,并将通过 VPC 引导所有应用程序间流量。您可以使用 AWS (RAM)来控制哪些账户、VPC 和应用程序可以通过 VPC 建立通信。

服务是可独立部署的软件单元,用于提供特定的任务或功能。在 VPC 中,服务是一种逻辑组件,可以存在于任何 VPC 或账户中,并且可以在多种类型的计算(虚拟机、容器和无服务器函数)上运行。服务配置包括:

要配置服务访问控制,您可以使用访问策略。访问策略是一种 IAM 资源策略,可以与服务网络和单个服务相关联。通过访问策略,您可以使用“PARC”(主体、操作、资源和条件)模型对服务实施特定环境的访问控制。例如,您可以使用访问策略来定义哪些服务可以访问您拥有的服务。如果您使用 AWS ,则可以将对服务网络的访问限制为特定组织。

VPC 还提供服务目录,集中查看您拥有或已通过 AWS RAM 与您共享的服务。

使用 VPC

我们预期具有不同角色的人都可以使用 VPC 。例如:

服务所有者可以:

我们来看看这些步骤的实际操作。在该快速演练中,我将介绍这两个角色。

创建两个后端服务

本节中没有专门针对 VPC 的内容。我只是创建几个服务,一个在 EC2 上运行,另一个在 AWS 上运行,稍后我将在使用 VPC 配置联网时使用这些服务。

在 Linux EC2 实例中,我创建了一个 Web 应用程序,该应用程序对 HTTP 请求回复“来自实例的问候”。为了允许来自 VPC 的客户端访问该实例,我向安全组添加了一条入站规则,以允许来自 VPC AWS 托管的前缀列表的 8080 端口上的 TCP 流量。

这是 app.py 文件。我为这个应用程序使用 和 Flask,但您不需要了解它们也能学习这篇文章。

from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
  return 'Hello from the instance'
@app.route('/')
def somePath(path):
  return 'Hello from the instance at path "{}"'.format(path)
app.run(host='0.0.0.0', port=8080)

这是包含 依赖项的 .txt 文件。只有一行,因为我唯一需要的模块是 flask:

flask

我安装依赖项:

pip3 install -r requirements.txt

然后,我使用 nohup 命令启动 Web 应用程序,使其保持运行,以防我注销实例:

nohup flask run --host=0.0.0.0 --port 8080 &

在 EC2 实例上,Web 服务现在正在侦听端口 8080 上的 HTTP 流量。

在 控制台中,我使用 Node.js 18.x 运行时创建了一个简单的函数,该函数会对所有调用回复“来自函数的问候”。

exports.handler = async (event) => {
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from the function'),
    };
    return response;
};

这两项服务现在都准备就绪。让我们使用 VPC 来配置网络。

创建 VPC 目标组

我首先创建了两个目标组,一个用于 EC2 实例,另一个用于 函数。在 VPC (VPC 控制台)中,导航窗格中有一个新的 VPC 部分。在那里,我选择 (目标组),然后选择 group(创建目标组)。

对于第一个目标组,我选择 (实例)目标类型并输入名称。

我选择在实例上运行的 Web 应用程序使用的协议(HTTP)和端口(8080)。我选择运行实例的 VPC 和协议版本(HTTP1)。

现在,我可以配置用于测试目标状态的运行状况检查。在本例中,我使用控制台提出的默认值。

在下一步中,我可以注册目标。我从列表中选择运行 Web 应用程序的实例,然后选择将其包括在内。

我查看选定的目标(在本例中为一个实例),然后选择 (提交)。

以类似的方式,我为 函数创建了一个目标组。这次,我从列表中选择函数。我可以选择使用哪个函数版本或函数别名。为简单起见,我使用 $ 版本。

创建 VPC 服务

现在目标组已经准备就绪,我在导航窗格中选择 (服务),然后选择 (创建服务)。我输入名称和描述。

现在,我可以选择身份验证类型。如果我选择 None(无),则服务网络不会对客户端进行身份验证或授予访问权限,并且不使用身份验证策略(如果存在)。我选择 AWS IAM,然后从 Apply (应用策略模板)下拉列表中选择允许已进行身份验证和未经身份验证的访问模板。

在 (监控)部分,我打开了 logs(访问日志)。作为访问日志的目的地,我使用了我之前创建的 日志组。我也可以选择使用 ( S3)存储桶或 Data 交付流。

在下一步中,我为服务定义路由。我选择 Add (添加侦听器)。对于协议,我将服务配置为使用 HTTPS 进行侦听。在默认操作中,我选择将三分之二(权重 20)的请求发送到实例目标组,将三分之一(权重 10)发送到函数目标组。

然后,我再添加两条规则。第一条规则(优先级 10)将路径为 /to- 的所有请求发送到实例目标组。

第二条规则(优先级 20)将路径为 /to- 的所有流量发送到函数目标组。

在下一步中,系统要求我将服务与一个或多个服务网络相关联。我还没有创建服务网络,所以我暂时跳过此步骤并选择 Next(下一步)。我检查配置并创建服务。

创建 VPC 服务网络

现在,我创建了服务网络,这样我就可以将服务与我想要使用的 VPC 关联起来。我从导航窗格中选择 (服务网络),然后选择 (创建服务网络)。我输入服务网路的名称和描述。

在 (关联服务)中,我选择我刚才创建的服务。

在 VPC (VPC 关联)中,我选择运行 Web 应用程序的实例所使用的 VPC。这在将来可能会有所帮助,因为它允许 Web 应用程序调用与服务网络关联的其他服务。

然后,我选择第二个 VPC,在那里我有另一个 EC2 实例想要用来运行一些测试。

为简单起见,在 (访问)部分中,我选择 None(无)身份验证类型。

在 (监控)部分,我选择将整个服务网络的访问日志发送到 S3 存储桶。

我查看配置摘要并创建服务网络。几秒钟后,所有服务和 VPC 关联都处于活动状态,我就可以开始使用该服务了。

我从服务关联列表中写下了服务的域名。

使用 VPC 测试对服务的访问权限

我查看了服务的 (路由)选项卡,以很好地概述侦听器如何处理针对不同目标群组的路由。

然后,我在第二个 VPC 中登录 EC2 实例,并使用 curl 调用服务域名。不出所料,我从实例中得到了大约三分之二的响应,三分之一来自函数。

curl https://my-service-03e92ee54968d87ca.7d67968.vpc-lattice-svcs.us-west-2.on.aws
来自实例的问候
curl https://my-service-03e92ee54968d87ca.7d67968.vpc-lattice-svcs.us-west-2.on.aws
来自实例的问候
curl https://my-service-03e92ee54968d87ca.7d67968.vpc-lattice-svcs.us-west-2.on.aws
“来自函数的问候”

当我调用 /to- 和 /to- 路径时,附加规则将请求分别转发到实例和函数。

curl https://my-service-03e92ee54968d87ca.7d67968.vpc-lattice-svcs.us-west-2.on.aws/to-instance
来自实例“到实例”路径的问候
curl https://my-service-03e92ee54968d87ca.7d67968.vpc-lattice-svcs.us-west-2.on.aws/to-function
“来自函数的问候”

现在,我可以使用之前配置的访问日志订阅来查看对我的服务的访问权限。

对于这项服务,我在 日志组中查看。在那里,我找到了一个包含有关该服务的详细访问信息的日志流。

与服务网络关联的所有服务的访问日志位于 S3 存储桶上。我现在只有一项服务,但还会有更多服务。

预览版现已推出

VPC 预览版在美国西部(俄勒冈州)区域提供。

VPC 提供跨 AWS 计算类型的部署一致性,因此您可以跨实例、容器和无服务器函数连接服务。您可以使用 VPC 应用精细而丰富的流量控制,例如基于策略的路由和加权目标,以支持蓝/绿和金丝雀式部署。

VPC 允许使用详细的访问日志和指标对服务到服务的通信进行监控和故障排除,这些日志和指标可捕获请求类型、流量、错误率、响应时间等。这篇博客文章对 VPC 用途的介绍只是冰山一角。

简化使用 VPC 连接、保护和监控服务到服务通信的方式。