Ame*_*gre 5 amazon-web-services node.js ecmascript-6 aws-lambda nodejs-server
我编写了 lambda 函数,每当在 s3 存储桶上创建任何新对象时,它都会检索 s3 Url。检索 s3Url 后,此 lambda 通过 REST Call 向我的服务器发出请求。
我观察了云观察者。它未能向我的服务器发送请求我不想在我的 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();
};
Run Code Online (Sandbox Code Playgroud)
这是我的云观察器错误
{ "errorType": "Error", "errorMessage": "connect ETIMEDOUT 34.255.225.41:443", "code": "ETIMEDOUT", "errno": "ETIMEDOUT", "syscall": "connect", "address" : "34.255.225.41", "port": 443, "stack": [ "Error: connect ETIMEDOUT 34.255.225.41:443", " at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1107:14)" ] }
Jay*_*don 14
如果您尝试通过 AWS 开发工具包或直接通过 Lambda 的任何 HTTP 调用访问 S3(或任何其他 AWS 资源),则必须满足以下任一场景:
在AWS中,VPC提供两个网段,一个“公共”网络和一个“私有”网络。VPC 中的所有资源都可以与 VPC 中的其他资源通信,无论它们位于哪个网段。VPC公共网段上的资源将通过大多数 VPC 上提供的开箱即用的互联网网关路由公共互联网绑定流量。但是,在 VPC专用网段上设置的任何容器/资源都受到防火墙保护,并且在不安装 NAT 或为 VPC 创建接口终端节点的情况下没有公共 Internet 地址的路由。
配置为在 VPC 内运行的 Lambda 函数创建在VPC 的私有段内运行代码的容器。如果没有 NAT 或接口终端节点,Lambda 只能通过其内部 IP 地址/DNS 名称访问 VPC 内的任何资源。
当使用不带其他限定符的 AWS 开发工具包时,通常从其面向公众的服务域名(例如从 AWS S3)访问资源,尝试在没有 NAT 网关的 VPC 后面的 Lambda 中访问它们将导致您的函数接收ETIMEDOUT错误。出于同样的原因,在 Lambda 中使用任何 AWS 开发工具包时通常会发生这种情况。
如果您的函数需要位于 VPC 后面才能访问其他资源,那么您应该在 VPC 上设置NAT 网关,或者应该配置VPC 终端节点以供 lambda 函数使用。
否则,您应该确保您的 Lambda 未设置为使用 VPC,因为在 VPC 内运行它会导致额外的冷启动时间延迟以及网络连接挑战。
| 归档时间: |
|
| 查看次数: |
3128 次 |
| 最近记录: |