giò*_*giò 7 java amazon-web-services node.js aws-lambda
我正在尝试从AWS Lambda连接到Internet,我有一个带NAT网关的私有子网,但该功能仍无法连接到Internet ...
因此,我尝试使用我的AWS Lambda函数访问互联网。我已经尝试过Java和NodeJS 4,但都没有碰运气。
我有一个带有子网的私有VPC:10.0.10.0/24
如您所见,我已经在NAT网关中添加了一条规则:
我将AWS Lambda配置如下:
选择该子网(10.0.10.0)并使用对所有内容(入站和出站)都开放的安全组
但是,当我尝试从Internet下载某些内容时,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');
};
Run Code Online (Sandbox Code Playgroud)
{“ errorMessage”:“ 2016-05-10T10:11:46.936Z 79968883-1697-11e6-9e17-1f46a366f324任务在55.00秒后超时”}
这是错误吗?
注意:如果我不选择我的VPC,同样的功能也可以工作
默认情况下,lambda函数未绑定到VPC,这使它能够访问Internet,但是阻止其访问VPC中的资源,例如RDS实例。
如果将lambda附加到VPC,则会失去Internet访问权限,这将阻止您访问S3和Dynamo之类的资源以及发出HTTP请求。
如果两者都需要,那么我将不得不设置VPC进行互联网访问(这很麻烦(AWS伙计们,如果您有一个定义明确的流程,请简化一下):将其变成复选框或按钮;)
创建一个新的VPC
我发现最好不要使用默认VPC,这样您就不会冒险破坏该VPC中已经在工作的某些东西(如果您那里已有资源),并且还因为可以使用默认VPC作为配置参考在将来。
使用向导创建VPC。
创建路由表
public-subnet
(如果尚未命名);private-lambda
。AWS支持建议仅为lambda使用一个单独的子网,并且此路由表将附加到该子网。创建子网
默认情况下,创建VPC时,它将为您创建一个公共子网。如果使用默认值,则其名称应为Public subnet
。留在那。
现在,您将创建专用子网。如果您希望Lambda具有高可用性,建议为它拥有多个专用子网。
这些专用子网中的每一个都将链接到您刚创建的VPC。现在,假设您将VPC IP保留为10.0.0.0/16
,并且您在Virginia(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;-名称表示您所在地区的所选可用区域。
确保路由表与子网关联
private-lambda-*
您刚创建的所有子网都关联。创建一个互联网网关
只需创建一个并将其附加到VPC。
配置公共子网的路由
就我而言,它已经配置好了,但是只要确保您的公共子网的路由表中有一个0.0.0.0/0
刚创建的Internet网关的条目即可。
创建一个NAT(网络地址转换器)
创建一个新的NAT并选择您的公共子网。分配新的EIP。
配置专用子网的路由
确保专用子网的路由表具有0.0.0.0/0
新NAT 的条目。
通过这些步骤,您现在应该拥有一个启用Internet的VPC。
为lambda创建一个安全组
0.0.0.0/0
和::/0
修改您的RDS实例的安全组以允许
配置lambda
private-lambda-*
)以实现高可用性;就是这样。现在,您应该具有可以访问VPC和Internet资源的lambda函数:)
由于我遇到了同样的问题,因此上述答案更加清晰 -
0.0.0.0/0
在相应的(公共)子网路由表中具有 Internet 网关条目的那个
)0.0.0.0/0
以便在公共子网中有一个NAT 网关的条目。