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

3 分钟阅读
0

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

简短描述

Lambda 不支持在专用租赁 VPC 中运行函数。要将 Lambda 函数连接到专用 VPC,首先将专用 VPC 对等连接到包含该函数的默认租赁 VPC。

此解决方案需要使用 Amazon Elastic Compute Cloud (Amazon EC2) 专用实例。请注意,您的 AWS 账户会因此实例产生费用。有关 Amazon EC2 实例租赁和 VPC 的更多信息,请参阅专用实例基础知识

解决方法

**注意:**以下程序要求您了解 Node.js如何创建 Lambda 函数

创建和配置默认租赁 VPC 和专用租赁 VPC

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

1.    在 Amazon VPC 控制台中,创建具有以下设置的默认租赁 VPC
对于 IPv4 CIDR 数据块,请输入 12.0.0.0/16
对于 Tenancy(租赁),选择 Default(默认)。

2.    创建具有以下设置的专用租赁 VPC:
对于 IPv4 CIDR 块,输入 11.0.0.0/16
对于 Tenancy(租赁),选择 D****edicated(专用)。

3.    创建一个互联网网关,然后将其附加到您的专用租赁 VPC
注意:您稍后将在测试连接中创建的 HTTP 服务器将需要互联网网关。有关更多信息,请参阅启用互联网访问

4.    在您的每个 VPC 中创建子网。对于默认租赁 VPC,跨不同可用区创建两个或更多个子网。
**注意:**在不同可用区间创建多个子网是冗余的最佳实践。这样做还可以让 Lambda 为您的函数提供高可用性。如果每个 VPC 中有多个子网,则使用该 VPC 的 CIDR 块的子集。如果您仅在一个 VPC 中创建一个子网,则可以使用与 VPC 相同的 CIDR 块。有关更多信息,请参阅针对 IPv4 的 VPC 和子网大小调整

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

6.    接受 VPC 对等连接

7.    向您的每个新 VPC 路由表添加路由,如下面的示例所示。创建路由表时,请确保执行以下操作:
对于以 pcx-... 开头的目标值,请选择 Peering Connection(对等连接)。然后,选择您创建的对等连接。
对于以 igw-... 开头的目标值,选择 Internet Gateway(互联网网关)。然后,选择您创建的互联网网关。

有关更多信息,请参阅在路由表中添加和删除路由

默认租赁 VPC 路由表示例

目的地目标状态已传播
12.0.0.0/16本地活跃
11.0.0.0/16pcx-1a2b3c4d5e6f7g8h9活跃

专用租赁 VPC 路由表示例

目的地目标状态已传播
11.0.0.0/16本地活跃
12.0.0.0/16pcx-1a2b3c4d5e6f7g8h9活跃
0.0.0.0/0igw-12345678a90b12c34活跃

为 Amazon VPC 创建 Lambda 执行角色

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

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

2.    在 Roles(角色)窗格中,选择 Create role(创建角色)。

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

4.    在 Attach permissions policies(附加权限策略)中,搜索 AWSLambdaVPCAccessExecutionRole。选择具有该名称的策略,然后选择 Next: Tags(下一步:标签)。

5.    (可选)添加可使您识别和组织新资源的标签

6.    对于 Review(查看),请输入以下内容:
对于 Role name(角色名称),输入 Lambda 执行角色的名称。例如,lambda_vpc_basic_execution
(可选)对于 Role description(角色描述),编辑描述。
选择 Create role(创建角色)。

创建新的 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 控制台中的 Configuration(配置)选项卡上,选择 VPC。然后,选择 Edit(编辑)并执行以下操作:
对于 Virtual Private Cloud (VPC),选择您创建的默认租赁 VPC。
对于子网,选择您的 VPC 中的两个或更多子网。
对于安全组,选择一个安全组。
注意:默认安全组足以满足大多数使用案例的需要。有关更多信息,请参阅您的 VPC 的安全组

2.    选择 Save(保存)。

测试连接

1.    在您的专用租赁 VPC 中启动一个 EC2 实例
**注意:**要想稍后连接到 EC2 实例,您需要一个可以在设置过程中分配的公有 IPv4 地址。您也可以在设置后将某个弹性 IP 地址关联到您的实例。您必须选择一个受支持的 EC2 实例类型作为专用实例。请注意,您的 AWS 账户会因此实例产生费用。

2.    确认两个 VPC 的网络访问控制列表 (ACL) 允许以下各项的流量:
您正在测试的端口 (80)。
您的专用 EC2 实例的安全组。

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.    选择 Details(详细信息)以检查 200 响应代码的执行结果,以确认连接成功。

示例 200 响应代码

{
  "statusCode": 200
}

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

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


相关信息

专用实例

什么是 VPC 对等?

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

使用 Node.js 构建 Lambda 函数

使用 AWS Lambda 函数的最佳实践

AWS 官方
AWS 官方已更新 3 年前