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 子网、安全组和网络协议(IPv4 或 DualStack)来创建连接器:

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 时出现网络连接问题。

您可以使用 AWS PrivateLink,通过 AWS 网络在 VPC 资源与 Lambda MicroVM 之间进行私有连接,而无需经过公有互联网。MicroVM 支持两个 VPC 终端节点,具体取决于所需的流量目的地: MicroVM 支持两个 VPC 端点,具体取决于所需的流量目标:

  • MicroVM 管理 API(创建映像、运行、暂停、终止):使用现有的 Lambda VPC 端点 (com.amazonaws.region.lambda)。

  • 连接到 MicroVM(流向正在运行的应用程序的 HTTPS 流量):使用单独的端点 (com.amazonaws.region.lambda-microvm)。

Lambda MicroVM 与 Lambda (com.amazonaws.region.lambda) 共享同一个 VPC 端点服务。有关完整说明,请参阅为 Lambda 创建接口端点。

要控制哪些用户可以使用您的接口端点,以及他们可以执行哪些 Lambda MicroVM API 操作,请附加端点策略。该策略指定了可以执行操作的主体、他们可以执行的操作以及他们可以操作的资源。Lambda MicroVM 操作使用 lambda: IAM 操作前缀。

有关更多信息,请参阅《Amazon VPC User Guide》中的 Controlling access to services with VPC endpoints。

以下示例策略允许用户 MyUser 通过端点列出和获取 MicroVM 映像:

{ "Statement": [ { "Principal": { "AWS": "arn:aws:iam::111122223333:user/MyUser" }, "Effect": "Allow", "Action": [ "lambda:ListMicrovmImages", "lambda:GetMicrovmImage" ], "Resource": "*" } ] }

要使流向正在运行的 MicroVM 的 HTTPS 流量保持私有,请为 com.amazonaws.region.lambda-microvm 服务创建接口端点。此端点处理与 MicroVM 端点 URL 的连接(例如 abc123def456.lambda-microvm.us-east-1.on.aws)。

要了解有关接口端点属性的更多信息,请查看《Amazon VPC 文档》中的接口端点指南。

为 MicroVM 连接创建接口端点(控制台)

  1. 打开 Amazon VPC 控制台的 Endpoints(端点)页面。

  2. 选择创建端点。

  3. 对于服务类别,请确保选择 AWS 服务。

  4. 对于服务名称,选择 com.amazonaws.region.lambda-microvm。验证“类型”是否为接口。

  5. 创建 VPC 和子网。

  6. 要为接口端点启用私有 DNS,请选中启用 DNS 名称复选框(推荐)。这样可以确保使用公有 MicroVM 端点主机名的请求自动解析到接口端点,无需在客户端进行任何更改。

  7. 对于安全组,选择一个或多个安全组。安全组必须允许端口 443 上的出站 TCP 流量流向端点网络接口。

  8. 选择创建端点。

要使用私有 DNS 选项,您必须设置 VPC 的 enableDnsHostnames 和 enableDnsSupport 属性。有关更多信息,请参阅《Amazon VPC 用户指南》中的查看和更新 VPC 的 DNS 支持。

为 MicroVM 连接创建接口端点(AWS CLI)

aws ec2 create-vpc-endpoint \ --vpc-id vpc-ec43eb89 \ --vpc-endpoint-type Interface \ --service-name com.amazonaws.us-east-1.lambda-microvm \ --subnet-id subnet-abababab \ --security-group-id sg-1a2b3c4d \ --private-dns-enabled

要验证端点是否可用以及私有 DNS 是否生效,请执行以下操作:

aws ec2 describe-vpc-endpoints \ --vpc-endpoint-ids vpce-1a2b3c4d5e6f7g8h9 \ --query 'VpcEndpoints[0].{State:State,PrivateDns:PrivateDnsEnabled,Dns:DnsEntries[*].DnsName}'

启用私有 DNS 时:该端点会管理 VPC 内 *.lambda-microvm.region.on.aws 的 DNS 解析。您现有的 MicroVM 端点主机名(例如 abc123def456.lambda-microvm.us-east-1.on.aws)将解析为端点网络接口的私有 IP 地址。无需更改客户端。

禁用私有 DNS 时:Amazon VPC 会为端点生成一个特定于端点的 DNS 名称,格式为 vpce-id-hash.lambda-microvm.region.vpce.amazonaws.com。要通过此端点路由流量,同时仍能到达正确的 MicroVM,必须在两个位置保留原始 MicroVM 主机名:

  • TLS 服务器名称指示(SNI):TLS 握手使用此值来识别连接所对应的 MicroVM。

  • HTTP 主机标头:代理使用此值将请求路由到正确的 MicroVM。

如果将任一值设置为 VPC 端点主机名而非 MicroVM 主机名,连接将无法路由到正确的 MicroVM。

示例:通过特定于端点的 DNS 名称进行连接

以下示例使用带有 --connect-to 标志的 curl,将 TCP 连接重定向到 VPC 端点,同时在 URL、SNI 和 Host 标头中保留 MicroVM 主机名:

ENDPOINT_HOST=abc123def456.lambda-microvm.us-east-1.on.aws VPCE_HOST=vpce-0a1b2c3d4e5f67890-a1b2c3d4.lambda-microvm.us-east-1.vpce.amazonaws.com curl --connect-to "$ENDPOINT_HOST:443:$VPCE_HOST:443" \ -H "x-aws-proxy-auth: $MICROVM_AUTH_TOKEN" \ -H "x-aws-proxy-port: 8080" \ "https://$ENDPOINT_HOST/"

--connect-to 标志指示 curl 向 VPC 端点地址建立 TCP 连接,而 URL、TLS SNI 和 Host 标头仍保持设置为 MicroVM 主机名。

有关更多信息,请参阅《Amazon VPC 用户指南》中的通过接口端点访问服务。

您可以附加端点策略来控制哪些 MicroVM 可通过 lambda-microvm VPC 端点进行访问。lambda-microvm 服务上的端点策略允许您将连接范围限定为特定账户或组织。默认情况下,该端点允许连接到任何 AWS 账户中的 MicroVM。(注意:建立连接的客户端仍必须持有有效的 MicroVM 身份验证令牌才能获得访问权限)。

默认情况下,VPC 端点具有允许所有流量的完全访问策略。当您将默认策略替换为自定义策略时,Lambda MicroVM 会针对通过该端点建立的每个连接,根据 lambda:ConnectMicrovm 操作评估该策略。如果该策略不允许连接到 MicroVM,连接将被拒绝,并返回 HTTP 403 Forbidden 响应。未授予 lambda:ConnectMicrovm 的策略将拒绝通过该端点建立的所有连接。

注意

lambda:ConnectMicrovm 操作授权通过接口端点连接到 MicroVM 端点。它并非 Lambda API 操作,不能用于基于 IAM 身份或基于资源的策略,仅在 VPC 端点策略中有效。

主体和资源

连接到 MicroVM 端点时,使用 MicroVM 身份验证令牌而非 AWS 签名版本 4 进行身份验证。因此,没有 IAM 主体与该连接关联。相反,Lambda MicroVM 会以匿名主体来评估端点策略。这意味着:

  • Principal 必须是 "*"。指定特定主体的策略不会匹配任何内容,并会拒绝所有连接。

  • 依赖于请求者身份的条件键(例如 aws:PrincipalArn、aws:PrincipalOrgID 和 aws:userid)不会被填充,因而无法匹配。

  • Resource 也必须为 "*"。Lambda MicroVM 不会将端点策略评估范围限定为单个 MicroVM 资源 ARN。要限制端点可以访问哪些 MicroVM,请使用 aws:ResourceAccount 条件键,而非 Resource 元素。

支持的条件键

条件键 说明
aws:ResourceAccount 拥有所连接 MicroVM 的 AWS 账户。
aws:ResourceOrgID 拥有 MicroVM 的账户的 AWS Organizations 组织 ID。
aws:SourceVpce 连接所经过接口端点的 ID。
aws:SourceVpc 连接来源 VPC 的 ID。
aws:VpcSourceIp 建立连接的客户端的私有 IP 地址。

示例:仅允许连接到您自己账户中的 MicroVM

以下端点策略仅允许通过该端点连接到账户 111122223333 拥有的 MicroVM。与任何其他账户拥有的 MicroVM 建立连接均会被拒绝。

{ "Statement": [ { "Principal": "*", "Effect": "Allow", "Action": "lambda:ConnectMicrovm", "Resource": "*", "Condition": { "StringEquals": { "aws:ResourceAccount": "111122223333" } } } ] }