アウトバウンドネットワークを VPC 内のリソースに接続する
AWS アカウントで Virtual Private Cloud (VPC) のプライベートサブネットに接続するように Lambda 関数を設定できます。Amazon Virtual Private Cloud (Amazon VPC) を使用して、データベース、キャッシュインスタンス、内部サービスなどのリソースのプライベートネットワークを作成します。関数の実行中にプライベートリソースにアクセスするには、関数を VPC に接続します。このセクションでは、Lambda VPC 接続の概要について説明します。Lambda での VPC ネットワーキングの詳細については、「VPC によるプライベートネットワーク」を参照してください。
ヒント
VPC とサブネットにアクセスするように Lambda 関数を設定するには、Lambda コンソールまたは API を使用します。
関数を設定するには、「CreateFunction」 の 「VpcConfig
」セクションを参照してください。詳細な手順については、VPC アクセスの設定 (コンソール) および VPC アクセスの設定 (API) を参照してください。
関数を VPC に接続すると、Lambda は、関数の VPC 設定のサブネットごとに Hyperplane ENI (Elastic Network Interface) に関数を割り当てます。Lambda は、アカウント内の VPC 対応関数に対して一意のサブネットとセキュリティグループの組み合わせを初めて定義するときに Hyperplane ENI を作成します。
Lambda が Hyperplane ENI を作成する間は、バージョンの作成や関数のコードの更新など、関数を対象とする追加のオペレーションは実行できません。新しい関数の場合、状態が Pending
から Active
に変わるまで、関数を呼び出すことはできません。既存の関数の場合は、更新の進行中に以前のバージョンを引き続き呼び出すことができます。Hyperplane ENI ライフサイクルの詳細については、「Lambda Hyperplane ENI」を参照してください。
Lambda 関数は、ハードウェア専有インスタンスのテナンシーを使用して VPC に直接接続することはできません。専有 VPC のリソースに接続するには、デフォルトのテナンシーで 2 番目の VPC にピア接続します
セクション
VPC 接続の管理
同じサブネットとセキュリティグループを共有する場合、複数の 関数が 1 つのネットワークインターフェイスを共有できます。新しいネットワークインターフェイスを作成するよりも、既存の Lambda マネージドネットワークインターフェイスを持つ同じ VPC 設定 (サブネットとセキュリティグループ) に追加の関数を接続する方がはるかに高速です。
関数が長期間アクティブでない場合、Lambda はそのネットワークインターフェイスを回収し、関数は Idle
になります。アイドル状態の関数を再度アクティブにするには、その関数を呼び出します。この呼び出しは失敗し、ネットワークインターフェイスが使用可能になるまで、関数は Pending
状態になります。
別の VPC にアクセスするように関数を更新すると、Hyperplane ENI から以前の VPC への接続が終了します。新しい VPC への接続を更新するプロセスには、数分かかる場合があります。この間、Lambda は関数の呼び出しを以前の VPC に接続します。更新が完了すると、新しい呼び出しは新しい VPC を使用し始めるので、Lambda 関数は古い VPC に接続されなくなります。
DynamoDB クエリなどの短期間のオペレーションでは、TCP 接続を設定する際のレイテンシーのオーバーヘッドが、オペレーション自体よりも大きくなる可能性があります。使用期間が短い/呼び出される頻度が低い関数の接続を再利用するために、関数の初期化中に作成された接続に TCP キープアライブ を使用して、その後の呼び出しで新しい接続を作成しないようにすることをお勧めします。キープアライブを使用した接続の再利用の詳細については、接続の再利用に関する Lambda ドキュメントを参照してください。
実行ロールとユーザーアクセス許可
Lambda は、関数のアクセス許可を使用してネットワークインターフェイスを作成および管理します。VPC に接続するには、関数の実行ロールに次のアクセス許可が必要です。
実行ロールのアクセス許可
-
ec2:CreateNetworkInterface
-
ec2:DescribeNetworkInterfaces - このアクションは、すべてのリソースで許可されている場合にのみ機能します (
"Resource": "*"
)。 -
ec2:DeleteNetworkInterface - 実行ロール内の [DeleteNetworkInterface] でリソース ID を指定しない場合、関数から VPC へのアクセスができなくなる場合があります。ここでは、一意のリソース ID を指定するか、すべてのリソース ID を含めます (例:
"Resource": "arn:aws:ec2:us-west-2:123456789012:*/*"
)。
これらのアクセス許可は、AWS 管理ポリシー AWSLambdaVPCAccessExecutionRole に含まれています。これらのアクセス許可は、ENI の作成にのみ必要です。VPC 関数を呼び出すためのものではないことに注意してください。つまり、実行ロールからこれらの権限を削除しても、VPC 関数を正常に呼び出すことが可能です。Lambda 関数と VPC の関連付けを完全に解除するには、コンソール、または UpdateFunctionConfiguration API を使用して、関数側の VPC 設定を更新します。
VPC 接続を設定すると、Lambda はお客様のアクセス許可を使用してネットワークリソースを確認します。VPC に接続するように関数を設定するには、ユーザーに以下の許可が必要です。
ユーザーアクセス許可
-
ec2:DescribeSecurityGroups
-
ec2:DescribeSubnets
-
ec2:DescribeVpcs
VPC アクセスの設定 (コンソール)
IAM アクセス許可によって VPC に接続する Lambda 関数の作成のみが許可されている場合は、この関数の作成時に VPC を設定する必要があります。IAM アクセス許可によって VPC に接続されていない関数の作成が許可されている場合は、この関数の作成後に VPC 設定を追加できます。
関数の作成時に VPC を設定するには
Lambda コンソールの関数
ページを開きます。 -
[機能の作成]を選択します。
-
[基本的な情報] の [関数名] に、関数の名前を入力します。
-
[Advanced settings (詳細設定)] を展開します。
-
[ネットワーク] で、関数がアクセスする VPC を選択します。
-
サブネットとセキュリティグループを選択します。セキュリティグループを選択すると、そのセキュリティグループのインバウンドルールとアウトバウンドルールがコンソールに表示されます。
注記
プライベートリソースにアクセスするには、関数をプライベートサブネットに接続します。関数にインターネットアクセスが必要な場合は、ネットワークアドレス変換 (NAT) を使用します。関数をパブリックサブネットに接続しても、インターネットアクセスやパブリック IP アドレスは提供されません。
-
[機能の作成]を選択します。
既存の関数に対して VPC を設定するには
Lambda コンソールの関数
ページを開きます。 -
関数を選択します。
-
[設定]、[VPC] の順にクリックします。
-
[VPC] で、[編集] を選択します。
-
VPC、サブネット、セキュリティグループを選択します。
注記
プライベートリソースにアクセスするには、関数をプライベートサブネットに接続します。関数にインターネットアクセスが必要な場合は、ネットワークアドレス変換 (NAT) を使用します。関数をパブリックサブネットに接続しても、インターネットアクセスやパブリック IP アドレスは提供されません。
-
[Save (保存)] を選択します。
VPC アクセスの設定 (API)
Lambda 関数を VPC に接続するには、次の API オペレーションを使用します。
AWS Command Line Interface (AWS CLI) を使用して関数を作成し、それを VPC に接続するには、create-function
コマンドを vpc-config
オプションと共に使用できます。以下の例では、2 つのサブネットと 1 つのセキュリティグループのある VPC に接続する関数を作成します。
aws lambda create-function --function-name my-function \ --runtime nodejs18.x --handler index.js --zip-file fileb://function.zip \ --role arn:aws:iam::
123456789012
:role/lambda-role
\ --vpc-config SubnetIds=subnet-071f712345678e7c8,subnet-07fd123456788a036
,SecurityGroupIds=sg-085912345678492fb
既存の関数を VPC に接続するには、update-function-configuration
コマンドを vpc-config
オプションと共に使用します。
aws lambda update-function-configuration --function-name my-function \ --vpc-config SubnetIds=
subnet-071f712345678e7c8,subnet-07fd123456788a036
,SecurityGroupIds=sg-085912345678492fb
VPC から関数を切断するには、サブネットとセキュリティグループの空のリストで関数の設定を更新します。
aws lambda update-function-configuration --function-name my-function \ --vpc-config SubnetIds=[],SecurityGroupIds=[]
VPC 設定で IAM 条件キーを使用する
VPC 設定で Lambda 固有の条件キーを使用して、Lambda 関数に追加のアクセス許可コントロールを提供できます。例えば、組織内のすべての関数を VPC に接続するように要求できます。また、関数のユーザーに対して使用を許可または拒否するサブネットとセキュリティグループを指定することもできます。
Lambda は IAM ポリシーで次の条件キーをサポートしています。
-
lambda:VpcIds - 1 つ以上の VPC を許可または拒否します。
-
lambda:SubnetIds - 1 つ以上のサブネットを許可または拒否します。
-
lambda:SecurityGroupIds - 1 つ以上のセキュリティグループを許可または拒否します。
Lambda API オペレーションの CreateFunction および UpdateFunctionConfiguration は、これらの条件キーをサポートしています。IAMポリシーでの条件キーの使用の詳細については、IAM ユーザーガイドの「IAM JSON ポリシーエレメント: 条件」を参照してください。
ヒント
関数に以前の API リクエストの VPC 設定が既に含まれている場合は、VPC 設定なしで UpdateFunctionConfiguration
リクエストを送信できます。
VPC 設定の条件キーを使用したポリシーの例
以下の例は、VPC 設定で条件キーを使用する方法を示しています。必要な制限を含むポリシーステートメントを作成したら、このポリシーステートメントをターゲットの ユーザーまたはロールに追加します。
ユーザーに対して VPC に接続された関数のみをデプロイさせる
すべてのユーザーに対して VPC に接続された関数のみをデプロイさせるには、有効な VPC ID を含まない関数の作成および更新オペレーションを拒否できます。
VPC ID は CreateFunction
リクエストまたは UpdateFunctionConfiguration
リクエストへの入力パラメータではないことに注意してください。Lambda は、サブネットとセキュリティグループのパラメータに基づいて VPC ID 値を取得します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceVPCFunction", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "Null": { "lambda:VpcIds": "true" } } } ] }
特定の VPC、サブネット、セキュリティグループに対するユーザーアクセスを拒否する
特定の VPC へのユーザーアクセスを拒否するには、StringEquals
を使用して lambda:VpcIds
条件の値を確認します。次の例では、 vpc-1
および vpc-2
へのユーザーアクセスを拒否します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceOutOfVPC", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "StringEquals": { "lambda:VpcIds": ["vpc-1", "vpc-2"] } } }
特定のサブネットへのユーザーアクセスを拒否するには、StringEquals
を使用して lambda:SubnetIds
条件の値を確認します。次の例では、 subnet-1
および subnet-2
へのユーザーアクセスを拒否します。
{ "Sid": "EnforceOutOfSubnet", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "lambda:SubnetIds": ["subnet-1", "subnet-2"] } } }
特定のセキュリティグループへのユーザーアクセスを拒否するには、StringEquals
を使用して lambda:SecurityGroupIds
条件の値を確認します。次の例では、 sg-1
および sg-2
へのユーザーアクセスを拒否します。
{ "Sid": "EnforceOutOfSecurityGroups", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "lambda:SecurityGroupIds": ["sg-1", "sg-2"] } } } ] }
特定の VPC 設定を使用して関数を作成および更新することをユーザーに許可する
特定の VPC にアクセスすることをユーザーに許可するには、StringEquals
を使用して lambda:VpcIds
条件の値を確認します。次の例では、vpc-1
および vpc-2
にアクセスすることをユーザーに許可します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceStayInSpecificVpc", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Allow", "Resource": "*", "Condition": { "StringEquals": { "lambda:VpcIds": ["vpc-1", "vpc-2"] } } }
特定のサブネットにアクセスすることをユーザーに許可するには、StringEquals
を使用して lambda:SubnetIds
条件の値を確認します。次の例では、subnet-1
および subnet-2
にアクセスすることをユーザーに許可します。
{ "Sid": "EnforceStayInSpecificSubnets", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Allow", "Resource": "*", "Condition": { "ForAllValues:StringEquals": { "lambda:SubnetIds": ["subnet-1", "subnet-2"] } } }
特定のセキュリティグループにアクセスすることをユーザーに許可するには、StringEquals
を使用して lambda:SecurityGroupIds
条件の値を確認します。次の例では、sg-1
および sg-2
にアクセスすることをユーザーに許可します。
{ "Sid": "EnforceStayInSpecificSecurityGroup", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Allow", "Resource": "*", "Condition": { "ForAllValues:StringEquals": { "lambda:SecurityGroupIds": ["sg-1", "sg-2"] } } } ] }
VPC に接続した関数のインターネットアクセスとサービスアクセス
デフォルトでは、Lambda は AWS のサービスとインターネットにアクセスできる安全な VPC で関数を実行します。Lambda はこの VPC を所有していますが、アカウントのデフォルトの VPC には接続されていません アカウントの VPC に関数を接続すると、VPC からアクセス権が付与されない限り、関数はインターネットにアクセスできません。
注記
AWS の複数のサービスが VPC エンドポイントを提供しています。VPC エンドポイントを使用すると、インターネットアクセスなしで VPC 内から AWS のサービスに接続できます。
プライベートサブネットからのインターネットにアクセスには、ネットワークアドレス変換 (NAT) が必要です。インターネットへのアクセス権を関数に付与するには、アウトバウンドトラフィックをパブリックサブネットの NAT ゲートウェイにルーティングします。NAT ゲートウェイにはパブリック IP アドレスがあるため、VPC のインターネットゲートウェイを介してインターネットに接続できます。アイドル状態の NAT ゲートウェイ接続は、350 秒後にタイムアウトします。詳細については、「VPC 内にある Lambda 関数に、インターネットへのアクセス許可を付与する方法を教えてください
VPC チュートリアル
次のチュートリアルでは、VPC 内のリソースに Lambda 関数を接続します。
VPC 設定のサンプル
次のサンプル AWS CloudFormation テンプレートを使用して、Lambda 関数で使用する VPC 設定を作成できます。このガイドの GitHub リポジトリには、次の 2 つのテンプレートがあります。
-
vpc-private.yaml
— Amazon Simple Storage Service (Amazon S3) および Amazon DynamoDB 用の 2 つのプライベートサブネットと VPC エンドポイントを持つ VPC。このテンプレートを使用して、インターネットアクセスを必要としない関数の VPC を作成できます。この設定では、AWS SDK での Amazon S3 と DynamoDB の使用、およびローカルネットワーク接続を介した同じ VPC 内のデータベースリソースへのアクセスがサポートされます。 -
vpc-privatepublic.yaml
- 2 つのプライベートサブネット、VPC エンドポイント、NAT ゲートウェイ使用するパブリックサブネット、およびインターネットゲートウェイなどを持つ VPC。プライベートサブネットの関数からのインターネット宛てのトラフィックは、ルートテーブルを使用して NAT ゲートウェイにルーティングされます。
テンプレートを使用して VPC を作成するには、AWS CloudFormation コンソールの [Stacks] (スタック) ページ