

# Networking
<a name="microvms-networking"></a>

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

## 概述
<a name="microvms-networking-overview"></a>

每个 MicroVM 都可以具有独立的入口（入站）和出口（出站）网络配置：
+ **入口网络连接器**用于实现入站连接。客户端会连接到一个由服务托管的 HTTPS 端点，Lambda 会将流量转发到您在 MicroVM 中配置的端口。入口连接器是由 Amazon 托管的，您需要在运行 MicroVM 时通过 ARN 来引用。
+ **出口网络连接器**用于支持出站流量。MicroVM 会默认具有公共互联网访问权限。您可以改为创建客户自主管理型 VPC 出口连接器，通过您的 VPC 路由出站流量。

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

## 入站连接
<a name="microvms-networking-inbound"></a>

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

默认情况下，在该端点收到的请求会路由到 MicroVM 内的 8080 端口。要路由到其他端口，请参阅[端口路由](#microvms-networking-port-routing)。

入站端点支持以下协议：
+ HTTP/1.1
+ HTTP/2
+ WebSocket
+ gRPC
+ 服务器发送的事件（SSE）

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

### 端口路由
<a name="microvms-networking-port-routing"></a>

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

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

1. **WebSocket 子协议**：如果您的 WebSocket 客户端无法设置自定义标头，请将目标端口指定为名称为 `lambda-microvms.port.{{N}}` 的子协议，其中 {{N}} 是端口号。您需要在打开 WebSocket 连接时提供子协议。有关示例，请参阅[协议](microvms-launching.md#microvms-launching-websocket)。

1. **默认（8080）**：如果以上两项均未指定，则请求会路由到 8080 端口。

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

### 身份验证
<a name="microvms-networking-auth"></a>

对一个 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](microvms-launching.md#microvms-launching-connecting)。

### 错误响应
<a name="microvms-networking-errors"></a>

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


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

### 请求标头
<a name="microvms-networking-headers"></a>

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

### 请求/响应带宽
<a name="microvms-networking-bandwidth"></a>

每个 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 支持
<a name="microvms-networking-http2"></a>

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。

## 出站连接
<a name="microvms-networking-outbound"></a>

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

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

## 使用出口网络连接器
<a name="microvms-networking-connectors"></a>

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

### 先决条件
<a name="microvms-networking-connectors-prereqs"></a>

在创建网络连接器之前，您需要拥有一个允许 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"
        }
      }
    }
  ]
}
```

### 创建网络连接器
<a name="microvms-networking-connectors-create"></a>

通过指定您的 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
```

### 网络连接器状态
<a name="microvms-networking-connectors-states"></a>

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


| 州 | 说明 | 
| --- | --- | 
| PENDING | 正在创建连接器（正在预调配底层 ENI）。 | 
| ACTIVE | 连接器已准备就绪，可以使用。 | 
| INACTIVE | 连接器暂时处于非活动状态。 | 
| FAILED | 预调配或更新失败。检查 StateReason。 | 
| DELETING | 正在删除连接器；正在清理 ENI。 | 
| DELETE\_FAILED | 删除失败。 | 

### 使用网络连接器运行 MicroVM
<a name="microvms-networking-connectors-run"></a>

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