AWS Lambda 使用 Node Js 在 http.request() 上提供"connect ETIMEDOUT"



我已经编写了lambda函数,每当在s3 bucket上创建任何新对象时,该函数都会检索s3 Url。在检索s3Url之后,这个lambda通过REST调用向我的服务器发出请求。

我观察了云观察者。它无法向我的服务器发送请求我不想在lambda&我想让它变得轻量级,这就是我使用nodeJ的原因https。

这是我的Lambda代码

exports.handler =  (event,context,callback) => {
// Extract S3 Url and id From S3 object present in event
const https = require('https');
let {s3 , awsRegion} = event["Records"][0];
let {object : {key}, bucket : {name}} = s3;
let s3URL = `https://${name}.s3.${awsRegion}.amazonaws.com/${key}`;
console.log("sURL",s3URL);
let _id = key.split('/')[0];
console.log("id",_id);
//Making http request to my server
let body='';
// the post options
let optionsPost = {
host: 'xyz.abc.com', 
path: '/api/v1/apipath',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'XYZ',
'id' : _id
}
};
const keepAliveAgent = new https.Agent({ keepAlive: true });
optionsPost.agent = keepAliveAgent;
let reqPost =  https.request(optionsPost, function(res) {
console.log("statusCode: ", res.statusCode);
res.on('data', function (chunk) {
body += chunk;
});
res.on('end', function () {
console.log("Result", body.toString());
context.succeed("Sucess")
});
res.on('error', function () {
console.log("Result Error", body.toString());
context.done(null, 'FAILURE');
callback(new Error('failure')) // to return error
});
});
reqPost.write(JSON.stringify({ s3Url: s3URL,userName: 'SYSTEM' }));
reqPost.end();
};

这是我的云观察错误

{"errorType":"Error","errorMessage":"connect ETIMEDOUT 34.255.225.41:443","code":"ETIMEDOUT","errno":"ETIMEDOUT","syscall":"connection","address":"34.255.225,41","port":443,"stack":["Error:connect ETIMEDOUT34.255.225.4 1:443","在TCPConnectWrap.afterConnect[完成](net.js:1107:14("]}

如果您试图通过AWS SDK或直接通过Lambda的任何HTTP调用访问S3(或任何其他AWS资源(,则以下任一情况必须为真:

  • 您的Lambda未设置为在VPC中运行
  • 您的Lambda设置为在VPC中运行,并且VPC设置有NAT网关或设置为使用AWS PrivateLink

在AWS中,VPCs提供两个网段,一个">公共"网络和一个"专用’网络。专有网络中的所有资源都可以与专有网络中其他资源进行通信,无论它们在哪个网段上。但是,在VPC的私有段上设置的任何容器/资源都是防火墙,并且在没有安装NAT或为VPC创建接口端点的情况下,都没有公共互联网地址的路由。

配置为在VPC内运行的Lambda函数创建一个容器,该容器在VPC的私有段内运行代码。在没有NAT或接口端点的情况下,Lambda只能通过其内部IP地址/DNS名称访问VPC内的任何资源。

当使用不带其他限定符的AWS SDK时,通常从其面向公众的服务域名(如AWS S3(访问资源,尝试在没有NAT网关的VPC后面的Lambda中访问资源将导致您的功能接收ETIMEDOUT错误。出于同样的原因,在Lambda中使用任何AWS SDK时,通常会出现这种情况。

如果您的函数需要在VPC后面才能访问其他资源,那么您应该在您的VPC上设置NAT网关,或者为您的lambda函数配置VPC端点。

否则,您应该确保您的Lambda设置为而不是使用专有网络,因为在专有网络内运行会导致额外的冷启动时间延迟以及网络连接挑战。

最新更新