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 内的目标端口:
-
X-aws-proxy-port标头:对于标准 HTTP 请求,请包含此标头以及目标端口号。 -
WebSocket 子协议:如果您的 WebSocket 客户端无法设置自定义标头,请将目标端口指定为名称为
lambda-microvms.port.的子协议,其中NN是端口号。您需要在打开 WebSocket 连接时提供子协议。有关示例,请参阅协议。 -
默认(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-identifiermicrovm-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-connectorsconnector-arn\ --idle-policy '{"maxIdleDurationSeconds":900,"suspendedDurationSeconds":1800,"autoResumeEnabled":false}'
注意
在更新或删除连接器之前,应确保所有使用该连接器的 MicroVM 都已终止。修改正在使用的连接器可能会导致运行 MicroVM 时出现网络连接问题。
将 Lambda MicroVM 与接口 VPC 端点(AWS PrivateLink)结合使用
您可以使用 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
用于 MicroVM 管理 API 的 VPC 端点
Lambda MicroVM 与 Lambda (com.amazonaws.) 共享同一个 VPC 端点服务。有关完整说明,请参阅为 Lambda 创建接口端点。region.lambda
用于 MicroVM 管理 API 的端点策略
要控制哪些用户可以使用您的接口端点,以及他们可以执行哪些 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 连接的 VPC 端点
要使流向正在运行的 MicroVM 的 HTTPS 流量保持私有,请为 com.amazonaws. 服务创建接口端点。此端点处理与 MicroVM 端点 URL 的连接(例如 region.lambda-microvmabc123def456.lambda-microvm.us-east-1.on.aws)。
要了解有关接口端点属性的更多信息,请查看《Amazon VPC 文档》中的接口端点指南。
创建终端节点
为 MicroVM 连接创建接口端点(控制台)
-
打开 Amazon VPC 控制台的 Endpoints(端点)页面
。 -
选择创建端点。
-
对于服务类别,请确保选择 AWS 服务。
-
对于服务名称,选择
com.amazonaws.。验证“类型”是否为接口。region.lambda-microvm -
创建 VPC 和子网。
-
要为接口端点启用私有 DNS,请选中启用 DNS 名称复选框(推荐)。这样可以确保使用公有 MicroVM 端点主机名的请求自动解析到接口端点,无需在客户端进行任何更改。
-
对于安全组,选择一个或多个安全组。安全组必须允许端口 443 上的出站 TCP 流量流向端点网络接口。
-
选择创建端点。
要使用私有 DNS 选项,您必须设置 VPC 的 enableDnsHostnames 和 enableDnsSupport 属性。有关更多信息,请参阅《Amazon VPC 用户指南》中的查看和更新 VPC 的 DNS 支持。
为 MicroVM 连接创建接口端点(AWS CLI)
aws ec2 create-vpc-endpoint \ --vpc-idvpc-ec43eb89\ --vpc-endpoint-type Interface \ --service-name com.amazonaws.us-east-1.lambda-microvm \ --subnet-idsubnet-abababab\ --security-group-idsg-1a2b3c4d\ --private-dns-enabled
要验证端点是否可用以及私有 DNS 是否生效,请执行以下操作:
aws ec2 describe-vpc-endpoints \ --vpc-endpoint-idsvpce-1a2b3c4d5e6f7g8h9\ --query 'VpcEndpoints[0].{State:State,PrivateDns:PrivateDnsEnabled,Dns:DnsEntries[*].DnsName}'
私有 DNS 行为
启用私有 DNS 时:该端点会管理 VPC 内 *.lambda-microvm. 的 DNS 解析。您现有的 MicroVM 端点主机名(例如 region.on.awsabc123def456.lambda-microvm.us-east-1.on.aws)将解析为端点网络接口的私有 IP 地址。无需更改客户端。
禁用私有 DNS 时:Amazon VPC 会为端点生成一个特定于端点的 DNS 名称,格式为 。要通过此端点路由流量,同时仍能到达正确的 MicroVM,必须在两个位置保留原始 MicroVM 主机名:vpce-id-hash.lambda-microvm.region.vpce.amazonaws.com
-
TLS 服务器名称指示(SNI):TLS 握手使用此值来识别连接所对应的 MicroVM。
-
HTTP 主机标头:代理使用此值将请求路由到正确的 MicroVM。
如果将任一值设置为 VPC 端点主机名而非 MicroVM 主机名,连接将无法路由到正确的 MicroVM。
示例:通过特定于端点的 DNS 名称进行连接
以下示例使用带有 --connect-to 标志的 curl
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 连接的端点策略
您可以附加端点策略来控制哪些 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" } } } ] }