TL; TR
我正在尝试从AWS Lambda连接到互联网,我有一个带NAT网关的私有子网,但功能仍无法连接到互联网...
完整问题
所以我试图通过我的AWS Lambda函数访问互联网 . 我已经尝试过Java和NodeJS 4而没有运气 .
我有一个子网的私有VPC:10.0.10.0/24
如您所见,我已将规则添加到NAT网关:
我将AWS Lambda配置为:
选择该子网(10.0.10.0)并使用对所有内容(入站和出站)开放的安全组
但是当我尝试从互联网上下载内容时,lambda会超时:
'use strict';
console.log('Loading function');
var http = require("http");
exports.handler = (event, context, callback) => {
//console.log('Received event:', JSON.stringify(event, null, 2));
console.log('value1 =', event.key1);
console.log('value2 =', event.key2);
console.log('value3 =', event.key3);
var options = {
host: 'www.virgilio.it',
port: 80,
path: '/'
};
http.get(options, function(res) {
console.log("Got response: " + res.statusCode);
}).on('error', function(e) {
console.log("Got error: " + e.message);
});
callback(null, event.key1); // Echo back the first key value
// callback('Something went wrong');
};
{“errorMessage”:“2016-05-10T10:11:46.936Z 79968883-1697-11e6-9e17-1f46a366f324任务在55.00秒后超时”}
这是一个错误吗?
Note: the same function works If I don't select my VPC
3 回答
我发现错误,NAT网关应该添加到公共子网(而不是私有子网) .
公有子网是与
0.0.0.0/0
关联的Internet Gatway路由的子网由于我遇到同样的问题,为上述答案增加了一点清晰度 -
将NAT网关或NAT实例添加到公有子网(在相应的(公共)子网路由表中具有到Internet网关的
0.0.0.0/0
条目的子网)编辑私有子网(运行lambda的路径)的路由表,以便为公共子网中的NAT网关提供
0.0.0.0/0
的条目 .确保分配给lambda的安全组允许出站连接 .
默认情况下,lambda函数不限于VPC,这使其能够访问Internet,但阻止它访问VPC中的资源,例如RDS实例 .
如果将lambda附加到VPC,则会丢失Internet访问权限,这会阻止您访问S3和Dynamo等资源以及发出HTTP请求 .
如果你需要两者,那么我将不得不设置VPC进行互联网访问,这是一个烂摊子(嘿,如果你有一个明确定义的流程的AWS人员,请把它变得简单:把它变成一个复选框或按钮;)
Create a new VPC
我发现最好不要单独使用默认的VPC,这样你就不会冒险破坏已经在VPC中运行的东西(如果你已经有资源),还因为你可以使用默认的VPC作为配置参考在将来 .
使用向导创建VPC .
Create the Route Tables
将第一个
public-subnet
命名(如果它尚未存在);将第二个
private-lambda
命名为 . AWS支持建议仅为lambda使用单独的子网,并将此路由表附加到该子网 .Create the subnets
默认情况下,在创建VPC时,它将为您创建公有子网 . 如果使用默认值,则其名称应为
Public subnet
. 把它留在那 .现在您要创建私有子网 . 如果您希望Lambda具有高可用性,建议您为Lambda使用多个私有子网 .
每个私有子网都将链接到您刚刚创建的VPC . 现在,假设您将VPC IP保留为
10.0.0.0/16
,并且您在弗吉尼亚州运行资源(us-east-1
),这里有一个模板,用于创建六个私有子网,每个子网位于不同的可用区(为了高可用性):private-lambda-us-east-1a
,可用区us-east-1a
,IP块10.0.16.0/24
private-lambda-us-east-1b
,可用区us-east-1b
,IP块10.0.32.0/24
private-lambda-us-east-1c
,可用区us-east-1c
,IP块10.0.48.0/24
private-lambda-us-east-1d
,可用区us-east-1d
,IP块10.0.64.0/24
private-lambda-us-east-1e
,可用区us-east-1e
,IP块10.0.80.0/24
private-lambda-us-east-1f
,可用区us-east-1f
,IP块10.0.92.0/24
但是你可以看到模式: - IP块的第3个位置有16个增量; - 名称表示您所在地区的选定可用区域 .
Ensure Route Table vs Subnet associations
转到路线表面板;
选择公共子网表,查看其关联并确保它与公共子网关联;
选择private-lambda表,查看其关联并确保它与您刚刚创建的所有
private-lambda-*
子网相关联 .Create an Internet Gateway
只需创建一个并将其附加到VPC .
Configure the routes for the Public Subnet
在我的情况下,它已配置,但只需确保您的公共子网的路由表有一个从
0.0.0.0/0
到您刚刚创建的Internet网关的条目 .Create a NAT (network address translator)
创建一个新的NAT和选择您的公共子网 . 分配新的EIP .
Configure the routes for the Private Subnets
确保私有子网的路由表具有从
0.0.0.0/0
到新NAT的条目 .通过这些步骤,您现在应该拥有支持Internet的VPC .
使用案例:为Internet和RDS访问配置Lambda
Create a Security Group for the lambda
0.0.0.0/0
和::/0
Modify the Security Group of your RDS instance to allow
Configure the lambda
创建一个新的lambda或选择一个现有的lambda;
选择新的VPC;
选择所有私有子网(
private-lambda-*
)以获得高可用性;选择您的lambda安全组 .
就是这样 . 你现在应该有一个lambda函数,可以访问VPC和Internet资源:)