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

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

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

将函数连接到 VPC 时,Lambda 在函数的 VPC 配置中为每个安全组和子网组合创建一个弹性网络接口。此过程可能需要大约一分钟。

当 Lambda 创建网络接口时,您无法执行针对该函数的其他操作,例如创建版本或更新函数的代码。对于新函数,在函数状态从 Pending 更改为 Active 之前,您无法调用该函数。对于现有函数,在更新过程中您仍然可以调用之前的版本。有关函数状态的更多信息,请参阅使用 Lambda API 监控函数的状态

连接到相同子网的多个函数共享网络接口。将附加函数连接到具有现有 Lambda 托管网络接口的子网要比让 Lambda 创建其他网络接口快得多。但是,如果您有许多函数,或函数具有较高的网络使用率,则 Lambda 仍可能会创建额外的网络接口。

如果您的函数长时间未处于活动状态,Lambda 会回收其网络接口,且函数变为 Idle。要重新激活空闲函数,请调用它。此调用失败,并且函数再次进入 Pending 状态,直到网络接口可用。

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

执行角色和用户权限

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

执行角色权限

  • ec2:CreateNetworkInterface

  • ec2:DescribeNetworkInterfaces

  • ec2:DeleteNetworkInterface

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

配置 VPC 连接时,Lambda 使用您的权限来验证网络资源。要配置函数以连接到 VPC,您的 AWS Identity and Access Management (IAM) 用户需要以下权限:

用户权限

  • ec2:DescribeSecurityGroups

  • ec2:DescribeSubnets

  • ec2:DescribeVpcs

使用 Lambda 控制台配置 VPC 访问权限

如果您的 IAM 权限仅允许您创建连接到 VPC 的 Lambda 函数,则必须在创建函数时配置 VPC。如果您的 IAM 权限允许您创建未连接到 VPC 的函数,则可以在创建函数后添加 VPC 配置。

在创建函数时配置 VPC

  1. 打开 Lambda 控制台 函数页面

  2. 选择创建函数

  3. 基本信息下的函数名称中输入函数的名称。

  4. 展开 Advanced settings (高级设置)

  5. 网络下,选择函数要访问的 VPC

  6. 选择子网和安全组。选择安全组时,控制台会显示该安全组的入站和出站规则。

    注意

    要访问私有资源,请将函数连接到私有子网。如果您的函数需要 Internet 访问权限,请使用网络地址转换 (NAT)。将函数连接到公有子网不会授予其 Internet 访问权限或公有 IP 地址。

  7. 选择创建函数

为现有函数配置 VPC

  1. 打开 Lambda 控制台 函数页面

  2. 选择函数。

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

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

    注意

    要访问私有资源,请将函数连接到私有子网。如果您的函数需要 Internet 访问权限,请使用网络地址转换 (NAT)。将函数连接到公有子网不会授予其 Internet 访问权限或公有 IP 地址。

  5. 选择 Save

使用 Lambda API 配置 VPC 访问权限

要将 Lambda 函数连接到 VPC,您可以使用以下 API 操作:

要创建函数并使用 AWS Command Line Interface (AWS CLI) 将其连接到 VPC,您可以使用带 vpc-config 选项的 create-function 命令。以下示例创建一个连接到 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,请将 update-function-configuration 命令与 vpc-config 选项结合使用。

$ 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 设置使用 IAM 条件键

您可以对 VPC 设置使用 Lambda 特定的条件键来为您的 Lambda 函数提供额外的权限控制。例如,您可以要求组织中的所有函数都连接到 VPC。您还可以指定函数的用户可以使用和不能使用的子网和安全组。

Lambda 在 IAM 策略中支持以下条件键:

  • lambda:VpcIds – 允许或拒绝一个或多个 VPC。

  • lambda:SubnetIds – 允许或拒绝一个或多个子网。

  • lambda:SecurityGroupIds – 允许或拒绝一个或多个安全组。

Lambda API 操作 CreateFunctionUpdateFunctionConfiguration 支持这些条件键。有关在 IAM 策略中使用条件键的更多信息,请参阅 IAM 用户指南 中的 IAM JSON 策略元素:条件

提示

如果您的函数已包含来自前一个 API 请求的 VPC 配置,则可以发送不带 VPC 配置的 UpdateFunctionConfiguration 请求。

带有用于 VPC 设置的条件键的示例策略

以下示例演示如何将条件键用于 VPC 设置。创建具有所需限制的策略语句后,为目标 IAM 用户或角色附加策略语句。

确保用户仅部署与 VPC 连接的函数

要确保所有用户仅部署与 VPC 连接的函数,您可以拒绝不包含有效 VPC ID 的函数创建和更新操作。

请注意,VPC ID 不是 CreateFunctionUpdateFunctionConfiguration 请求的输入参数。Lambda 根据子网和安全组参数检索 VPC ID 值。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceVPCFunction", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "Null": { "lambda:VpcIds": "true" } } } ] }

拒绝用户访问特定的 VPC、子网或安全组

要拒绝用户访问特定 VPC,请使用 StringEquals 检查 lambda:VpcIds 条件的值。以下示例拒绝用户访问 vpc-1vpc-2

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceOutOfVPC", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "StringEquals": { "lambda:VpcIds": ["vpc-1", "vpc-2"] } } }

要拒绝用户访问特定子网,请使用 StringEquals 检查 lambda:SubnetIds 条件的值。以下示例拒绝用户访问 subnet-1subnet-2

{ "Sid": "EnforceOutOfSubnet", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "lambda:SubnetIds": ["subnet-1", "subnet-2"] } } }

要拒绝用户访问特定安全组,请使用 StringEquals 检查 lambda:SecurityGroupIds 条件的值。以下示例拒绝用户访问 sg-1sg-2

{ "Sid": "EnforceOutOfSecurityGroups", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "lambda:SecurityGroupIds": ["sg-1", "sg-2"] } } } ] }

允许用户使用特定 VPC 设置创建和更新函数

要允许用户访问特定的 VPC,请使用 StringEquals 检查 lambda:VpcIds 条件的值。以下示例允许用户访问 vpc-1vpc-2

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceStayInSpecificVpc", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Allow", "Resource": "*", "Condition": { "StringEquals": { "lambda:VpcIds": ["vpc-1", "vpc-2"] } } }

要允许用户访问特定子网,请使用 StringEquals 检查 lambda:SubnetIds 条件的值。以下示例允许用户访问 subnet-1subnet-2

{ "Sid": "EnforceStayInSpecificSubnets", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Allow", "Resource": "*", "Condition": { "ForAllValues:StringEquals": { "lambda:SubnetIds": ["subnet-1", "subnet-2"] } } }

要允许用户访问特定的安全组, 请使用 StringEquals 检查 lambda:SecurityGroupIds 条件的值。以下示例允许用户访问 sg-1sg-2

{ "Sid": "EnforceStayInSpecificSecurityGroup", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Allow", "Resource": "*", "Condition": { "ForAllValues:StringEquals": { "lambda:SecurityGroupIds": ["sg-1", "sg-2"] } } } ] }

VPC 连接函数的 Internet 和服务访问

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

注意

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

从私有子网访问 Internet 需要网络地址转换 (NAT)。要使您的函数能够访问 Internet,请将出站流量路由到公有子网中的 NAT 网关。NAT 网关具有公共 IP 地址,可以通过 VPC 的 Internet 网关连接到 Internet。有关更多信息,请参阅如何在 VPC 中为我的 Lambda 函数提供 Internet 访问权限?

VPC 教程

在以下教程中,您会将 Lambda 函数连接到 VPC 中的资源。

VPC 配置示例

您可以使用以下示例 AWS CloudFormation 模板创建要与 Lambda 函数一起使用的 VPC 配置。本指南的 GitHub 存储库中有两个模板可用:

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

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

要使用模板创建 VPC,请在 AWS CloudFormation 控制台的“堆栈”页面上选择创建堆栈,然后按照 创建堆栈向导中的说明操作。