AWS Lambda
开发人员指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

配置 Lambda 函数以访问 Amazon VPC 中的资源

通常,您在 Amazon Virtual Private Cloud (Amazon VPC) 内部创建资源,以便这些资源不能通过公共 Internet 访问。这些资源可以是 AWS 服务资源,例如 Amazon Redshift 数据仓库、Amazon ElastiCache 群集或 Amazon RDS 实例。它们还可以是在您自己的 EC2 实例上运行的您自己的服务。默认情况下,无法从 Lambda 函数访问 VPC 中的资源。

默认情况下,AWS Lambda 在 VPC 中安全运行函数代码。不过,要让您的 Lambda 函数能够访问私有 VPC 中的资源,您必须提供包括 VPC 子网 ID 和安全组 ID 在内的其他 VPC 特定的配置信息。AWS Lambda 使用此信息设置弹性网络接口 (ENI),此接口可让您的函数安全连接到私有 VPC 中的其他资源。

重要

AWS Lambda 不支持连接到专用租赁 VPC 中的资源。有关更多信息,请参阅专用 VPC

配置 Lambda 函数以访问 Amazon VPC

您可以在创建 Lambda 函数时,使用 VpcConfig 参数将 VPC 信息添加到您的 Lambda 函数配置(请参阅 CreateFunction),也可以将其添加到现有的 Lambda 函数配置(请参阅 UpdateFunctionConfiguration)。下面是一些 AWS CLI 示例:

  • 在您创建 Lambda 函数时,create-function CLI 命令将指定 --vpc-config 参数来提供 VPC 信息。请注意,--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。

  • 可以在 update-function-configuration CLI 命令中指定 --vpc-config 参数,以将 VPC 信息添加到现有的 Lambda 函数配置。

    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,并提供子网 ID 和安全组 ID 的空白列表,如以下 CLI 命令示例所示。

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

请注意以下其他几项注意事项:

  • 我们建议您避免对您的 VPC 使用公有主机名称的 DNS 解析。解析过程需要几秒时间,这会对您的请求增加几秒钟的可计费时间。例如,如果您的 Lambda 函数访问您的 VPC 中的 Amazon RDS 实例,请使用 no-publicly-accessible 选项来启动该实例。

     

  • 当您将 VPC 配置添加到 Lambda 函数时,它只能访问该 VPC 中的资源。如果 Lambda 函数既要访问 VPC 资源又要访问公共 Internet,那么 VPC 内部必须具有网络地址转换 (NAT) 实例。

     

  • 当 Lambda 函数配置为在 VPC 中运行时,它会带来额外的 ENI 启动性能损失。这意味着,在尝试连接到网络资源时,可能会延迟地址解析。

对 Lambda 函数的 Internet 访问

AWS Lambda 使用您提供的 VPC 信息来设置 ENI,使您的 Lambda 函数能够访问 VPC 资源。将向每个 ENI 分配一个来自您指定的子网中 IP 地址范围的私有 IP 地址,但不会分配任何公共 IP 地址。因此,如果您的 Lambda 函数需要访问 Internet(例如,访问诸如 Kinesis 这样的没有 VPC 端点的 AWS 服务),您可以在 VPC 中配置 NAT 实例,或者可以使用 Amazon VPC NAT 网关。有关更多信息,请参阅 Amazon VPC 用户指南 中的 NAT 网关。您无法使用附加到 VPC 的 Internet 网关,因为这要求 ENI 具有公共 IP 地址。

重要

如果您的 Lambda 函数需要访问 Internet,请不要将它附加到公共子网或未接入 Internet 的私有子网。相反,仅通过 NAT 实例或 Amazon VPC NAT 网关将它附加到接入了 Internet 的私有子网。

设置支持 VPC 的 Lambda 函数的准则

您的 Lambda 函数会自动根据它处理的事件数量进行扩展。下面提供了设置支持 VPC 的 Lambda 函数来支持扩展行为的一般准则。

  • 如果您的 Lambda 函数访问 VPC,则必须确保您的 VPC 具备足够的 ENI 容量,可以满足您的 Lambda 函数的扩展需求。您可以使用以下公式来确定大致的 ENI 容量。

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

    其中:

    • Projected peak concurrent execution - 使用 Lambda 函数并行执行 中的信息来确定此值。

    • Memory - 您为 Lambda 函数配置的内存量。

     

  • 您指定的子网应具有足量的可用 IP 地址以匹配 ENI 的数目。

     

    我们还建议您在您的 Lambda 函数配置的每个可用区中至少指定一个子网。通过在每个可用区中指定子网,如果一个可用区出现故障或者 IP 地址不足,您的 Lambda 函数可以在其他可用区中运行。

注意

如果您的 VPC 没有足够的 ENI 或子网 IP,您的 Lambda 函数将不会随着请求的增加而扩展,并且您将会看到函数失败的次数不断增加。AWS Lambda 当前不会将 ENI 或子网 IP 不足而导致的错误记录到 CloudWatch Logs。如果您看到错误不断增加而没有对应的 CloudWatch Logs,则可以同步调用 Lambda 函数来获取错误响应(例如,在 AWS Lambda 控制台中测试您的 Lambda 函数,因为控制台会同步调用您的 Lambda 函数并显示错误)。