AWS Lambda handler中callback是否必需?如何传参并触发其他Lambda
AWS Lambda callback相关问题解答
1. callback是否为必需项及作用
Node.js运行时的AWS Lambda中,callback 不是必需项。Node.js 8及以上版本支持async/await写法,完全可以不用callback完成函数逻辑。
callback的作用是显式终止Lambda函数执行,并将执行结果返回给调用方:
- 第一个参数是Error类型,函数执行出错时传入,Lambda会判定本次执行失败
- 第二个参数为任意可序列化类型,函数执行成功时传入,作为本次执行的返回结果
如果不使用callback,Lambda默认会等待Node.js事件循环为空时才返回结果,也可以通过设置context.callbackWaitsForEmptyEventLoop = false强制提前返回。
2. 你当前代码的callback参数填写
你修改后的代码中已经没有定义sns变量,直接传sns会触发未定义变量报错。你可以把提取到的三个字段封装为对象传入callback的第二个参数:
callback(null, { sns_NameSpace, sns_ApiId, sns_MetricName });
注意:AWS SNS触发的事件中,
event.Records[0].Sns.Message默认是JSON字符串格式,你需要先调用JSON.parse(event.Records[0].Sns.Message)转成JS对象才能读取Trigger等嵌套字段,否则会出现属性读取报错。
3. 触发另一个Lambda并传递参数的实现方式
你需要通过AWS SDK的Lambda实例的invoke方法完成跨Lambda调用,步骤如下:
- 给当前Lambda的执行角色添加
lambda:InvokeFunction权限,允许其调用目标Lambda函数 - 代码中引入aws-sdk,初始化Lambda客户端,调用invoke方法时把需要传递的参数序列化后放在Payload字段中
- 不需要等待目标Lambda返回结果的场景下,InvocationType设为
Event走异步调用,需要同步等待返回的话设为RequestResponse
完整代码示例(callback写法):
const AWS = require('aws-sdk'); const lambda = new AWS.Lambda(); const TARGET_LAMBDA_NAME = '替换为你的目标Lambda函数名称'; exports.handler = function(event, context, callback) { console.log("AWS lambda and SNS trigger "); console.log(event); // 先把SNS Message从字符串转成对象 const snsMessage = JSON.parse(event.Records[0].Sns.Message); const sns_NameSpace = snsMessage.Trigger.Namespace; const sns_ApiId = snsMessage.Trigger.Dimensions.value; const sns_MetricName = snsMessage.Trigger.MetricName; console.log(sns_ApiId + '_' + sns_MetricName) console.log(sns_NameSpace) // 构造调用目标Lambda的参数 const invokeParams = { FunctionName: TARGET_LAMBDA_NAME, InvocationType: 'Event', // 异步调用 Payload: JSON.stringify({ sns_NameSpace, sns_ApiId, sns_MetricName }) }; // 调用目标Lambda lambda.invoke(invokeParams, (err, data) => { if (err) { console.error('调用目标Lambda失败', err); callback(err); return; } console.log('调用目标Lambda成功', data); callback(null, { sns_NameSpace, sns_ApiId, sns_MetricName }); }); };
如果使用async/await写法可以完全不用callback,代码更简洁:
const AWS = require('aws-sdk'); const lambda = new AWS.Lambda(); const TARGET_LAMBDA_NAME = '替换为你的目标Lambda函数名称'; exports.handler = async (event) => { console.log("AWS lambda and SNS trigger "); console.log(event); const snsMessage = JSON.parse(event.Records[0].Sns.Message); const sns_NameSpace = snsMessage.Trigger.Namespace; const sns_ApiId = snsMessage.Trigger.Dimensions.value; const sns_MetricName = snsMessage.Trigger.MetricName; console.log(sns_ApiId + '_' + sns_MetricName) console.log(sns_NameSpace) const invokeParams = { FunctionName: TARGET_LAMBDA_NAME, InvocationType: 'Event', Payload: JSON.stringify({sns_NameSpace, sns_ApiId, sns_MetricName}) }; await lambda.invoke(invokeParams).promise(); return {sns_NameSpace, sns_ApiId, sns_MetricName}; };
内容的提问来源于stack exchange,提问作者user630702
相关产品推荐
相关产品推荐

