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

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

アウトバウンドネットワークを 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:*/*")。

  • ec2:AssignPrivateIpAddresses

  • ec2:UnassignPrivateIpAddresses

これらの許可は、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 を設定するには
  1. Lambda コンソールの [関数ページ] を開きます。

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

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

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

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

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

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

    注記

    プライベートリソースにアクセスするには、関数をプライベートサブネットに接続します。関数にインターネットアクセスが必要な場合は、ネットワークアドレス変換 (NAT) を使用します。関数をパブリックサブネットに接続しても、インターネットアクセスやパブリック IP アドレスは提供されません。

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

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

  2. 関数を選択します。

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

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

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

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

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

    注記

    プライベートリソースにアクセスするには、関数をプライベートサブネットに接続します。関数にインターネットアクセスが必要な場合は、ネットワークアドレス変換 (NAT) を使用します。関数をパブリックサブネットに接続しても、インターネットアクセスやパブリック IP アドレスは提供されません。

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

VPC アクセスの設定 (API)

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

AWS Command Line Interface (AWS CLI) を使用して関数を作成し、それを VPC に接続するには、create-function コマンドを VpcConfig オプションと共に使用できます。次の例では、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 つ以上の VPCs。

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