LambdaEdge触发的Node.js函数无法写入DynamoDB问题排查
问题原因及修复方案
你的代码存在两个关键问题,导致DynamoDB数据插入失败:
1. await与回调函数混用,异步操作未被正确等待
ddb.putItem在传入回调函数时不会返回Promise,所以你写的await完全无效。Lambda函数会直接跳过写入逻辑,提前返回重定向响应——此时DynamoDB的写入操作还没完成,就被Lambda的执行环境强制终止了。
2. Lambda@Edge的权限与区域兼容性(潜在验证点)
Lambda@Edge运行在CloudFront边缘节点,而你的DynamoDB表部署在us-east-1,需要额外确认:
- Lambda执行角色拥有
dynamodb:PutItem权限,且策略明确允许访问目标表 - 边缘环境的AWS SDK版本兼容DynamoDB的API调用(通常默认SDK版本满足需求,但需避免硬编码区域导致的解析问题)
修复后的代码
将putItem改为Promise风格调用,让await能正确等待写入完成:
var AWS = require("aws-sdk"); var ddb = new AWS.DynamoDB({apiVersion: '2012-08-10', region: 'us-east-1'}); exports.handler = async (event, context) => { var params = { TableName: 'MYTABLE', Item: { 'id' : {'S': 'something'}, 'value' : {'S': 'something'} } }; try { // 使用promise()方法转为Promise调用,确保await等待执行完成 const data = await ddb.putItem(params).promise(); console.log("Success", data); } catch (err) { console.log("Error", err); // 可根据需求添加错误处理逻辑,比如记录日志后继续重定向 } const response = { status: '302', statusDescription: 'Found', headers: { location: [{ key: 'Location', value: 'https://www.google.com', }], }, }; return response; };
额外检查项
- 查看Lambda@Edge的CloudWatch日志(需切换到边缘节点对应的区域日志组),确认是否有DynamoDB的权限或网络错误信息
- 验证Lambda执行角色的权限策略,确保包含以下规则:
{ "Effect": "Allow", "Action": "dynamodb:PutItem", "Resource": "arn:aws:dynamodb:us-east-1:你的AWS账号ID:table/MYTABLE" }
内容的提问来源于stack exchange,提问作者Thomas Carlton
相关产品推荐
相关产品推荐

