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

AWS Lambda调用DynamoDB put方法无法添加数据至表的求助

问题:Lambda Put操作无法写入DynamoDB,无报错但数据未入库

我用AWS Lambda搭建基础数据库API,通过Lambda函数URL调用。根据ID查询数据的功能完全正常,但用Put方法时,数据始终无法写入DynamoDB表。

试过多种方法和示例都无效:使用AWS文档及其他指南的示例时,遇到过502错误、Node.js版本问题、import与require兼容问题;还有部分示例运行无报错,但数据就是没进入表中。Lambda执行角色已配置DynamoDBFullAccess权限(甚至添加了所有名称含DynamoDB的策略)。

需要的解决方案不仅是代码片段,还要包含函数设置信息(比如适配的Node.js版本)、完整的导入导出代码。

以下是可正常运行的按ID查询的Lambda代码:

const AWS = require ('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient({
  region: 'us-east-1'
});
exports.handler = async (event) => {
 
 const id = +event.queryStringParameters.id
 
 const params = {
  TableName: "test",
  Key: {
     "id": id
  }
 };

 const data = await dynamoDb.get(params).promise();
 
 const response = {}
 
 if ((typeof data) === "object") {
  response.statusCode = 200;
  response.body = JSON.stringify(data);
 } else {
  response.statusCode = 500;
 }
 return response;
};

我尝试的Put方法代码:返回200状态码及空对象(符合预期),但硬编码的项并未添加至名为'test'的表中,CloudWatch无任何错误信息。

const AWS = require ('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient({
  region: 'us-east-1'
});
exports.handler = async (event) => {
 
 const params = {
  TableName: "test",
  Item: {
     "id": 1
  }
 };

 const data = await dynamoDb.put(params).promise();
 
 const response = {}
 
 if ((typeof data) === "object") {
  response.statusCode = 200;
  response.body = JSON.stringify(data);
 } else {
  response.statusCode = 500;
 }
 return response;
};

解决方案

一、Lambda函数设置要求

  • Node.js版本:使用Node.js 16.x或18.x(避免用20.x,AWS SDK v2在高版本存在兼容风险;若使用SDK v3需调整导入逻辑,此处延续你当前的SDK v2写法)
  • 执行角色:确认角色已关联AmazonDynamoDBFullAccess策略,且信任关系配置正确(允许lambda.amazonaws.com调用该角色)
  • 函数URL配置:确保允许PUT请求——在Lambda控制台的函数URL设置中,将PUT加入「允许的HTTP方法」列表

二、完整可运行的Put操作代码

const AWS = require('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient({ region: 'us-east-1' });

exports.handler = async (event) => {
  // 校验请求方法,避免非PUT请求触发写入
  if (event.httpMethod !== 'PUT') {
    return {
      statusCode: 405,
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ error: '仅允许PUT请求' })
    };
  }

  try {
    // 可替换为从请求体获取动态数据,需先解析JSON
    // const item = JSON.parse(event.body);
    const item = { id: 1 }; // 硬编码示例

    const params = {
      TableName: 'test',
      Item: item,
      // 可选:添加条件表达式,避免覆盖已存在的同ID项
      // ConditionExpression: 'attribute_not_exists(id)'
    };

    // 执行写入操作
    await dynamoDb.put(params).promise();

    // 返回成功响应,携带写入的项信息
    return {
      statusCode: 200,
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ message: '数据写入成功', item: item })
    };
  } catch (error) {
    // 捕获并输出错误,方便排查
    console.error('DynamoDB写入失败:', error);
    return {
      statusCode: 500,
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ error: '写入失败', details: error.message })
    };
  }
};

三、关键排查点

  1. DynamoDB表结构:确认'test'表的主键id类型与写入数据一致(比如表主键是数字类型,就不能写入字符串格式的ID;类型不匹配会导致写入无报错但数据不入库)
  2. 函数URL权限:检查函数URL是否开启PUT方法权限,默认仅允许GET请求
  3. 错误捕获逻辑:原代码未添加异常捕获,即使Put操作因主键类型不匹配、表不存在等原因失败,也会返回200;添加try/catch后可暴露隐藏错误
  4. CloudWatch日志:添加console.error后重新测试,查看CloudWatch的完整日志,包括请求详情和错误堆栈

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:35:01