使用 SQS-Lambda 集成将项目插入 DynamoDB 时出错
Error while inserting Item into DynamoBD with SQS-Lambda integration
我创建了一个 Lambda 函数,它使用 Node.js 10.x 将项目放入 DynamoDB table。 Lambda 函数已通过触发器与 SQS 队列集成。当我在队列中放入一条消息时,Lambda 被调用,但在 DynamoDB table.
中插入一个项目时抛出错误
消息 -> SQS -> Lambda -> DynamoDB
我将 TableName 和 Item 作为输入传递给 DynamoDB put 方法。但是,CloudWatch Logs 表示缺少 TableName 和 Item 参数。以下是代码片段和屏幕截图。
我确实花了很多时间,但没能解决这个问题。有人可以帮助我吗?
Lambda 代码
console.log('Loading function');
var AWS = require('aws-sdk');
var dynamo = new AWS.DynamoDB.DocumentClient();
exports.handler = function(event, context, callback) {
console.log('Received event:', JSON.stringify(event, null, 2));
event.Records.forEach(record => {
const { body } = record;
console.log("Input to DynamoAPI :", body);
dynamo.put(body, callback);
});
return {};
}
进入队列的消息
{
"TableName": "user-transaction",
"Item" : {
"transaction-id": 1
}
}
来自 CloudWatch 的错误消息
我检查了我自己的一个类似的 lambda,它成功地做了一个 put。
var params = {
TableName: dynamoUserTableName,
Item:{
"userId" : { S: event.request.userAttributes.sub},
"email" : { S: event.request.userAttributes.email},
"userName" : { S: event.userName},
"createdDate" : { S: createdDate },
"version" : { N: '1'}
}
};
console.log(params);
dynamodb.putItem(params, function(err, data) {...
这是我的控制台在 put
之前的输出
{ TableName: 'Users',
Item:
{ userId: { S: 'xxxxxxxxxxxxxxxxxxxxxxxxx' },
email: { S: 'test@example.co.uk' },
userName: { S: 'xxxxxxxxxxxxxxxxxxxxxxxx' },
createdDate: { S: '2020-05-02T07:49:23.478' },
version: { N: '1' } } }
我注意到我的属性名称周围没有引号,这可能是个问题?
我没有尝试过,但在我看来,dynamo put 调用中的 body 变量周围缺少 JSON.parse()
。
据我所知,SQS 将正文字符串化并且不会自动解析。
我在 SO 上找到的以下答案完美地总结了这一点:[1].
参考资料
[1]
我创建了一个 Lambda 函数,它使用 Node.js 10.x 将项目放入 DynamoDB table。 Lambda 函数已通过触发器与 SQS 队列集成。当我在队列中放入一条消息时,Lambda 被调用,但在 DynamoDB table.
中插入一个项目时抛出错误消息 -> SQS -> Lambda -> DynamoDB
我将 TableName 和 Item 作为输入传递给 DynamoDB put 方法。但是,CloudWatch Logs 表示缺少 TableName 和 Item 参数。以下是代码片段和屏幕截图。
我确实花了很多时间,但没能解决这个问题。有人可以帮助我吗?
Lambda 代码
console.log('Loading function');
var AWS = require('aws-sdk');
var dynamo = new AWS.DynamoDB.DocumentClient();
exports.handler = function(event, context, callback) {
console.log('Received event:', JSON.stringify(event, null, 2));
event.Records.forEach(record => {
const { body } = record;
console.log("Input to DynamoAPI :", body);
dynamo.put(body, callback);
});
return {};
}
进入队列的消息
{
"TableName": "user-transaction",
"Item" : {
"transaction-id": 1
}
}
来自 CloudWatch 的错误消息
我检查了我自己的一个类似的 lambda,它成功地做了一个 put。
var params = {
TableName: dynamoUserTableName,
Item:{
"userId" : { S: event.request.userAttributes.sub},
"email" : { S: event.request.userAttributes.email},
"userName" : { S: event.userName},
"createdDate" : { S: createdDate },
"version" : { N: '1'}
}
};
console.log(params);
dynamodb.putItem(params, function(err, data) {...
这是我的控制台在 put
之前的输出{ TableName: 'Users',
Item:
{ userId: { S: 'xxxxxxxxxxxxxxxxxxxxxxxxx' },
email: { S: 'test@example.co.uk' },
userName: { S: 'xxxxxxxxxxxxxxxxxxxxxxxx' },
createdDate: { S: '2020-05-02T07:49:23.478' },
version: { N: '1' } } }
我注意到我的属性名称周围没有引号,这可能是个问题?
我没有尝试过,但在我看来,dynamo put 调用中的 body 变量周围缺少 JSON.parse()
。
据我所知,SQS 将正文字符串化并且不会自动解析。 我在 SO 上找到的以下答案完美地总结了这一点:[1].
参考资料
[1]