Node.js环境下DynamoDB Stream触发AWS Lambda调用失败问题求助
问题修复指南
你当前的代码和配置存在4个核心问题,按优先级修复即可:
- 异步操作未等待执行完成
你在exports.main中调用异步方法inkvokeTraLamda时没有加await关键字,同时使用Array.filter方法遍历记录时不会等待内部异步操作执行完成,Lambda处理函数执行完毕后进程会被立即回收,调用另一个Lambda的请求根本没来得及发出。
修复后的主处理函数代码:
exports.main = async (event) => { // 用for of遍历支持异步等待 for (const record of event.Records) { if (record.eventName.toUpperCase() === "INSERT") { const recordType = record.dynamodb.NewImage.type.S; if (recordType.toUpperCase() === "TRA") { // 加await等待调用完成 await inkvokeTraLamda(keyword, key, tag); } } } return { statusCode: 200 }; };
- 调用参数未定义、变量拼写错误
你的inkvokeTraLamda函数里只定义了拼写错误的playload(正确拼写为payload),但调用lambda.invoke时使用的params变量完全没有定义,也没有指定要调用的目标Lambda函数名,请求根本无法发出。
修复后的调用函数代码:
const AWS = require("aws-sdk"); const lambda = new AWS.Lambda({ region: "us-west-1" }); exports.inkvokeTraLamda = async function invoke( keyword, key, tag ) { // 构造合法的请求参数,替换YOUR_TARGET_LAMBDA_NAME为你要调用的Lambda函数名 const params = { FunctionName: "YOUR_TARGET_LAMBDA_NAME", // 内容转JSON字符串传入Payload Payload: JSON.stringify({ keyword, key, tag, }), // 如果不需要等待目标Lambda返回结果,可加下面这行配置异步调用,避免超时 // InvocationType: "Event" }; const resp = await lambda.invoke(params).promise(); console.log(resp); return resp; };
- 权限和触发器配置遗漏
- 你当前只配置了调用Lambda的权限,还需要给当前Lambda的执行角色添加DynamoDB流的读取权限,在serverless.yml的权限配置中补充如下内容:
- Effect: Allow Action: - dynamodb:GetRecords - dynamodb:GetShardIterator - dynamodb:DescribeStream - dynamodb:ListStreams Resource: "YOUR_DYNAMODB_STREAM_ARN" # 替换为你的DynamoDB流的ARN
- 确认你已经在serverless.yml中配置了DynamoDB Stream触发器,示例配置如下:
functions: yourStreamHandlerFunctionName: # 替换为你的流处理Lambda函数名 handler: 你的处理文件路径.main events: - stream: type: dynamodb arn: "YOUR_DYNAMODB_STREAM_ARN" batchSize: 10 startingPosition: LATEST filterPatterns: - eventName: [INSERT] # 可以直接在这里过滤INSERT事件,不需要代码里判断
- 优化建议
可以直接在触发器配置里加过滤规则只触发INSERT事件,不需要在代码里判断,减少不必要的Lambda执行次数。
内容的提问来源于stack exchange,提问作者Ben Jonson
相关产品推荐
相关产品推荐

