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

Node.js环境下DynamoDB Stream触发AWS Lambda调用失败问题求助

问题修复指南

你当前的代码和配置存在4个核心问题,按优先级修复即可:

  1. 异步操作未等待执行完成
    你在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 };
};
  1. 调用参数未定义、变量拼写错误
    你的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;  
};
  1. 权限和触发器配置遗漏
  • 你当前只配置了调用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事件,不需要代码里判断
  1. 优化建议
    可以直接在触发器配置里加过滤规则只触发INSERT事件,不需要在代码里判断,减少不必要的Lambda执行次数。

内容的提问来源于stack exchange,提问作者Ben Jonson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 18:06:03