View a markdown version of this page

ネットワーク - AWS Lambda

ネットワーク

実行時にネットワークコネクタリソースを MicroVM に関連付けることで AWS Lambda MicroVMs のネットワークアクセスを設定します。ネットワークコネクタは、run-microvm を呼び出すときに指定されます。MicroVM の実行中に変更することはできません。

概要

各 MicroVM は、独立した入力 (インバウンド) ネットワーク設定と出力 (アウトバウンド) ネットワーク設定を持つことができます。

  • 入力ネットワークコネクタは、インバウンド接続を有効にします。クライアントはサービスマネージド HTTPS エンドポイントに接続し、Lambda は MicroVM 内で設定したポートにトラフィックを転送します。入力コネクタは AWS マネージドです (MicroVM の実行時に ARN で参照します)。

  • 出力ネットワークコネクタはアウトバウンドトラフィックを有効にします。デフォルトでは、MicroVM にはパブリックインターネットアクセスがあります。カスタマーマネージド VPC 出力コネクタを作成して、VPC 経由でアウトバウンドトラフィックをルーティングすることもできます。

1 つのコネクタを複数の MicroVM で再利用できます。これは意図した使用パターンです。

インバウンド接続

各 Lambda MicroVM は、run-microvm を呼び出したときに割り当てられた一意の HTTPS エンドポイント URL でアクセスできます。クライアントは、このエンドポイントに HTTPS 経由でリクエストを送信します。Lambda は、各リクエストを MicroVM 内のポートにルーティングし、そこでアプリケーションがリクエストを受信します。

デフォルトでは、エンドポイントで受信されたリクエストは MicroVM 内のポート 8080 にルーティングされます。別のポートにルーティングするには、「ポートルーティング」を参照してください。

インバウンドエンドポイントでは、次のプロトコルがサポートされています。

  • HTTP/1.1

  • HTTP/2

  • WebSockets

  • 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 Encryption) 文字列です。

  • 特定の 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 に接続する」を参照してください。

エラーレスポンス

リクエストを処理できない場合、またはアプリケーションにリクエストを配信できない場合、次の HTTP ステータスコードが MicroVM エンドポイントから返されます。これらのレスポンスは、アプリケーションからではなく、エンドポイントから送信されます。

コード ステータス 原因と解決方法
400 Bad Request 不正な形式のリクエスト、または無効なポートヘッダーか WebSocket サブプロトコル。形式を確認してください。
403 Forbidden トークンがないか、期限切れであるか、無効です。またはリクエストされたポートがトークンの allowedPorts にありません。新しいトークンを生成するか、許可されたポートを使用してください。
429 リクエストが多すぎます レート制限を超えました (アカウントレベルまたは MicroVM あたり)。エクスポネンシャルバックオフを使用して再試行してください。
500 Internal Server Error 内部エラーが発生しました。リクエストを再試行します。
502 Bad Gateway アプリケーションが応答しないか、自動再開が最大再試行回数以内に成功しませんでした。「自動再開」を参照してください。

[Request headers] (リクエストヘッダー)

X-aws-proxy-* ヘッダー名前空間は、認証トークン (X-aws-proxy-auth) やターゲットポート (X-aws-proxy-port) などのリクエストメタデータ用に Lambda によって予約されています。Lambda は、リクエストをアプリケーションに転送する前に X-aws-proxy-* ヘッダーを削除します。

リクエスト/レスポンス帯域幅

各 Lambda MicroVM には、そのサイズに合わせて直線的にスケールするリクエスト/レスポンス帯域幅があります。この帯域幅は、MicroVM エンドポイント経由のすべてのトラフィック (インバウンドリクエストとアウトバウンドレスポンスの両方を含む) に適用されます。

MicroVM のサイズ (ベースライン) 最大帯域幅
0.5 GB、0.25 vCPU 1 MB/秒 (8 Mbps)
1 GB、0.5 vCPU 2 MB/秒 (16 Mbps)
2 GB、1 vCPU 4 MB/秒 (32 Mbps)
4 GB、2 vCPU 8 MB/秒 (64 Mbps)
8 GB、4 vCPU 16 MB/秒 (128 Mbps)

ネットワーク飽和が原因でリクエストレイテンシーが増加した場合は、リクエストの同時実行数またはペイロードサイズを減らすか、より大きな MicroVM サイズを選択して使用可能な帯域幅を増やします。

HTTP/2 サポート

Lambda MicroVMs は、インバウンドエンドポイントで HTTP/2 をサポートします。Lambda は、TLS ハンドシェイク中に ALPN (Application-Layer Protocol Negotiation) を介してプロトコルをネゴシエートし、HTTP/2 を優先して HTTP/1.1 にフォールバックします。HTTP/2 対応クライアントは、これを自動的に使用します。

MicroVM 内のエンドポイントとアプリケーションの間で HTTP/2 を使用するには:

  • アプリケーションは TLS が提供する場合 – Lambda は ALPN を介してアプリケーションと HTTP/2 をネゴシエートし、HTTP/2 がサポートされていない場合は HTTP/1.1 にフォールバックします。

  • アプリケーションがプレーンテキストの HTTP を提供する場合 – アプリケーションへの接続で HTTP/2 を使用するようにリクエストに X-aws-proxy-force-h2: true ヘッダーを含めます。

アウトバウンド接続

デフォルトでは、Lambda MicroVMs の出力パスにはパブリックインターネットアクセスがあります。MicroVM を Direct Connect または VPN 経由でプライベート VPC 内のリソース (RDS、ElastiCache、内部 API、オンプレミスシステムなど) に接続するには、VPC 設定で Lambda ネットワークコネクタを作成します。

VPC 出力を使用する場合、アウトバウンドトラフィックには、VPC 内のトラフィックを管理するセキュリティグループルールとネットワーク ACL が適用されます。

出力ネットワークコネクタを操作する

出力ネットワークコネクタは、MicroVM からのアウトバウンドトラフィックを VPC 経由でルーティングします。run-microvm コマンドから MicroVM を起動するときにコネクタを 1 回作成して ARN で参照します。

前提条件

ネットワークコネクタを作成するには、Lambda が VPC に Elastic Network Interface (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

ネットワークコネクタの状態

run-microvm で参照するには、コネクタが ACTIVE 状態である必要があります。

状態 説明
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 を使用すれば、パブリックインターネットを経由せずに VPC リソースと Lambda MicroVMs 間の AWS ネットワークを介したプライベート接続が可能です。MicroVMs は、トラフィックの送信先に応じて 2 つの VPC エンドポイントをサポートします。

  • MicroVM が管理する API (イメージの作成、実行、一時停止、終了) – 既存の Lambda VPC エンドポイント (com.amazonaws.region.lambda) を使用します。

  • MicroVMs への接続 (実行中のアプリケーションへの HTTPS トラフィック) – 別のエンドポイント (com.amazonaws.region.lambda-microvm) を使用します。

Lambda MicroVMs は、Lambda (com.amazonaws.region.lambda) と同じ VPC エンドポイントサービスを共有します。詳細な手順については、「Lambda のインターフェイスエンドポイントの作成」を参照してください。

インターフェイスエンドポイントを使用できるユーザーと、彼らが実行できる Lambda MicroVMs API アクションとを制御するには、エンドポイントポリシーをアタッチします。このポリシーは、アクションを実行できるプリンシパル、プリンシパルが実行できるアクション、プリンシパルがアクションを実行できるリソースを指定します。Lambda MicroVMs アクションは、lambda: IAM アクションプレフィックスを使用します。

詳細については、「Amazon VPC ユーザーガイド」の「VPC エンドポイントによるサービスのアクセスコントロール」を参照してください。

ユーザー MyUser に、エンドポイントを介して MicroVM イメージを一覧表示し、取得することを許可するポリシーの例を以下に示します。

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

実行中の MicroVMs への HTTPS トラフィックをプライベートに保つには、com.amazonaws.region.lambda-microvm サービスのインターフェイスエンドポイントを作成します。このエンドポイントは、MicroVM エンドポイント URL (例: abc123def456.lambda-microvm.us-east-1.on.aws) への接続を処理します。

インターフェイスエンドポイントのプロパティの詳細については、「Amazon VPC ドキュメント」の「interface endpoints guide」を参照してください。

MicroVM 接続のインターフェイスエンドポイントを作成するには (コンソール)

  1. Amazon VPC コンソールの [Endpoints (エンドポイント)] ページを開きます。

  2. エンドポイントの作成 を選択します。

  3. [サービスカテゴリ] で、[AWS サービス] が選択されていることを確認します。

  4. [Service Name] (サービス名)には com.amazonaws.region.lambda-microvm を選択します。[タイプ] が [インターフェイス] であることを確認します。

  5. VPC とサブネットを選択します。

  6. インターフェイスエンドポイントのプライベート DNS を有効にするには、[DNS 名を有効にする] チェックボックスをオンにします (推奨)。これにより、パブリック MicroVM エンドポイントホスト名を使用するリクエストがインターフェイスエンドポイントに自動的に解決されます。クライアント側の変更は不要です。

  7. [セキュリティグループ] で、1 つ以上のセキュリティグループを選択します。セキュリティグループは、エンドポイントネットワークインターフェイスに対する、ポート 443 でのアウトバウンド TCP トラフィックを許可する必要があります。

  8. エンドポイントの作成 を選択します。

オプションとしてプライベート DNS を使用するには、VPC の enableDnsHostnames および enableDnsSupport 属性を設定する必要があります。詳細については、「Amazon VPC ユーザーガイド」の「VPC の DNS サポートを表示および更新する」を参照してください。

MicroVM 接続のインターフェイスエンドポイントを作成するには (AWS コンソール)

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 ホスト名を次の 2 か所に保持する必要があります。

  • TLS Server Name Indication (SNI) – TLS ハンドシェイクは、この値を使用して接続の対象となる MicroVM を識別します。

  • HTTP Host ヘッダー – プロキシは、この値を使用してリクエストを正しい MicroVM にルーティングします。

いずれかの値が MicroVM ホスト名ではなく VPC エンドポイントホスト名に設定されていると、接続を正しい MicroVM にルーティングすることができません。

例: エンドポイント固有の DNS 名を介した接続

次の例では、curl に --connect-to フラグを使用して、MicroVM ホスト名を URL、SNI、Host ヘッダーに維持したまま、TCP 接続を VPC エンドポイントにリダイレクトします。

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 フラグは、VPC エンドポイントアドレスに対して TCP 接続を開くよう curl に指示しますが、URL、TLS SNI、Host ヘッダーは MicroVM ホスト名のまま維持されます。

詳細については、「Amazon VPC ユーザーガイド」の「インターフェイスエンドポイントを介したサービスへのアクセス」を参照してください。

エンドポイントポリシーをアタッチすれば、どの MicroVMs に lambda-microvm VPC エンドポイント経由でアクセスできるかを制御できます。lambda-microvm サービスのエンドポイントポリシーを使用すると、接続の範囲を特定のアカウントまたは組織に絞ることができます。デフォルトでは、このエンドポイントは任意の AWS アカウント内の MicroVMs への接続を許可します。(注: アクセスを許可するには、接続を確立するクライアントが有効な MicroVM 認証トークンを保持している必要があります)。

デフォルトでは、VPC エンドポイントにはすべてのトラフィックを許可するフルアクセスポリシーが設定されています。このデフォルトのポリシーをカスタムポリシーに置き換えると、Lambda MicroVMs は、このエンドポイント経由で行われるすべての接続において、lambda:ConnectMicrovm アクションに対してそのポリシーを評価します。ポリシーで MicroVMs への接続が許可されていない場合、接続は HTTP 403 Forbidden の応答で拒否されます。lambda:ConnectMicrovm を許可しないポリシーは、エンドポイント経由のすべての接続を拒否します。

注記

lambda:ConnectMicrovm アクションは、インターフェイスエンドポイント経由の MicroVM エンドポイントへの接続を許可します。これは Lambda API のオペレーションではないため、IAM アイデンティティベースまたはリソースベースのポリシーでは使用できず、VPC エンドポイントポリシーのみで有効です。

プリンシパルとリソース

MicroVM エンドポイントへの接続は、AWS 署名バージョン 4 ではなく MicroVM 認証トークンにより認証されます。そのため、この接続には IAM プリンシパルは関連付けられていません。代わりに、Lambda MicroVMs は匿名プリンシパルを使用してエンドポイントポリシーを評価します。つまり、次のようになります。

  • Principal は である必要があります。"*"特定のプリンシパルを指定するポリシーは、いずれにも一致することなく、すべての接続を拒否します。

  • リクエスタ ID に依存する条件キー (aws:PrincipalArn、aws:PrincipalOrgID、aws:userid など) は生成されず、一致しません。

  • Resource も "*" である必要があります。Lambda MicroVMs は、エンドポイントポリシーの評価を個別の MicroVM リソース ARN に限定しません。エンドポイントが到達できる MicroVMs を制限するときは、Resource 要素ではなく aws:ResourceAccount 条件キーを使用します。

サポートされている条件キー

条件キー 説明
aws:ResourceAccount 接続先の MicroVM を所有している AWS アカウント。
aws:ResourceOrgID MicroVM を所有しているアカウントの AWS Organizations 組織 ID。
aws:SourceVpce 接続が経由したインターフェイスエンドポイントの ID。
aws:SourceVpc 接続の発信元である VPC の ID
aws:VpcSourceIp 接続を行ったクライアントのプライベート IP アドレス。

例: 自分のアカウントの MicroVMs への接続のみを許可する

次のエンドポイントポリシーでは、アカウント 111122223333 が所有する MicroVMs へのエンドポイント経由の接続のみを許可しています。他のアカウントが所有する MicroVMs への接続は拒否されます。

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