如何将 Lambda 函数连接到专用 VPC?

上次更新时间:2019 年 7 月 30 日

我想将一个 AWS Lambda 函数连接到一个专用 Virtual Private Cloud (VPC) 中的资源。该如何进行设置?

简短描述

由于 Lambda 目前不支持在专用租赁 VPC 中运行,因此必须在专用租赁 VPC 与包含您的 Lambda 函数的默认租赁 VPC 之间建立对等连接。有关 Amazon Elastic Compute Cloud (Amazon EC2) 实例租期和 VPC 的更多信息,请参阅专用实例基础知识

重要提示:本文假定您了解 Node.js 以及如何创建 Lambda 函数。此解决方案需要使用 Amazon Elastic Compute Cloud (Amazon EC2) 专用实例。请注意,您的 AWS 账户会因此实例产生费用。

解决方法

创建和配置 VPC

1.    在 Amazon VPC 控制台中,创建一个 VPC。对于 IPv4 CIDR 块,输入 12.0.0.0/16。对于租赁,选择默认

2.    创建另一个 VPC。对于 IPv4 CIDR 块,输入 11.0.0.0/16。对于租赁,选择专用

注意:如果您选择使用不同的 CIDR 块,请确保两个 VPC 具有不同且不重叠的数据块。

3.    创建一个互联网网关,然后将其附加到您的专用租赁 VPC。

注意:您稍后将在测试连接中创建的 HTTP 服务器将需要互联网网关。有关更多信息,请参阅启用互联网访问

4.    在您的每个 VPC 中创建子网。对于您的默认租赁 VPC(您稍后将通过您的 Lambda 函数来访问),在不同的可用区创建两个或以上子网。这是确保冗余的最佳实践,从而让 Lambda 为您的函数提供高可用性

注意:如果您仅在一个 VPC 中创建了一个子网,则可以使用与 VPC 相同的 CIDR 块。如果每个 VPC 中有多个子网,则使用该 VPC 的 CIDR 块的子集。有关更多信息,请参阅针对 IPv4 的 VPC 和子网大小调整

5.    在您创建的两个 VPC 之间创建 VPC 对等连接。在创建对等连接 页面执行以下操作:
(可选)对于对等连接名称标签,输入该 VPC 对等连接的名称。
对于 VPC(请求方),选择您创建的默认租赁 VPC。
对于账户,请确保已选中我的账户
对于区域,请确保已选中此区域
对于 VPC(接受方),选择您创建的专用租赁 VPC。
选择创建对等连接

6.    接受 VPC 对等连接

7.    向您的每个新 VPC 路由表添加路由 ,如此处所示。有关更多信息,请参阅在路由表中添加和删除路由

对于以 pcx-... 开头的目标值,选择对等连接,然后选择您创建的对等连接。
对于以 igw-... 开头的目标值,选择互联网网关,然后选择您创建的互联网网关。

默认租赁 VPC:

目的地 目标 状态 已填充
12.0.0.0/16 本地 活跃 没有
11.0.0.0/16 pcx-1a2b3c4d5e6f7g8h9 活跃 没有

专用租赁 VPC:

目的地 目标 状态 已填充
11.0.0.0/16 本地 活跃 没有
12.0.0.0/16 pcx-1a2b3c4d5e6f7g8h9 活跃 没有
0.0.0.0/0 igw-12345678a90b12c34 活跃 没有

为 Amazon VPC 创建 Lambda 执行角色

注意: 如果您已经拥有用于 Amazon VPC 访问的 Lambda 执行角色,请跳过这一部分。

1.    在 AWS Identity and Access Management (IAM) 控制台的左侧导航窗格中,选择角色

2.    在角色窗格中,选择创建角色

3.    在创建角色页面执行以下操作:
对于选择受信任实体的类型,选择 AWS 服务
对于选择将使用此角色的服务,选择 Lambda
选择下一步: 权限

4.    在附加权限策略下,搜索 AWSLambdaVPCAccessExecutionRole。选择具有该名称的策略,然后选择下一步:标签

5.    (可选)将标签添加到您的首选项。

6.    在审核下执行以下操作:
对于角色名称,输入此 Lambda 执行角色的名称。例如,lambda_vpc_basic_execution
(可选)对于角色描述,编辑您的首选项。
选择创建角色

创建新的 Lambda 函数进行测试

使用 Lambda 控制台或通过构建并上传您自己的部署程序包,创建一个新的函数。确保:

  • 在与默认租赁 VPC 相同的 AWS 区域创建该函数。
  • 附加您创建的执行角色,例如 lambda_vpc_basic_execution

对于测试,下面的一些示例函数代码使用了 Node.js 中的原生 HTTP 接口:

var http = require('http')
     
exports.handler = (event, context, callback) => {
    const options = {
        hostname: event.Host,
        port: event.Port
    }
    
    const response = {};
    
   http.get(options, (res) => {
        response.httpStatus = res.statusCode
        callback(null, response)
    }).on('error', (err) =>{
        callback(null, err.message);
    })
   
};

将 Lambda 函数连接到您的 VPC

1.    进入 Lambda 控制台,在配置窗格的网络下,执行以下操作:
对于 Virtual Private Cloud (VPC) ,选择您创建的默认租赁 VPC。
对于子网,选择您的 VPC 中的两个或更多子网。
对于安全组,选择一个安全组。
注意:默认安全组足以满足大多数使用案例的需要。有关更多信息,请参阅您的 VPC 的安全组

2.    选择保存

测试连接

1.    在您的专用租赁 VPC 中启动一个 EC2 实例。为了稍后连接到该实例,您需要一个可以在设置过程中分配的公有 IPv4 地址。您也可以在设置后将某个弹性 IP 地址关联到您的实例。

重要提示:您必须选择一个受支持的 EC2 实例类型作为专用实例。请注意,您的 AWS 账户会因此实例产生费用。

2.    验证两个 VPC 的网络访问控制列表 (ACL) 以及您的专用 EC2 实例的安全组均允许测试端口 (80) 上的流量。

3.    连接到您的 EC2 实例

4.    运行以下命令,从而在 EC2 实例上启动 HTTP 服务器:

# If python version is 2.x:
$ sudo python -m SimpleHTTPServer 80
# If python version is 3.x
$ sudo python -m http.server 80

5.    在 Lambda 控制台中,为您的函数配置测试事件。将此 JSON 用于您的事件,将 yourHost 替换为您的 EC2 实例的 IP 地址或主机名。

{
  "Host": "yourHost",
  "Port": 80
}

6.    在 Lambda 控制台中,选择测试

7.    检查执行结果的详细信息,看是否存在 200 响应代码,从而验证连接是否成功,具体如下所示:

{
  "statusCode": 200
}

如果函数输出显示的平均、最大和最小延迟为非空值,则表明您的 VPC 对等连接设置成功。

注意:如果 Lambda 超时,请确保您的安全组配置正确。如果您收到 ECONNREFUSED 错误,请确保您的 HTTP 服务器正在运行。