2

我在AWS中使用lambda函数写入dynamodb数据库。我正在写Node.JS.写入之前和之后我都有控制台日志写入,但写入似乎没有进入表格。我想这可能是一个身份验证错误或配置错误。以下是我的代码的开始。从AWS lambda函数写入dynamodb

'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}"`)); 
    } 


}; 

当我运行它作为lambda的一个简单的exec版本它运行,写入控制台,但写入不会发生。当我把它作为一个微服务运行时,它就要求声明。任何和所有帮助表示赞赏。

回答

2

您没有正确处理异步调用。提示:您的第二个console.log在数据库调用仍在运行时发生。您需要将回调函数传递给数据库调用。在该回调函数中,您需要检查错误,然后在完成调用后执行任何需要执行的操作,例如记录已完成的消息。

+0

这让我理顺的号召,仍然有权限的问题,虽然。将作为单独的问题发布。 – Art

+0

权限问题将通过调整您分配给Lambda函数的IAM角色来解决。 –

2

您应该为异步调用提供回调并完成Lambda函数上下文。

考虑以下几点:

dynamo.putItem({ ... }, function(err, data) { 
    if(err) { 
     console.error('dynamo failed', err); 
     context.fail(); 
    } else { 
     context.done(); 
    } 
}); 
+0

当我在 – Art

+0

添加这个时当我添加这个我刚刚得到{ “errorMessage”:null } – Art

+0

而你在日志中看到? – kixorz