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 }) }; } };
三、关键排查点
- DynamoDB表结构:确认'test'表的主键
id类型与写入数据一致(比如表主键是数字类型,就不能写入字符串格式的ID;类型不匹配会导致写入无报错但数据不入库) - 函数URL权限:检查函数URL是否开启PUT方法权限,默认仅允许GET请求
- 错误捕获逻辑:原代码未添加异常捕获,即使Put操作因主键类型不匹配、表不存在等原因失败,也会返回200;添加
try/catch后可暴露隐藏错误 - CloudWatch日志:添加
console.error后重新测试,查看CloudWatch的完整日志,包括请求详情和错误堆栈
内容的提问来源于stack exchange,提问作者DishiestAlarm
相关产品推荐
相关产品推荐

