アウトバウンドネットワークを VPC 内のリソースに接続する - AWS Lambda

アウトバウンドネットワークを VPC 内のリソースに接続する

AWS アカウントで Virtual Private Cloud (VPC) のプライベートサブネットに接続するように Lambda 関数を設定できます。Amazon Virtual Private Cloud (Amazon VPC) を使用して、データベース、キャッシュインスタンス、内部サービスなどのリソースのプライベートネットワークを作成します。関数の実行中にプライベートリソースにアクセスするには、関数を VPC に接続します。このセクションでは、Lambda VPC 接続の概要について説明します。Lambda での VPC ネットワーキングの詳細については、「VPC によるプライベートネットワーク」を参照してください。

関数を 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:DescribeSubnets

  • ec2:DeleteNetworkInterface - 実行ロール内の [DeleteNetworkInterface] でリソース ID を指定しない場合、関数から VPC へのアクセスができなくなる場合があります。ここでは、一意のリソース ID を指定するか、すべてのリソース ID を含めます (例: "Resource": "arn:aws:ec2:us-west-2:123456789012:*/*")。

  • ec2:AssignPrivateIpAddresses

  • ec2:UnassignPrivateIpAddresses

これらのアクセス許可は、AWS 管理ポリシー AWSLambdaVPCAccessExecutionRole に含まれています。これらの許可は、VPC 関数の呼び出しではなく、Elastic Network Interface を作成するときにのみ必要です。つまり、実行ロールからこれらの権限を削除しても、VPC 関数を正常に呼び出すことが可能です。Lambda 関数と VPC の関連付けを完全に解除するには、コンソール、または UpdateFunctionConfiguration API を使用して、関数側の VPC 設定を更新します。

関数の実行ロールに付与する Amazon EC2 許可は、関数を VPC にアタッチするために Lambda サービスが使用します。ただし、これらの許可は関数のコードにも暗黙的に付与されます。つまり、関数コードにはこれらの Amazon EC2 API コールを行う許可が付与されます。セキュリティのベストプラクティスに従って最小特権の許可を適用するには、関数の実行ロールに次の例のような拒否ポリシーを追加します。このポリシーは、関数が Amazon EC2 API コールを行うことをブロックします。

例 Lambda Amazon EC2 拒否ポリシー
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "ec2:CreateNetworkInterface", "ec2:DeleteNetworkInterface", "ec2:DescribeNetworkInterfaces", "ec2:DetachNetworkInterface", "ec2:AssignPrivateIpAddresses", "ec2:UnassignPrivateIpAddresses", ], "Resource": [ "*" ], "Condition": { "ArnEquals": { "lambda:SourceFunctionArn": [ "arn:aws:lambda:us-west-2:123456789012:function:my_function" ] } } } ] }

VPC 接続を設定すると、Lambda はお客様のアクセス許可を使用してネットワークリソースを確認します。VPC に接続するように関数を設定するには、ユーザーに以下の許可が必要です。

ユーザーアクセス許可
  • ec2:DescribeSecurityGroups

  • ec2:DescribeSubnets

  • ec2:DescribeVpcs

VPC アクセスの設定 (コンソール)

IAM アクセス許可によって VPC に接続する Lambda 関数の作成のみが許可されている場合は、この関数の作成時に VPC を設定する必要があります。IAM アクセス許可によって VPC に接続されていない関数の作成が許可されている場合は、この関数の作成後に VPC 設定を追加できます。

関数の作成時に VPC を設定するには
  1. Lambda コンソールの [関数ページ] を開きます。

  2. [Create function (関数の作成)] を選択します。

  3. [基本的な情報] の [関数名] に、関数の名前を入力します。

  4. [Advanced settings (詳細設定)] を展開します。

  5. [VPC を有効化] をクリックし、関数からアクセスする VPC を選択します。

  6. (オプション) アウトバウンド IPv6 トラフィックを許可するには、[デュアルスタックサブネットの IPv6 トラフィックを許可] をクリックします。

  7. サブネットとセキュリティグループを選択します。[デュアルスタックサブネットの IPv6 トラフィックを許可する] を選択した場合は、選択したすべてのサブネットに IPv4 CIDR ブロックと IPv6 CIDR ブロックが必要です。

    注記

    プライベートリソースにアクセスするには、関数をプライベートサブネットに接続します。関数にインターネットアクセスが必要な場合、「VPC に接続された Lambda 関数にインターネットアクセスを有効にする」を参照してください。関数をパブリックサブネットに接続しても、インターネットアクセスやパブリック IP アドレスは提供されません。

  8. [Create function (関数の作成)] を選択します。

既存の関数に対して VPC を設定するには
  1. Lambda コンソールの [関数ページ] を開きます。

  2. 関数を選択します。

  3. [設定]、[VPC] の順にクリックします。

  4. [VPC] で、[編集] を選択します。

  5. 関数からアクセスする VPC を選択します。

  6. (オプション) アウトバウンド IPv6 トラフィックを許可するには、[デュアルスタックサブネットの IPv6 トラフィックを許可] をクリックします。

  7. サブネットとセキュリティグループを選択します。[デュアルスタックサブネットの IPv6 トラフィックを許可する] を選択した場合は、選択したすべてのサブネットに IPv4 CIDR ブロックと IPv6 CIDR ブロックが必要です。

    注記

    プライベートリソースにアクセスするには、関数をプライベートサブネットに接続します。関数にインターネットアクセスが必要な場合、「VPC に接続された Lambda 関数にインターネットアクセスを有効にする」を参照してください。関数をパブリックサブネットに接続しても、インターネットアクセスやパブリック IP アドレスは提供されません。

  8. [Save] を選択します。

VPC アクセスの設定 (API)

Lambda 関数を VPC に接続するには、次の API オペレーションを使用します。

AWS Command Line Interface (AWS CLI) を使用して関数を作成し、それを VPC に接続するには、VpcConfig オプションを指定してcreate-function コマンドを使用できます。次の例では、VPC 接続を使用して関数を作成します。この関数は 2 つのサブネットと 1 つのセキュリティグループにアクセスでき、アウトバウンド IPv6 トラフィックを許可します。

aws lambda create-function --function-name my-function \ --runtime nodejs20.x --handler index.js --zip-file fileb://function.zip \ --role arn:aws:iam::123456789012:role/lambda-role \ --vpc-config Ipv6AllowedForDualStack=true,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 チュートリアル

次のチュートリアルでは、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] (スタック) ページ[Create stack] (スタックの作成) を選択し、[Create stack] (スタックの作成) ウィザードの手順に従います。