メニュー
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 パラメータを指定します。--runtime パラメータは python3.6 を指定することに注意してください。python2.7 を使用することもできます。

    Copy
    $ aws lambda create-function \ --function-name ExampleFunction \ --runtime python3.6 \ --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 では、アクセス権限ポリシー AWSLambdaVPCAccessExecutionRole が提供されています。このポリシーでは、ロールの作成時に使用できる、必要な EC2 アクション (ec2:CreateNetworkInterface ec2:DescribeNetworkInterfacesec2:DeleteNetworkInterface) 用のアクセス許可が定義されます。ポリシーは IAM コンソールで確認できます。Lambda 関数の実行直後に、このロールを削除しないでください。Lambda 関数の実行と ENI の削除の間には遅延時間があります。関数の実行直後にロールを削除した場合、ENI の削除はお客様の責任になります。

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

    Copy
    $ 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 の空のリストを指定します。

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

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

  • VPC のパブリックホスト名の DNS 解決は回避することをお勧めします。解決に数秒かかり、リクエストに数秒の課金可能時間が追加される可能性があるためです。これを回避するには、たとえば、Lambda 関数で VPC 内の Amazon RDS インスタンスにアクセスする場合は、no-publicly-accessible オプションを指定してインスタンスを起動します。

     

  • 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 関数でインターネットアクセスが必要である場合 (たとえば、Kinesis のように 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 キャパシティーを概算できます。

    Copy
    Projected peak concurrent executions * (Memory in GB / 1.5GB)

    各パラメーターの意味は次のとおりです。

    • Projected peak concurrent execution – この値を決定するには、 Lambda 関数の同時実行 の情報を使用します。

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

     

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

     

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

注記

VPC に充分な数の ENI またはサブネット IP がない場合は、リクエスト数が増えても Lambda 関数を拡張できず、関数の失敗数が増えます。現在 AWS Lambda では、ENI または IP アドレスの不足によって発生したエラーは CloudWatch Logs に記録されません。対応する CloudWatch Logs のないエラーが増えている場合は、Lambda 関数を同期的に実行してエラー応答を取得します (たとえば、AWS Lambda コンソールで Lambda 関数をテストすると、コンソールで Lambda 関数が同期的に呼び出され、エラーが表示されます)。