Node.js开发的AWS Lambda函数无法查询EC2实例列表问题求助
问题原因
你代码存在两个问题导致无日志输出:
- 异步逻辑未等待完成就提前返回:你声明了
async类型的Lambda handler,但是调用ec2.describeInstances时用了回调模式,代码不会等待回调执行完成,就直接执行了return "Done"。Lambda函数在收到返回值后会立即冻结执行环境,回调里的日志打印逻辑根本没有运行机会,和你配置的权限、VPC无关。 - 回调参数顺序错误:AWS SDK for JavaScript v2的所有回调方法统一遵循
(err, data)的参数顺序,你原代码里写反为(data, err),就算回调能执行也会拿到错误的参数值,无法正常打印结果或报错。
解决方案
推荐使用async/await适配AWS SDK的Promise调用,逻辑更清晰,修改后的代码如下:
var AWS = require('aws-sdk'); AWS.config.update({region: 'ap-southeast-1'}); exports.handler = async function(event) { var ec2 = new AWS.EC2({apiVersion: '2016-11-15'}); var params = { DryRun: false }; try { // 调用.promise()将回调方法转为Promise,用await等待执行完成 const data = await ec2.describeInstances(params).promise(); console.log(data); } catch (err) { console.log(err); } return "Done" }
如果你要保留回调写法,需要去掉handler的async声明,用Lambda原生的callback参数控制返回时机,确保回调执行完成后再结束函数运行:
var AWS = require('aws-sdk'); AWS.config.update({region: 'ap-southeast-1'}); // 新增context和callback参数 exports.handler = function(event, context, callback) { var ec2 = new AWS.EC2({apiVersion: '2016-11-15'}); var params = { DryRun: false }; // 修正回调参数顺序 ec2.describeInstances(params, (err, data) => { if(err){ console.log(err) callback(null, "Done") }else{ console.log(data) callback(null, "Done") } }); }
内容的提问来源于stack exchange,提问作者rachit_verma
相关产品推荐
相关产品推荐

