VPC 内のリソースにアクセスするための Lambda 関数の設定 - AWS Lambda

VPC 内のリソースにアクセスするための Lambda 関数の設定

AWS アカウントで Virtual Private Cloud (VPC) のプライベートサブネットに接続するように Lambda 関数を設定できます。Amazon Virtual Private Cloud (Amazon VPC) を使用して、データベース、キャッシュインスタンス、または内部サービスなどのリソースのプライベートネットワークを作成します。関数の実行中にプライベートリソースにアクセスするには、関数を VPC に接続します。

関数を VPC に接続すると、Lambda は、関数の VPC 設定内のセキュリティグループとサブネットの組み合わせごとに Elastic Network Interface を作成します。このプロセスには 1 分ほどかかることがあります。

Lambda がネットワークインターフェイスを作成する間は、バージョンの作成や関数のコードの更新など、関数を対象とする追加のオペレーションは実行できません。新しい関数の場合、状態が Pending から Active に変わるまで、関数を呼び出すことはできません。既存の関数の場合は、更新の進行中に以前のバージョンを引き続き呼び出すことができます。関数の状態の詳細については、「Lambda API を使用した関数の状態のモニタリング」を参照してください。

同じサブネットに接続されている複数の関数は、ネットワークインターフェイスを共有します。既存の Lambda マネージドネットワークインターフェイスを持つサブネットに追加の関数を接続する方が、追加のネットワークインターフェイスを Lambda で作成するよりもはるかに高速です。ただし、たくさんの関数がある場合や、ネットワーク使用率の高い関数がある場合は、追加のネットワークインタフェースが Lambda で引き続き作成されることがあります。

関数が長期間アクティブでない場合、Lambda はそのネットワークインターフェイスを回収し、関数は Idle になります。アイドル状態の関数を再度アクティブにするには、その関数を呼び出します。この呼び出しは失敗し、ネットワークインターフェイスが使用可能になるまで、関数は Pending 状態になります。

Lambda 関数は、ハードウェア専有インスタンスのテナンシーを使用して VPC に直接接続することはできません。専有 VPC のリソースに接続するには、デフォルトのテナンシーで 2 番目の VPC にピア接続します

実行ロールとユーザーアクセス許可

Lambda は、関数のアクセス許可を使用してネットワークインターフェイスを作成および管理します。VPC に接続するには、関数の実行ロールに次のアクセス許可が必要です。

実行ロールのアクセス許可

  • ec2:CreateNetworkInterface

  • ec2:DescribeNetworkInterfaces

  • ec2:DeleteNetworkInterface

これらのアクセス許可は、AWS 管理ポリシー AWSLambdaVPCAccessExecutionRole に含まれています。

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

ユーザーアクセス許可

  • ec2:DescribeSecurityGroups

  • ec2:DescribeSubnets

  • ec2:DescribeVpcs

Lambda コンソールによる VPC アクセスの設定

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

関数の作成時に VPC を設定するには

  1. Lambda コンソールの [Functions (関数)] ページを開きます。

  2. [Create function] を選択します。

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

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

  5. [ネットワーク] で、関数がアクセスする VPC を選択します。

  6. サブネットとセキュリティグループを選択します。セキュリティグループを選択すると、そのセキュリティグループのインバウンドルールとアウトバウンドルールがコンソールに表示されます。

    注記

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

  7. [Create function] を選択します。

既存の関数に対して VPC を設定するには

  1. Lambda コンソールの [Functions (関数)] ページを開きます。

  2. 関数を選択します。

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

  4. VPC、サブネット、セキュリティグループを選択します。

    注記

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

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

Lambda API による VPC アクセスの設定

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 nodejs12.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: SubnetID – 1 つ以上のサブネットを許可または拒否します。

  • Lambda: SecurityGroupID – 1 つ以上のセキュリティグループを許可または拒否します。

Lambda API オペレーションの CreateFunctionUpdateFunctionConfiguration は、これらの条件キーをサポートしています。IAM ポリシーにおける条件キーの使用の詳細については、IAM ユーザーガイドの「IAM JSON ポリシー要素: 条件」を参照してください。

ヒント

関数に以前の API リクエストの VPC 設定が既に含まれている場合は、VPC 設定なしで UpdateFunctionConfiguration リクエストを送信できます。

VPC 設定の条件キーを使用したポリシーの例

以下の例は、VPC 設定で条件キーを使用する方法を示しています。必要な制限を含むポリシーステートメントを作成したら、このポリシーステートメントをターゲットの IAM ユーザーまたはロールに追加します。

ユーザーに対して 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 内で実行します。この VPC は、Lambda が所有し、アカウントのデフォルト VPC とは接続されていません。アカウントの VPC に関数を接続すると、VPC からアクセス権が付与されない限り、関数はインターネットにアクセスできません。

注記

AWS の複数のサービスが VPC エンドポイントを提供しています。VPC エンドポイントを使用すると、インターネットアクセスなしで VPC 内から AWS のサービスに接続できます。

プライベートサブネットからのインターネットにアクセスには、ネットワークアドレス変換 (NAT) が必要です。インターネットへのアクセス権を関数に付与するには、アウトバウンドトラフィックをパブリックサブネットの NAT ゲートウェイにルーティングします。NAT ゲートウェイにはパブリック IP アドレスがあるため、VPC のインターネットゲートウェイを介してインターネットに接続できます。詳細については、「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 コンソールの [スタック] ページで [スタックの作成] をクリックし、[スタックの作成] ウィザードの手順に従います。