AWS Lambda
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

您可以配置函数来连接到您账户中 Virtual Private Cloud (VPC) 中的私有子网。使用 Amazon Virtual Private Cloud (Amazon VPC) 为资源(如数据库、缓存实例或内部服务)创建专用网络。将您的函数连接到 VPC 来在执行期间访问私有资源。

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

Lambda 函数无法直接连接到具有专用实例租赁的 VPC。要连接到专用 VPC 中的资源,请使其与具有默认租赁的第二个 VPC 对等

执行角色和用户权限

要连接到 VPC,您的函数的执行角色必须具有以下权限。

执行角色权限

  • ec2:CreateNetworkInterface

  • ec2:DescribeNetworkInterfaces

  • ec2:DeleteNetworkInterface

这些权限包含在 AWSLambdaVPCAccessExecutionRole 托管策略中。

要配置函数来连接到 VPC,您需要以下权限。

用户权限

  • ec2:DescribeSecurityGroups

  • ec2:DescribeSubnets

  • ec2:DescribeVpcs

配置 Lambda 函数以访问 Amazon VPC

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

  • 在您创建 Lambda 函数时,create-function CLI 命令将指定 --vpc-config 参数来提供 VPC 信息。

    $ aws lambda create-function --function-name my-function \ --runtime go1.x --handler main --zip-file fileb://main.zip \ --role execution-role-arn \ --vpc-config SubnetIds=comma-separated-vpc-subnet-ids,SecurityGroupIds=comma-separated-security-group-ids
  • 可以在 update-function-configuration CLI 命令中指定 --vpc-config 参数,以将 VPC 信息添加到现有的 Lambda 函数配置。

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

    要从 Lambda 函数配置中删除与 VPC 相关的信息,请使用 UpdateFunctionConfiguration API,并提供子网 ID 和安全组 ID 的空白列表,如以下 CLI 命令示例所示。

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

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

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

对 Lambda 函数的 Internet 访问

AWS Lambda 使用您提供的 VPC 信息来设置 ENI,使您的 Lambda 函数能够访问 VPC 资源。将向每个 ENI 分配一个来自您指定的子网中 IP 地址范围的私有 IP 地址。默认情况下,连接到 VPC 的函数没有公有 IP 地址或 Internet 访问权限。

注意

有多个服务提供 VPC 终端节点。您可以使用 VPC 终端节点从 VPC 内连接到 AWS 服务,而无需 Internet 访问权限。

从私有子网访问 Internet 需要网络地址转换 (NAT)。您可以通过向 VPC 添加 NAT 网关或 NAT 实例来为您的函数提供访问 Internet 的权限。互联网网关不起作用,因为它需要公有 IP 地址。有关更多信息,请参阅 Amazon VPC 用户指南 中的 NAT 网关

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

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

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

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

    其中:

    • 预计峰值并发执行 – 您的函数必须支持的并发执行数。

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

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

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

如果您的 VPC 没有足够的 ENI 或子网 IP,您的 Lambda 函数将不会随着请求的增加而扩展,并且您将会看到调用错误次数不断增加,还会看到 EC2 错误类型(例如 EC2ThrottledException)。Amazon VPC 对ENI 创建应用限制。您可以在 支持中心控制台中请求提高该限制。