View a markdown version of this page

Networking - AWS Lambda

Networking

您可以通过在运行时将网络连接器资源关联到 MicroVM,从而为您的 AWS Lambda MicroVMs 配置网络访问权限。网络连接器将在您调用 run-microvm 时指定,无法在 MicroVM 运行时更改。

概述

每个 MicroVM 都可以具有独立的入口(入站)和出口(出站)网络配置:

  • 入口网络连接器用于实现入站连接。客户端会连接到一个由服务托管的 HTTPS 端点,Lambda 会将流量转发到您在 MicroVM 中配置的端口。入口连接器是由 AWS 托管的,您需要在运行 MicroVM 时通过 ARN 来引用。

  • 出口网络连接器用于支持出站流量。MicroVM 会默认具有公共互联网访问权限。您可以改为创建客户自主管理型 VPC 出口连接器,通过您的 VPC 路由出站流量。

单个连接器可以在多个 MicroVM 中重复使用,这是预期的使用模式。

入站连接

每个 Lambda MicroVM 都可通过您在调用 run-microvm 时分配的唯一 HTTPS 端点 URL 进行访问。客户端会通过 HTTPS 向该端点发送请求。Lambda 会将每个请求路由到您的 MicroVM 内的端口,并且您的应用程序将在该端点接收该请求。

默认情况下,在该端点收到的请求会路由到 MicroVM 内的 8080 端口。要路由到其他端口,请参阅端口路由

入站端点支持以下协议:

  • HTTP/1.1

  • HTTP/2

  • WebSocket

  • gRPC

  • 服务器发送的事件(SSE)

注意

客户端和 MicroVM 端点之间的流量始终使用 TLS 进行加密。您的应用程序可在内部通过 HTTP 或 HTTPS 传输请求。

端口路由

Lambda 将按以下优先顺序选择 MicroVM 内的目标端口:

  1. X-aws-proxy-port 标头:对于标准 HTTP 请求,请包含此标头以及目标端口号。

  2. WebSocket 子协议:如果您的 WebSocket 客户端无法设置自定义标头,请将目标端口指定为名称为 lambda-microvms.port.N 的子协议,其中 N 是端口号。您需要在打开 WebSocket 连接时提供子协议。有关示例,请参阅协议

  3. 默认(8080):如果以上两项均未指定,则请求会路由到 8080 端口。

重要

目标端口必须位于身份验证令牌中定义的 allowedPorts 范围内。向未获授权的端口发出的请求会收到 403 Forbidden 响应。

身份验证

对一个 MicroVM 端点的所有请求都需要在 X-aws-proxy-auth 标头中包含有效的身份验证令牌。您可以使用 create-microvm-auth-token 来生成令牌。每个令牌都是一个加密的 JWE(JSON Web 加密)字符串,其作用域为:

  • 某个特定的 MicroVM(由 ID 标识)。

  • 允许的端口集(单个端口、范围或所有端口)。

  • 过期时间(在创建令牌时配置)。

以下示例会创建一个令牌并用来发送已通过身份验证的请求:

aws lambda-microvms create-microvm-auth-token \ --microvm-identifier microvm-id \ --expiration-in-minutes 30 \ --allowed-ports '[{"port":8080}]'
curl 'https://microvm-endpoint' \ -H 'X-aws-proxy-auth: TOKEN' \ -H 'X-aws-proxy-port: 8080'

有关创建令牌和连接到 MicroVM(包括 WebSocket 连接)的完整演示,请参阅连接到 MicroVM

错误响应

当 MicroVM 端点无法处理或向您的应用程序传输请求时,将会返回以下 HTTP 状态代码。这些响应来自端点,而不是来自应用程序。

代码 Status 原因和解决方法
400 Bad Request 请求格式不正确,或者端口标头或 WebSocket 子协议无效。验证格式。
403 禁止 令牌缺失、已过期或无效;或者请求的端口不在令牌的 allowedPorts 中。生成新令牌,或使用允许的端口。
429 请求过多 已超出速率限制(账户级别或 MicroVM 级别)。使用指数回退进行重试。
500 Internal Server Error 出现内部错误。重试请求。
502 Bad Gateway 应用程序未响应,或自动恢复未在最大重试次数内成功。请参阅自动恢复

请求标头

X-aws-proxy-* 标头命名空间由 Lambda 保留,用于请求元数据,例如身份验证令牌 (X-aws-proxy-auth) 和目标端口 (X-aws-proxy-port)。在将请求转发给您的应用程序之前,Lambda 会移除 X-aws-proxy-* 标头。

请求/响应带宽

每个 Lambda MicroVM 都有一个可随其大小线性扩缩的请求/响应带宽。此带宽适用于通过 MicroVM 端点的所有流量,包括入站请求和出站响应。

MicroVM 大小(基准) 最大带宽
0.5 GB,0.25 个 vCPU 1 MB/s(8 Mbps)
1 GB,0.5 个 vCPU 2 MB/s(16 Mbps)
2 GB,1 个 vCPU 4 MB/s(32 Mbps)
4 GB,2 个 vCPU 8 MB/s(64 Mbps)
8 GB,4 个 vCPU 16 MB/s(128 Mbps)

如果由于网络饱和而导致请求延迟增加,请减少请求并发量或有效载荷大小,或者选择更大的 MicroVM 大小来增加可用带宽。

HTTP/2 支持

Lambda MicroVMs 支持入站端点上的 HTTP/2 流量。Lambda 在 TLS 握手期间通过 ALPN(应用程序层协议协商)来协商协议,并首选 HTTP/2,失败则回退到 HTTP/1.1。支持 HTTP/2 的客户端会自动使用此协议。

要在 MicroVM 内的端点和应用程序之间使用 HTTP/2,请执行以下操作:

  • 您的应用程序提供 TLS:Lambda 会通过 ALPN 与您的应用程序协商 HTTP/2,如果不支持 HTTP/2,则会回退到 HTTP/1.1。

  • 您的应用程序提供明文 HTTP:请在请求中包含 X-aws-proxy-force-h2: true 标头,以便在与应用程序的连接上使用 HTTP/2。

出站连接

默认情况下,Lambda MicroVMs 在出口路径上具有公共互联网访问权限。要通过 Direct Connect 或 VPN 将 MicroVM 连接到 RDS、ElastiCache、内部 API 和本地系统等私有 VPC 中的资源,请使用您的 VPC 配置创建一个 Lambda 网络连接器。

使用 VPC 出口时,出站流量受用于管理 VPC 中流量的安全组规则和网络 ACL 约束。

使用出口网络连接器

出口网络连接器通过您的 VPC 路由来自 MicroVM 的出站流量。您只需一次创建连接器,然后在通过 run-microvm 命令启动 MicroVM 时使用 ARN 引用即可。

先决条件

在创建网络连接器之前,您需要拥有一个允许 Lambda 在您的 VPC 中创建弹性网络接口(ENI)的 IAM 角色。该角色需要以下权限:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "CreateENI", "Effect": "Allow", "Action": "ec2:CreateNetworkInterface", "Resource": [ "arn:aws:ec2:*:*:network-interface/*", "arn:aws:ec2:*:*:subnet/*", "arn:aws:ec2:*:*:security-group/*" ] }, { "Sid": "TagENI", "Effect": "Allow", "Action": "ec2:CreateTags", "Resource": "arn:aws:ec2:*:*:network-interface/*", "Condition": { "StringEquals": { "ec2:ManagedResourceOperator": "network-connectors.lambda.amazonaws.com" } } } ] }

创建网络连接器

通过指定您的 VPC 子网、安全组和网络协议(IPv4DualStack)来创建连接器:

aws lambda-core create-network-connector \ --name my-connector \ --configuration '{ "VpcEgressConfiguration": { "SubnetIds": ["subnet-xxx"], "SecurityGroupIds": ["sg-xxx"], "NetworkProtocol": "IPv4", "AssociatedComputeResourceTypes": ["MicroVm"] } }' \ --operator-role arn:aws:iam::123456789012:role/NetworkConnectorOperatorRole

网络连接器状态

连接器必须处于 ACTIVE 状态,然后才能在 run-microvm 中引用。

说明
PENDING 正在创建连接器(正在预调配底层 ENI)。
ACTIVE 连接器已准备就绪,可以使用。
INACTIVE 连接器暂时处于非活动状态。
FAILED 预调配或更新失败。检查 StateReason
DELETING 正在删除连接器;正在清理 ENI。
DELETE_FAILED 删除失败。

使用网络连接器运行 MicroVM

在运行 MicroVM 时引用连接器 ARN:

aws lambda-microvms run-microvm \ --image-identifier arn:aws:lambda:us-east-1:123456789012:microvm-image:my-microvm-image \ --egress-network-connectors connector-arn \ --idle-policy '{"maxIdleDurationSeconds":900,"suspendedDurationSeconds":1800,"autoResumeEnabled":false}'
注意

在更新或删除连接器之前,应确保所有使用该连接器的 MicroVM 都已终止。修改正在使用的连接器可能会导致运行 MicroVM 时出现网络连接问题。