亚马逊AWS官方博客

VPC Lattice 简介 — 简化服务到服务通信的联网(预览版)

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

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

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

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

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

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

  • 一两个侦听器,用于定义服务预期流量所依赖的端口和协议。支持的协议包括 HTTP/1.1、HTTP/2 和 gRPC,包括支持 TLS 的服务的 HTTPS。
  • 侦听器的规则包括优先级(指定处理规则的顺序)、定义何时应用规则的一个或多个条件,以及将流量转发到目标组的操作。每个侦听器都有一个默认规则,该规则在未配置其他规则或不满足任何条件时生效。
  • 目标组是一组目标或计算资源,这些目标或计算资源在运行您正尝试路由到的特定工作负载。目标可以是 Amazon Elastic Compute Cloud(Amazon EC2)实例、IP 地址和 Lambda 函数。对于 Kubernetes 工作负载,VPC Lattice 可以通过适用于 Kubernetes 的 AWS 网关控制器来定位服务和容器组(pod)。要访问适用于 Kubernetes 的 AWS 网关控制器,您可以加入预览版

VPC Lattice 逻辑架构。

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

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

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

  • 服务网络管理员可以:
    • 创建和管理服务网络。
    • 定义服务网络的访问和监控。
    • 关联客户端和服务。
    • 与其他 AWS 账户共享服务网络。
  • 服务所有者可以:
    • 创建和管理服务,包括访问和监控。
    • 定义路由,例如,配置指向运行服务的目标组侦听器和规则。
    • 将服务关联到服务网络。

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

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

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

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

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
  return 'Hello from the instance'

@app.route('/<path>')
def somePath(path):
  return 'Hello from the instance at path "{}"'.format(path)

app.run(host='0.0.0.0', port=8080)

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

flask

我安装依赖项:

pip3 install -r requirements.txt

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

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

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

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

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

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

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

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

控制台屏幕截图。

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

控制台屏幕截图。

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

控制台屏幕截图。

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

控制台屏幕截图。

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

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

控制台屏幕截图。

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

控制台屏幕截图。

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

控制台屏幕截图。

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

控制台屏幕截图。

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

控制台屏幕截图。

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

控制台屏幕截图。

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

控制台屏幕截图。

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

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

控制台屏幕截图。

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

控制台屏幕截图。

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

控制台屏幕截图。

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

控制台屏幕截图。

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

控制台屏幕截图。

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

控制台屏幕截图。

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

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

控制台屏幕截图。

使用 VPC Lattice 测试对服务的访问权限
我查看了服务的 Routing(路由)选项卡,以很好地概述侦听器如何处理针对不同目标群组的路由。

控制台屏幕截图。

然后,我在第二个 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-instance/to-function 路径时,附加规则将请求分别转发到实例和函数。

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
“来自函数的问候”

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

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

控制台屏幕截图。

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

控制台屏幕截图。

预览版现已推出
Amazon VPC Lattice 预览版在美国西部(俄勒冈州)区域提供。

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

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

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