AWS Lambda
開発者ガイド

Amazon VPC 内のリソースにアクセスできるように Lambda 関数を構成する

通常、パブリックインターネットを通じてアクセスできないように、リソースは Amazon Virtual Private Cloud (Amazon VPC) 内に作成します。作成できるリソースには、Amazon Redshift データウェアハウス、Amazon ElastiCache クラスター、Amazon RDS インスタンスなどの AWS サービスリソースがあります。独自の EC2 インスタンスで実行する独自のサービスを作成することもできます。デフォルトでは、Lambda 関数から VPC 内のリソースにアクセスすることができません。

AWS Lambda はデフォルトでは VPC 内で安全に関数コードを実行します。ただし、Lambda 関数がプライベート VPC 内のリソースにアクセスできるようにするには、VPC サブネット ID やセキュリティグループ ID など、追加の VPC 固有設定情報を指定する必要があります。AWS Lambda はこの情報を、関数がプライベート VPC 内の他のリソースに安全に接続できる Elastic Network Interface (ENI) のセットアップに使用します。

AWS Lambda は専有テナント VPC 内のリソースへの接続はサポートしていません。詳細については、専用 VPCを参照してください

Amazon VPC へのアクセス用に Lambda 関数を設定する

VPC 情報は、VpcConfig パラメータを使用して Lambda 関数設定に追加します。Lambda 関数の作成時に追加する (「CreateFunction」を参照)、あるいは既存の Lambda 関数設定に追加することができます (「UpdateFunctionConfiguration」を参照)。AWS CLI の例を次に示します。

  • Lambda 関数の作成時に VPC 情報を指定できるよう、CLI コマンド create-function では --vpc-config パラメータを指定します。

    $ aws lambda create-function \ --function-name ExampleFunction \ --runtime go1.x \ --role execution-role-arn \ --zip-file fileb://path/app.zip \ --handler app.handler \ --vpc-config SubnetIds=comma-separated-vpc-subnet-ids,SecurityGroupIds=comma-separated-security-group-ids \ --memory-size 1024

    注記

    この Lambda 関数の実行ロールには、ENI を作成、記述、削除するためのアクセス許可が必要です。AWS Lambda では、ロールを作成するときに使用できる必須の EC2 アクション (ec2:CreateNetworkInterface ec2:DescribeNetworkInterfacesec2:DeleteNetworkInterface) へのアクセス許可を含むアクセスポリシー (AWSLambdaVPCAccessExecutionRole) が用意されています。ポリシーは IAM コンソールで確認できます。Lambda 関数の実行直後に、このロールを削除しないでください。Lambda 関数の実行と ENI の削除の間には遅延時間があります。関数の実行直後にロールを削除した場合、ENI の削除はお客様の責任になります。

  • CLI コマンド update-function-configuration では、既存の Lambda 関数設定に VPC 情報を追加するための --vpc-config パラメータを指定します。

    $ aws lambda update-function-configuration \ --function-name ExampleFunction \ --vpc-config SubnetIds=comma-separated-vpc-subnet-ids,SecurityGroupIds=security-group-ids

    Lambda 関数設定から VPC 関連情報を削除するには、UpdateFunctionConfiguration API を使用して、次の CLI コマンド例のように、サブネット ID とセキュリティグループ ID の空のリストを指定します。

    $ aws lambda update-function-configuration \ --function-name ExampleFunction \ --vpc-config SubnetIds=[],SecurityGroupIds=[]

次に示す追加の考慮事項に注意してください。

  • Lambda 関数に VPC 設定を追加した場合、関数でアクセスできるのは、その VPC 内のリソースのみになります。Lambda 関数から VPC リソースとパブリックインターネットの両方にアクセスする必要がある場合は、VPC 内に NAT (Network Address Translation) インスタンスが必要になります。

  • Lambda 関数が VPC 内で動作するように構成されている場合、追加の ENI の使用を開始するペナルティが発生します。これは、ネットワークリソースに接続する際にアドレス解決が遅延する場合があることを意味します。

Lambda 関数でのインターネットアクセス

AWS Lambda は、指定された VPC 情報を使用して、Lambda 関数から VPC リソースにアクセスするための ENI をセットアップします。各 ENI には、指定されたサブネットの IP アドレス範囲からプライベート IP アドレスが割り当てられますが、パブリック IP アドレスは割り当てられません。そのため、Lambda 関数でインターネットアクセスが必要である場合 (VPC エンドポイントのない AWS サービスにアクセスする場合など) は、VPC 内で NAT インスタンスを設定することも、Amazon VPC NAT ゲートウェイを使用することもできます。詳細については、『Amazon VPC ユーザーガイド』の「NAT ゲートウェイ」を参照してください。VPC に添付されたインターネットゲートウェイを使用することはできません。これには ENI にパブリック IP アドレスがある必要があります。

重要

Lambda 関数でインターネットアクセスが必要な場合は、パブリックサブネットまたはインターネットに接続していないプライベートサブネットに添付しないでください。代わりに、NAT インスタンスまたは Amazon VPC NAT ゲートウェイを介して、インターネットにアクセスしているプライベートサブネットにのみ添付してください。

VPC 対応の Lambda 関数をセットアップするためのガイドライン

Lambda 関数は、処理するイベント数に基づいて自動的にスケーリングされます。このスケーリング動作をサポートする VPC 対応の Lambda 関数をセットアップするための一般的なガイドラインを次に示します。

  • Lambda 関数で VPC にアクセスする場合は、Lambda 関数でのスケーリング要件をサポートできる充分な ENI キャパシティーが VPC にあることを確認します。次の式を使用すると、ENI 要件を概算できます。

    Projected peak concurrent executions * (Memory in GB / 3GB)

    次のとおりです。

    • Projected peak concurrent execution (投射されたピーク時の同時実行) – この値を決定するには、「同時実行数の管理」の情報を使用します。

    • メモリ – Lambda 関数用に設定したメモリの容量。

  • 指定するサブネットには、ENI の数に見合う数の使用可能な IP アドレスがある必要があります。

    また、Lambda 関数設定内のアベイラビリティーゾーンごとに 1 つ以上のサブネットを指定することをお勧めします。アベイラビリティーゾーンごとにサブネットを指定しておくと、1 つのアベイラビリティゾーンで障害が発生した場合や IP アドレスが枯渇した場合も、別のアベイラビリティゾーンで Lambda 関数を実行できます。

VPC に充分な数の ENI またはサブネット IP がない場合は、リクエスト数が増えても Lambda 関数を拡張できず、エラーの呼び出しが増加します (EC2ThrottledException)。非同期呼び出しで、CloudWatch Logs に対応しないエラーの増加が見られる場合には、コンソールで Lambda 関数を同期的に呼び出してエラーレスポンスを取得します。