配置 Lambda 函数以访问 VPC 中的资源 - AWS Lambda
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

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

将函数连接到 VPC

  1. 打开 Lambda 控制台

  2. 选择函数。

  3. VPC 下,选择 Edit (编辑)

  4. 选择 Custom VPC (自定义 VPC)

  5. 选择 VPC、子网和安全组。

    注意

    将函数连接到私有子网以访问私有资源。如果函数需要互联网访问权限,请使用 NAT。将函数连接到公有子网不会授予其互联网访问权限或公有 IP 地址。

  6. 选择保存

将函数连接到 VPC 时,Lambda 在函数的 VPC 配置中为每个安全组和子网组合创建一个弹性网络接口。此过程可能需要大约一分钟。在此期间,您无法执行针对该函数的其他操作,例如创建版本或更新函数的代码。对于新函数,在函数状态从 Pending 转换为 Active 之前,您无法调用该函数。对于现有函数,在更新过程中您仍然可以调用旧版本。有关函数状态的更多信息,请参阅使用 Lambda API 监控函数的状态

连接到相同子网的多个函数共享网络接口,因此将其他函数连接到已具有 Lambda 托管网络接口的子网要快得多。但是,如果您有许多函数或非常繁忙的函数,Lambda 可能会创建额外的网络接口。

如果您的函数长时间未活动,Lambda 会回收其网络接口,且函数变为 Idle。调用空闲函数以重新将其激活。第一次调用失败,并且函数再次进入挂起状态,直到网络接口可用。

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

执行角色和用户权限

Lambda 使用函数的权限来创建和管理网络接口。要连接到 VPC,您的函数的执行角色必须具有以下权限。

执行角色权限

  • ec2:CreateNetworkInterface

  • ec2:DescribeNetworkInterfaces

  • ec2:DeleteNetworkInterface

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

配置 VPC 连接时,Lambda 使用您的权限来验证网络资源。要配置函数以连接到 VPC,您的 IAM 用户需要以下权限。

用户权限

  • ec2:DescribeSecurityGroups

  • ec2:DescribeSubnets

  • ec2:DescribeVpcs

使用 Lambda API 配置 Amazon VPC 访问权限

您可以使用以下 API 将函数连接到 VPC。

要在使用 AWS CLI 创建期间将函数连接到 VPC,请将 vpc-config 选项与私有子网 ID 和安全组列表结合使用。以下示例创建一个连接到 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-config 选项与 update-function-configuration 命令结合使用。

$ 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 连接函数的 Internet 和服务访问

默认情况下,Lambda 在可访问 AWS 服务和 Internet 的安全 VPC 中运行您的函数。VPC 由 Lambda 拥有,并且不连接到您账户的默认 VPC。在将函数连接到您账户中的 VPC 时,除非 VPC 提供访问权限,否则它将无法访问 Internet。

注意

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

从私有子网访问 Internet 需要网络地址转换 (NAT)。要使您的函数能够访问 Internet,请将出站流量路由到公共子网中的 NAT 网关。NAT 网关具有公共 IP 地址,可以通过 VPC 的 Internet 网关连接到 Internet。有关更多信息,请参阅 Amazon VPC 用户指南 中的 NAT 网关

VPC 配置示例

本指南的 GitHub 存储库中提供了您可以与 Lambda 函数一起使用的 VPC 配置的示例 AWS CloudFormation 模板。存在以下两种模板:

  • vpc-private.yaml – 此 VPC 具有两个私有子网以及适用于 Amazon Simple Storage Service 和 Amazon DynamoDB 的 VPC 终端节点。您可以使用此模板为不需要 Internet 访问权限的函数创建 VPC。此配置支持与 AWS 软件开发包一起使用 Amazon S3 和 DynamoDB,以及通过本地网络连接访问相同 VPC 中的数据库资源。

  • vpc-privatepublic.yaml – 此 VPC 具有两个私有子网、VPC 终端节点、一个具有 NAT 网关的公有子网,以及一个 Internet 网关。来自私有子网中函数的 Internet 相关流量将通过路由表路由到 NAT 网关。

要使用模板创建 VPC,请选择AWS CloudFormation 控制台中的 Create stack (创建堆栈),然后按照说明操作。