2016-09-19 1 views
0

У меня есть простая функция лямбда, которая записывает элементы в таблицу DynamoDB. имя пользователя - это ключ раздела, createDateTime - это ключ сортировки.Функция AWS Lambda возвращает ошибку из API Gateway, но не при непосредственном вызове

Вызов этой функции из самой лямбда успешно вставляет элементы в таблицу. Однако при вызове через API шлюза, я получаю следующее сообщение об ошибке

{ 
    "errorMessage": "Error putting order into dynamodb: MultipleValidationErrors: There were 14 validation errors:\n* InvalidParameterType: Expected params.Item['createDateTime'] to be a structure\n* UnexpectedParameter: Unexpected key '0' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '1' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '2' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '3' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '4' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '5' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '6' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '7' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '8' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '9' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '10' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '11' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '12' found in params.Item['createDateTime']" 
} 

Я не понимаю, почему мой код работает, когда вызывается локально, но не при вызове через API шлюза? Код ниже:

var AWS = require("aws-sdk"); 
var DOC = require("dynamodb-doc"); 

AWS.config.update({region: "eu-west-1"}); 
var dynamodb = new DOC.DynamoDB(); 

exports.handler = function(event, context) { 
    console.log('Received event:', JSON.stringify(event, null, 2)); 

    var tableName = "MarketOrder"; 

    if (event.http_method == 'POST') { 
     var datetime = new Date().getTime().toString(); 

     dynamodb.putItem({ 
      "TableName": tableName, 
      "Item" : { 
       "username" : event.username, 
       "createDateTime" : datetime, 
       "orderType": event.orderType, 
       "numberOfShares": event.numberOfShares, 
       "price": event.price, 
       "validToDate": event.validToDate 
      } 
     }, function(err, data) { 
      if (err) { 
       console.log("dynamodb error: " + err); 
       context.done('Error putting order into dynamodb: ' +err); 
      } 
      else { 
       console.log('great success: '+JSON.stringify(data, null, ' ')); 
       context.succeed('Sucessfully saved market order'); 
      } 
     }); 
    } 
    .... 
    } else { 
     context.fail('Invalid operation specified:' + event.http_method); 
    } 
}; 
+0

«Я не понимаю, почему мой код работает, когда вызывается локально, но не при вызове через API шлюза?» Кажется очевидным, что данные событий, передаваемые шлюзом API, отличаются от того, что вы тестировали напрямую. Я вижу, что вы регистрируете объект события в первой строке своей функции. Попробуйте сравнить журналы с прямым вызовом и вызовом шлюза API, и вы должны увидеть, в чем проблема. Возможно, вам потребуется изменить шаблон сопоставления API-шлюза. –

ответ

1

Скорее всего, существует проблема в вашем шаблоне сопоставления. Я бы предложил включить ведение журнала CloudWatch для вашего API для устранения неполадок.

См https://rpgreen.wordpress.com/2016/08/30/easy-api-gatewaylambda-serverless-api-loggingdebugging/

+0

Спасибо, картирование было проблемой. Поэтому проблема решена. Однако было бы неплохо получить тот инструмент, с которым вы связаны, чтобы работать, btu. Я получаю «ClientError: произошла ошибка (ResourceNotFoundException) при вызове операции FilterLogEvents: указанной группы журналов не существует». при вызове с python -m apilogs.bin get --api-id --stage prod --watch. Любые указатели? – Daniel

+0

Вам необходимо убедиться, что для вашего API включена регистрация. Я только что обновил инструмент, чтобы создать лучшее сообщение об ошибке и ссылку на документы. http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-stage-settings.html –

+0

Регистрация включена, я вижу фактические журналы в CloudWatch. Группа журналов называется «API-Gateway-Execution-Logs_ /». Возможно, я не понимаю, что положить после --api-id? – Daniel

 Смежные вопросы

  • Нет связанных вопросов^_^