You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:15:01