Запись функции AWS Lambda в DynamoDB

Я новичок в Amazon Web Services и NodeJS.

Я написал функцию Lambda, запускаемую AWS IoT, которая анализирует JSON.

enter code here
use strict';

console.log('Loading function');

exports.handler = (event, context, callback) => {
   console.log('Received event:', JSON.stringify(event, null, 2));
   console.log('Id =', event.Id);
   console.log('Ut =', event.Ut);
   console.log('Temp =', event.Temp);
   console.log('Rh =', event.Rh);
   //callback(null, event.key1);  // Echo back the first key value
   //callback('Something went wrong');
};

Теперь я хочу сохранить поля json в таблице DynamoDB.

Любое предложение?

Большое спасибо!


person Federico    schedule 06.03.2017    source источник


Ответы (2)


Предварительные действия: -

  1. Создайте Lambda-роль IAM с доступом к Dynamodb
  2. Запустите Lambda в том же регионе, что и ваш регион Dynamodb
  3. Создайте таблицу DynamoDB с определенными правильными ключевыми атрибутами

Пример кода: -

Приведенный ниже фрагмент кода представляет собой образец кода, чтобы дать вам некоторое представление о том, как разместить элемент. Обратите внимание, что он должен быть немного изменен в соответствии с вашими требованиями (с именем таблицы и ключевыми атрибутами). Это не полностью протестированный код.

use strict';

console.log('Loading function');
var AWS = require('aws-sdk');
var dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

exports.handler = (event, context, callback) => {
    console.log(JSON.stringify(event, null, '  '));
    var tableName = "yourtablename";    
    dynamodb.putItem({
        "TableName": tableName,
        "Item" : {
            "Id": event.Id,
            "Ut": event.Ut,
            "Temp": event.Temp,
            "Rh":event.Rh
        }
    }, function(err, data) {
        if (err) {
            console.log('Error putting item into dynamodb failed: '+err);
            context.done('error');
        }
        else {
            console.log('great success: '+JSON.stringify(data, null, '  '));
            context.done('Done');
        }
    });
};

Примечание: -

Нет необходимости явно указывать тип данных для String и Number, если тип данных соответствует JavaScript String и Number. DynamoDB автоматически интерпретирует тип данных для String и Number.

person notionquest    schedule 06.03.2017
comment
Спасибо за ответ. Я создаю таблицу DynamoDB с первичным ключом: Id и Order Key: Ut оба являются строками. Я создаю роль в IAM для Lambda с полным доступом к DynamoDb. К сожалению, я получаю сообщение об ошибке: {errorMessage: error} - person Federico; 06.03.2017
comment
Это ошибка: Ошибка при помещении элемента в Dynamodb: MultipleValidationErrors: Произошло 3 ошибки проверки: * InvalidParameterType: Expected params.Item ['Ut']. S должен быть строкой * InvalidParameterType: Expected params.Item ['Temp'] .S должно быть строкой * InvalidParameterType: Expected params.Item ['Rh']. S быть строкой - person Federico; 06.03.2017
comment
Похоже, это проблема с данными события. Не могли бы вы проверить событие json, являются ли Rh и Temp типами данных String? JSON, который вы используете для запуска Lambda, должен иметь значение этого атрибута как String (то есть с двойными кавычками), а не число, дату или что-то еще. - person notionquest; 06.03.2017
comment
Эти значения в Json являются числовыми полями. Можно ли сохранить эти значения в виде целого числа или числа с плавающей запятой в DynamoDb? - person Federico; 06.03.2017
comment
Обновлен ответ, чтобы установить Rh и Temp как числовой тип данных (который включает целые числа и числа с плавающей запятой). - person notionquest; 06.03.2017
comment
Та же ошибка: * InvalidParameterType: Expected params.Item ['Ut']. N будет строкой * InvalidParameterType: Expected params.Item ['Temp']. N будет строкой * InvalidParameterType: Expected params.Item ['Rh' ] .N, чтобы быть строкой. Это json, который запускает лямбду: {Id: Id, Ut: 1488810488, Temp: 22.6, Rh: 57.08} - person Federico; 06.03.2017
comment
Каков хэш-ключ и ключ сортировки таблицы и определения ее типа данных? - person notionquest; 06.03.2017
comment
Хеш-ключ: Id as String. Ключ сортировки: Ut как число - person Federico; 06.03.2017
comment
Решено! Я передаю json со строкой, а затем DynamoDB преобразует значения в соответствии с его типом. Благодаря stackoverflow.com/questions/34743527/ - person Federico; 06.03.2017
comment
Этот код работал у меня после того, как я добавил этот регион для aws sdk: AWS.config.update ({region: 'ap-southeast-2'}); - person Nida; 09.09.2020

Для этого также существует более короткая версия с async / await:

'use strict';

const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

exports.handler = async (event) => {
    const tableName = "yourtablename"; 
    try {
      await dynamodb.putItem({
          "TableName": tableName,
          "Item" : {
              "Id": event.Id,
              "Ut": event.Ut,
              "Temp": event.Temp,
              "Rh":event.Rh
          }
      }).promise();
    } catch (error) {
      throw new Error(`Error in dynamoDB: ${JSON.stringify(error)}`);
    }  
};
person PersianIronwood    schedule 05.04.2020