任务在3.00秒后超时 - 使用nodeJS的Lambda应用程序

时间:2017-11-13 21:08:39

标签: amazon-dynamodb aws-lambda aws-sdk-nodejs

我正在尝试将一个硬编码数据项放到DynamoDB上。我正在使用AWS SDK对象来执行此更新。所有的调试" Console.log"在下面的代码中打印,但最终打印任务在3.00秒后超时

没有更新DynamoDB

function updatedb(intent, session, callback) {
    let country;
     const repromptText = null;
     const sessionAttributes = {};
     let shouldEndSession = false;

console.log("In the function");
const AWS = require("aws-sdk");
const docClient = new AWS.DynamoDB.DocumentClient({ region: 'eu-west-1' });

var params = {
    TableName: "Location",
    Item: {
        "LocationID": { "S": "11" },
        "Country": { "S": "10" },
        "Description": { "S": "10" },
        "Name": { "S": "10" }
    }
};
console.log("Param loaded & executing the DocClient Put");

docClient.put(params, function (err, data) {
    if (err) {
        speechOutput = 'Update failed';
        console.error("Unable to create table. Error JSON:", JSON.stringify(err, null, 2));
        callback(sessionAttributes,
            buildSpeechletResponse(intent.name, speechOutput, repromptText, shouldEndSession));
    } else {
        console.log("Created table. Table description JSON:", JSON.stringify(data, null, 2));
        speechOutput = 'Update successful';
        callback(sessionAttributes,
            buildSpeechletResponse(intent.name, speechOutput, repromptText, shouldEndSession));
    }
});
}

已检查以下项目

1)有一个名为"位置"在DynamoDB中 2)DynamoDB和这个lambda函数都在ue-west-1(爱尔兰) 3)为此Lambda函数分配的角色可以对此表执行所有操作。请参阅下面的政策详情

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "Stmt1510603004000",
        "Effect": "Allow",
        "Action": [
            "dynamodb:*"
        ],
        "Resource": [
            "arn:aws:dynamodb:eu-west-1:752546663632:table/Location"
        ]
    }
]
}

我的Lambda函数如何定位表" location"只是与该地区? - 代码似乎没有终点等? - 刚刚根据教程开发。

这就是我所缺少的吗?

请帮忙吗?

2 个答案:

答案 0 :(得分:0)

我相信AWS会根据您的身份以及区域和表名来定位表。

我能够使用以下代码成功发布到表格中:

const AWS = require('aws-sdk');

const dynamoDB = new AWS.DynamoDB({region: 'us-west-2'});

var params = {
  TableName: "my-table",
  Item: {
    "LocationID": { S: "11" },
    "Country": { S: "10" },
    "Description": { S: "10" },
    "Name": { S: "10" }
  }
};

dynamoDB.putItem(params, (err, data) => {
  if (err){
    console.error(err.stack);
  } else {
    console.log(data);
  }
});

如果您实际上可以从CLI发布到表中,那么仍然至少存在一个问题:您似乎错误地使用了DocumentClient类。您似乎将DynamoDB.putItem的语法与DynamoDB.DocumentClient.put的语法混合在一起。

如果您注意到,我的代码会直接使用DynamoDB类 - 根据您正在做的事情,我认为您没有理由不这样做。否则,您应该更改Item对象:

var params = {
  TableName: "my-table",
  Item: {
    "LocationID": "11",
    "Country": "10",
    "Description": "10",
    "Name": "10"
  }
};

我的猜测是您的代码当前错误,因为您尝试在要插入字符串的位置插入地图。如果您配置了Cloudwatch,则可以查看日志。

最后,我没有看到您在代码中使用callback。如果你打算回应一个叫lambda的客户,你应该这样做。根据您的NodeJS版本,lambda可以简单地超时而不返回有用的响应。

答案 1 :(得分:0)

我有一个类似的问题,尝试在函数的开头放置require语句。

const AWS = require("aws-sdk");
const docClient = new AWS.DynamoDB.DocumentClient({ region: 'eu-west-1' });