热释光;tr公司
我正试图连接到互联网从aws lambda,我有一个专用子网与nat网关,但仍然无法连接到互联网的功能。。。
完整问题
所以我尝试用我的aws lambda函数访问互联网。我试过java和nodejs4,但都没有成功。
我有一个私有专有网络,子网: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秒后超时”}
这是虫子吗?
注意:如果我没有选择我的专有网络,同样的功能也会起作用
3条答案
按热度按时间3ks5zfa01#
我发现错误,nat网关应该被添加到一个公共子网(而不是一个私有子网)。
公用子网是与internet网关路由关联的子网
0.0.0.0/0
3phpmpom2#
因为我也面临同样的问题,所以我对以上的回答更加清楚了一点-
将nat网关或nat示例添加到公用子网(具有
0.0.0.0/0
在相应(公共)子网路由表中进入internet网关编辑专用子网(运行lambda的位置)的路由表,以便为
0.0.0.0/0
到公用子网中的nat网关。确保分配给lambda的安全组允许出站连接。
zsohkypk3#
默认情况下,lambda函数不绑定到专有网络,这使它能够访问互联网,但阻止它访问专有网络中的资源,例如rds示例。
如果您将lambda连接到vpc,您将失去internet访问权限,这将阻止您访问s3和dynamo等资源,以及发出http请求。
如果你两个都需要,那我就得设置vpc上网,这是一个烂摊子(嘿aws的家伙,如果你有一个明确的过程,请让它简单:把它变成一个复选框或按钮;)
新建专有网络
我发现最好不要使用默认的专有网络,这样你就不会冒险破坏已经在该专有网络中工作的东西(以防你已经在那里有了资源),也因为你可以在将来使用默认的专有网络作为配置参考。
使用向导创建专有网络。
创建路由表
说出第一个
public-subnet
(如果还没有);说出第二个
private-lambda
. aws支持人员建议只为lambda设置一个单独的子网,并将此路由表附加到lambda。创建子网
默认情况下,当您创建专有网络时,它将为您创建一个公共子网。如果使用默认值,则其名称应为
Public subnet
. 就这样吧。现在要创建私有子网。如果您希望lambda具有高可用性,建议为其设置多个专用子网。
每个私有子网都将链接到您刚刚创建的专有网络。现在,假设您将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块的第三个位置有16个增量;-这些名称表示您所在区域中选定的可用性区域。确保路由表与子网关联
转到route tables面板;
选择公子网表,检查其关联,并确保它与公子网相关联;
选择私有lambda表,检查其关联,并确保它与所有
private-lambda-*
你刚刚创建的子网。创建internet网关
只需创建一个连接到专有网络。
配置公用子网的路由
在我的例子中,它是经过配置的,但是只要确保您的公共子网的路由表中有一个来自
0.0.0.0/0
到您刚刚创建的internet网关。创建nat(网络地址转换器)
创建一个新的nat并选择您的公共子网。分配新的eip。
配置专用子网的路由
确保您的专用子网的路由表中有来自
0.0.0.0/0
为你的新纳特干杯。通过这些步骤,您现在应该拥有一个支持互联网的专有网络。
用例:为internet和rds访问配置lambda
为lambda创建一个安全组
新建一个sg并配置出站->所有流量->到
0.0.0.0/0
以及::/0
修改rds示例的安全组以允许入站->所有交通->来自lambda sg
配置lambda
创建新lambda或选择现有lambda;
选择新的专有网络;
选择所有专用子网(
private-lambda-*
)高可用性;选择lambda安全组。
就这样。您现在应该有一个lambda函数,可以访问专有网络和互联网资源:)