VPC によるプライベートネットワーク - AWS Lambda

VPC によるプライベートネットワーク

Amazon Virtual Private Cloud (Amazon VPC) は、AWS アカウント専用の、AWS クラウド上の仮想ネットワークです。Amazon VPC を使用して、データベース、キャッシュインスタンス、または内部サービスなどのリソースのプライベートネットワークを作成することができます。Amazon VPC の詳細については、Amazon VPC とは?を参照してください。

Lambda 関数は、常に Lambda サービスが所有する VPC 内で実行されます。Lambda はこの VPC にネットワークアクセスとセキュリティルールを適用し、VPC を自動的に維持および監視します。Lambda 関数がアカウント VPC 内のリソースにアクセスする必要がある場合は、VPC にアクセスするための関数を設定します。Lambda は、Hyperplane ENI という名前のマネージドリソースを提供します。これは、Lambda 関数が Lambda VPC からアカウント VPC 内の ENI (Elastic Network Interface) に接続するために使用します。

VPC または Hyperplane ENI は追加料金なしで使用できます。NAT ゲートウェイなど、一部の VPC コンポーネントには料金が発生します。詳細については、「Amazon VPC の料金」を参照してください。

VPC のネットワーク要素

Amazon VPC ネットワークには、次のネットワーク要素が含まれます。

  • Elastic Network Interface — Elastic Network Interface は、仮想ネットワークカードを表す VPC 内の論理ネットワーキングコンポーネントです。

  • サブネット — VPC の IP アドレスの範囲。AWS リソースは、指定したサブネット内に追加できます。インターネットに接続する必要があるリソースにはパブリックサブネットを、インターネットに接続しないリソースにはプライベートサブネットを使用してください。

  • セキュリティグループ — 各サブネットの AWS リソースへのアクセスを制御するために、セキュリティグループを使用します。

  • アクセスコントロールリスト (ACL) — ネットワーク ACL を使用して、サブネット内のセキュリティを強化します。デフォルトのサブネット ACL では、すべてのインバウンドトラフィックとアウトバウンドトラフィックを許可します。

  • ルートテーブル - AWS が VPC のネットワークトラフィックを指示するために使用するルートのセットが含まれています。サブネットを特定のルートテーブルに明示的に関連付けることができます。デフォルトでは、サブネットはメインルートテーブルと関連付けられています。

  • ルート — ルートテーブル内の各ルートは、IP アドレスの範囲と、Lambda がその範囲のトラフィックを送信する宛先を指定します。ルートはターゲット (トラフィックの送信に使用するゲートウェイ、ネットワークインターフェイス、または接続) も指定します。

  • NAT ゲートウェイ - VPC のプライベートサブネットからインターネットへのアクセスを制御する AWS ネットワークアドレス変換 (NAT) サービス。

  • VPC エンドポイント - Amazon VPC エンドポイントを使用すると、インターネット経由または NAT デバイス、VPN 接続、AWS Direct Connect 接続を必要とせずに、AWS でホストされているサービスへのプライベート接続を作成することができます。詳細については、「AWS PrivateLink および VPC エンドポイント」を参照してください。

ヒント

VPC とサブネットにアクセスするように Lambda 関数を設定するには、Lambda コンソールまたは API を使用します。

関数を設定するには、「CreateFunction」の「VpcConfig」セクションを参照してください。詳細なステップについては、「AWS アカウント の Amazon VPC への Lambda 関数のアタッチ」を参照してください。

Amazon VPC のネットワーキング定義の詳細については、「Amazon VPC デベロッパーガイド」の「Amazon VPC の仕組み」およびアマゾン VPC に関するよくある質問を参照してください。

Lambda 関数を VPC に接続する

Lambda 関数は、常に Lambda サービスが所有する VPC 内で実行されます。デフォルトでは、Lambda 関数はアカウントの VPC に接続されていません。アカウントの VPC に関数を接続すると、VPC からアクセス権が付与されない限り、関数はインターネットにアクセスできません。

Lambda は、Hyperplane ENI を使用して VPC 内のリソースにアクセスします。Hyperplane ENI は、VPC-to-VPC NAT (V2N) を使用して、Lambda VPC からアカウント VPC への NAT 機能を提供します。V2N は Lambda VPC からアカウント VPC への接続を提供しますが、その逆方向には接続できません。

Lambda 関数を作成する (または VPC 設定を更新すると)、Lambda は、関数の VPC のサブネット構成ごとに Hyperplane ENI を割り当てます。同じサブネットとセキュリティグループを共有する場合、複数の Lambda 関数が 1 つのネットワークインターフェイスを共有できます。

他の AWS サービスに接続する場合、VPC とサポートされた AWS サービス間のプライベート通信に VPC エンドポイントを使用することができます。代わりの方法は、NAT ゲートウェイを使用して、アウトバウンドトラフィックを別の AWS サービスにルーティングすることです。

インターネットへのアクセス権を関数に付与するには、アウトバウンドトラフィックをパブリックサブネットの NAT ゲートウェイにルーティングします。NAT ゲートウェイにはパブリック IP アドレスがあるため、VPC のインターネットゲートウェイを介してインターネットに接続できます。詳細については、VPC に接続された Lambda 関数にインターネットアクセスを有効にする を参照してください。

共有サブネット

VPC 共有を使用すると、複数の AWS アカウントで自分のアプリケーションリソース (Amazon EC2 インスタンス、Lambda 関数など) を、共有され一元管理されている仮想プライベートクラウド (VPC) 内に作成できます。このモデルでは、VPC を所有するアカウント (所有者) は、同じ AWS Organization に属する他のアカウント (参加者) と 1 つまたは複数のサブネットを共有します。

プライベートリソースにアクセスするには、関数を VPC 内のプライベート共有サブネットに接続します。関数をサブネットに接続するには、サブネットの所有者がユーザーにサブネットを共有している必要があります。サブネットの所有者は、後でサブネットの共有を解除して、接続を解除することもできます。共有サブネットの VPC リソースを共有、共有解除、管理する方法についての詳細は、Amazon VPC ガイドの「VPC を他のアカウントと共有する方法」を参照してください。

Lambda Hyperplane ENI

Hyperplane ENI は、Lambda サービスが作成および管理するマネージドネットワークリソースです。Lambda VPC 内の複数の実行環境では、Hyperplane ENI を使用して、アカウント内の VPC 内のリソースに安全にアクセスできます。Hyperplane ENI は、Lambda VPC からアカウント VPC への NAT 機能を提供します。

Lambda は、各サブネットでセキュリティグループの固有のセットごとにネットワークインターフェイスを作成します。同じサブネットとセキュリティグループの組み合わせを共有するアカウント内の関数は、同じネットワークインターフェイスを使用します。本来ならセキュリティグループの設定で追跡を指定する必要がある場合でも、Hyperplane レイヤーで確立された接続は自動的に追跡されます。確立された接続に対応しない VPC からのインバウンドパケットは、Hyperplane レイヤーでドロップされます。詳細については、「Amazon EC2 ユーザーガイド」の「セキュリティグループの接続の追跡」を参照してください。

アカウントの関数は ENI リソースを共有するため、ENI ライフサイクルは他の Lambda リソースよりも複雑です。以下のセクションでは、ENI のライフサイクルについて説明します。

ENI の作成

Lambda は、新しく作成された VPC 対応関数、または既存の関数に対する VPC 設定の変更のために Hyperplane ENI リソースを作成することがあります。Lambda が必要なリソースを作成している間、関数は保留状態のままになります。Hyperplane ENI の準備が整ったら、関数がアクティブ状態に移行し、ENI が使用可能になります。Lambda は Hyperplane ENI を作成するのに数分かかる場合があります。

新しく作成された VPC 対応関数の場合、関数上で動作する呼び出しまたはその他の API アクションは、関数の状態がアクティブに移行するまで失敗します。

既存の関数への VPC 設定の変更の場合、関数の状態がアクティブに移行するまで、関数の呼び出しは、古いサブネットおよびセキュリティグループ設定に関連付けられた Hyperplane ENI を引き続き使用します。

Lambda 関数が 30 日間アイドル状態のままである場合、Lambda は未使用の Hyperplane ENI を回収し、関数の状態をアイドルに設定します 次の呼び出しにより、Lambda はアイドル関数を再アクティブ化します。呼び出しは失敗し、Lambda が Hyperplane ENI の作成または割り当てを完了するまで、関数は保留状態になります。

関数の状態の詳細については、「Lambda 関数の状態」を参照してください。

ENI の管理

Lambda は、関数実行ロールのアクセス許可を使用して、ネットワークインターフェイスを作成および管理します。アカウントで VPC 対応関数に一意のサブネットとセキュリティグループの組み合わせを定義すると、Lambda は Hyperplane ENI を作成します。Lambda は、同じサブネットとセキュリティグループの組み合わせを使用するアカウントの他の VPC 対応関数に Hyperplane ENI を再利用します。

同じ Hyperplane ENI を使用できる Lambda 関数の数にクォータはありません。ただし、各 Hyperplane ENI は最大 65,000 個の接続/ポートをサポートします。接続数が 65,000 を超えると、Lambda は新しい Hyperplane ENI を作成して、追加の接続を提供します。

関数設定を更新して別の VPC にアクセスすると、Lambda は以前の VPC の Hyperplane ENI への接続を終了します。新しい VPC への接続を更新するプロセスには、数分かかる場合があります。この間、関数への呼び出しは以前の VPC を使用し続けます。更新が完了すると、新しい VPC で Hyperplane ENI を使用して新しい呼び出しが開始されます。この時点で、Lambda 関数は以前の VPC に接続されなくなります。

ENI の削除

関数を更新してその VPC 設定を削除する場合、Lambda はアタッチされた Hyperplane ENI を削除するのに最大 20 分かかります。Lambda は、他の関数 (または発行された関数のバージョン) がその Hyperplane ENI を使用していない場合にのみ ENI を削除します。

Lambda は、関数実行ロールのアクセス許可により、Hyperplane ENI を削除します。Lambda がHyperplane ENI を削除する前に実行ロールを削除すると、Lambda はHyperplane ENI を削除できません。削除は手動で実行できます。

Lambda は、アカウントの関数または関数バージョンで使用されているネットワークインターフェイスを削除しません。Lambda ENI Finder を使用して、Hyperplane ENI を使用している関数または関数のバージョンを特定することができます。不要になった関数または関数のバージョンについては、Lambda が Hyperplane ENI を削除するように VPC 設定を削除できます。

接続

Lambda では、TCP (伝送制御プロトコル) と UDP (ユーザーデータグラムプロトコル) の 2 種類の接続がサポートされています。

VPC を作成する際、Lambda は、DHCP オプションのセットを自動的に作成し、VPC に関連付けます。VPC 用に独自の DHCP オプションセットを設定できます。詳細については、Amazon VPC DHCP オプションを参照してください。

Amazon は、お客様の VPC 用の DNS サーバー (Amazon Route 53 Resolver) を提供しています。詳細については、VPC の DNS サポートを参照してください。

IPv6 サポート

Lambda は、Lambda のパブリックデュアルスタックエンドポイントへのインバウンド接続と、IPv6 経由のデュアルスタック VPC サブネットへのアウトバウンド接続をサポートします。

インバウンド

IPv6 経由で関数を呼び出すには、Lambda のパブリックデュアルスタックエンドポイントを使用します。IPv4 と IPv6 の両方をサポートするデュアルスタックのエンドポイント Lambda デュアルスタックエンドポイントは次の構文を使用します。

protocol://lambda.us-east-1.api.aws

また、Lambda 関数 URL を使用して IPv6 経由で関数を呼び出すこともできます。関数 URL のエンドポイントでは、次の形式を使用します。

https://url-id.lambda-url.us-east-1.on.aws
アウトバウンド

関数は IPv6 経由でデュアルスタック VPC サブネット内のリソースに接続することができます。このオプションはデフォルトでオフに設定されています。アウトバウンド IPv6 トラフィックを許可するには、コンソールを使用するか--vpc-config Ipv6AllowedForDualStack=true オプションを create-function または update-function-configuration コマンドに指定します。

注記

VPC でアウトバウンド IPv6 トラフィックを許可するには、関数に接続されているすべてのサブネットがデュアルスタックサブネットである必要があります。Lambda は、VPC 内の IPv6 専用サブネットのアウトバウンド IPv6 接続、VPC に接続されていない関数のアウトバウンド IPv6 接続、または VPC エンドポイント (AWS PrivateLink) を使用するインバウンド IPv6 接続をサポートしていません。

IPv6 経由でサブネットリソースに明示的に接続するように関数コードを更新することができます。次の Python の例では、ソケットを開いて IPv6 サーバーに接続します。

例 — IPv6 サーバへの接続
def connect_to_server(event, context): server_address = event['host'] server_port = event['port'] message = event['message'] run_connect_to_server(server_address, server_port, message) def run_connect_to_server(server_address, server_port, message): sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM, 0) try: # Send data sock.connect((server_address, int(server_port), 0, 0)) sock.sendall(message.encode()) BUFF_SIZE = 4096 data = b'' while True: segment = sock.recv(BUFF_SIZE) data += segment # Either 0 or end of data if len(segment) < BUFF_SIZE: break return data finally: sock.close()

セキュリティ

AWS は、VPC のセキュリティを高めるために、セキュリティグループネットワーク ACL を提供します。セキュリティグループは、リソースのインバウンドトラフィックとアウトバウンドトラフィックをコントロールします。ネットワーク ACL は、サブネットのインバウンドトラフィックとアウトバウンドトラフィックをコントロールします。セキュリティグループは、ほとんどのサブネットに対して十分なアクセス制御を提供します。VPC に追加のセキュリティレイヤーが必要な場合は、ネットワーク ACL を使用できます。詳細については、Amazon VPC でのインターネットワークトラフィックのプライバシーを参照してください。作成するサブネットはすべて、VPC のデフォルトのネットワーク ACL に自動的に関連付けられます。この関連付けを変更し、デフォルトのネットワーク ACL のコンテンツを変更できます。

一般的なセキュリティのベストプラクティスについては、VPC のセキュリティのベストプラクティスを参照してください。Lambda API とリソースへのアクセスを管理するために IAM を使用する方法の詳細については、AWS Lambda アクセス権限を参照してください。

VPC 設定で Lambda 固有の条件キーを使用して、Lambda 関数に追加のアクセス許可コントロールを提供できます。VPC 条件キーの詳細については、VPC 設定で IAM 条件キーを使用するを参照してください。

注記

Lambda 関数は、パブリックインターネットまたは AWS PrivateLink エンドポイントから呼び出すことができます。関数 URL には、パブリックインターネット経由でしかアクセスできません。Lambda 関数は AWS PrivateLink をサポートしていますが、関数 URL ではサポートされません。

オブザーバビリティ

VPC フローログを使用して、ネットワークインターフェイス間で送受信される IP トラフィックに関する情報を取得できます。フローログデータは Amazon CloudWatch Logs または Amazon S3 に発行できます。フローログを作成すると、選択した送信先でそのデータを取得して表示できます。

注: 関数を VPC にアタッチすると、CloudWatch ログメッセージは VPC ルートを使用しません。Lambda はログの通常のルーティングを使用して送信します。