Reputation: 41
I an working in AWS writing to a dynamodb database from a lambda function. I am writing in Node.JS. I have console log writes before and after the write but the write doesn't seem to go to the table. I am thinking it is likely a authentication error or a config error. Below is the start of my code.
'use strict';
console.log('Loading function');
var AWS = require('aws-sdk');
AWS.config.update({region: 'us-west-2'});
var dynamo = new AWS.DynamoDB();
// let doc = require('dynamodb-doc');
//let dynamo = new doc.DynamoDB();
var DevicetableName = "DeviceReadings";
var AlarmtableName = "AlarmReports";
var datetime = new Date().getTime().toString();
/**
* v10
* Provide an event that contains the following keys:
*
* - eventType: type of event temp log or alarm
* - deviceID: ID of device reporting temp or alarm
* - deviceType: Type of device furnace or annealer
* - temp: temperature the device is reporting in fahrenheit degrees
* - alarmLevel: level of alarm severe, warning, informational....
* - alarmText: text of alarm for persisting and publishing
* - datetime: time of alarm or temp report
*/
exports.handler = (event, context, callback) => {
console.log('Received event:', JSON.stringify(event, null, 2));
const eventType = event.eventType;
switch (eventType) {
/* Update DB with current Temperature and alarm if needed */
case 'LogAnnealTemp':{
/* parse temp out of payload */
console.log('LogAnnealTemp Reached');
dynamo.putItem(
{
"TableName": DevicetableName,
"Item":
{
"deviceIDSensorID": {"S": "Dev1Sense1" },
"deviceType": {"S": "Anneal" },
"temp": {"N": "1969" },
"timeTaken": {"S": "today" },
"timeWritten": {"S": "alsotoday" }
}
});
console.log('LogAnnealTemp After Write Reached');
break;
}
case 'LogFurnaceTemp':{
/* parse temp out of payload */
console.log('LogAnnealTemp Reached');
/* If temp is over 2300 write to alarm topic */
if (event.temp >= 2300)
{
console.log('LogFurnaceTemp over 2300 Reached');
}
/* Else if temp is under 1900 write to alarm topic */
else if (event.temp <= 1900)
{
console.log('LogFurnaceTemp under 1900 Reached');
}
break;
}
case 'LogAlarm':{
/* parse alarm level out of payload */
/* If alarm is severe log and notify */
if (event.alarmlevel = "severe")
{
console.log('LogAlarm Severe');
}
/* Else if alarm is serious log and notify */
else if (event.alarmlevel = "serious")
{
console.log('LogAlarm Serious');
}
/* Else if alarm is warning log */
else if (event.alarmlevel = "warning")
{
console.log('LogAlarm Warning');
}
else if (event.alarmlevel = "informational")
{
console.log('LogAlarm Informational');
}
else {
console.log('LogAlarm Unknown');
}
break;
}
case 'ping':{
callback(null, 'pong');
break;
}
default:
callback(new Error(`Unrecognized operation "${operation}"`));
}
};
When I run this as a simple exec version of lambda it runs, writes to the console, but the write doesn't happen. When I run this as a micros service it blows up on the require statement. Any and all help appreciated.
Upvotes: 2
Views: 1281
Reputation: 7122
You should supply callback to your asynchronous calls and finish the Lambda
function context.
Consider the following:
dynamo.putItem({ ... }, function(err, data) {
if(err) {
console.error('dynamo failed', err);
context.fail();
} else {
context.done();
}
});
Upvotes: 2
Reputation: 200466
You aren't handling asynchronous calls correctly. Hint: your second console.log
happens while the database call is still running. You need to pass a callback function to the DB call. In that callback function you need to check for errors, and then do anything that needs to occur after the call has completed, like logging a message that it has completed.
Upvotes: 2