Amazon Lambda пишет в DynamoDB

Я новичок в DynamoDB и пытаюсь записать некоторые данные в таблицу с помощью Lambda. Пока у меня это:

'AddFood': function () {

    var FoodName = this.event.request.intent.slots.FoodName.value;
    var FoodCalories = this.event.request.intent.slots.FoodCalories.value;
    console.log('FoodName : ' + FoodName);

    const params = {
        TableName: 'Foods',
        Item: {
            'id': {"S": 3},
            'calories': {"S": FoodCalories},
            'food': {"S": FoodName}
            }
    };

    writeDynamoItem(params, myResult=>{
        var say = '';

        say = myResult;

        say = FoodName + ' with ' + FoodCalories + ' calories has been added ';
        this.response.speak(say).listen('try again');
        this.emit(':responseReady');

    });

    function writeDynamoItem(params, callback) {

        var AWS = require('aws-sdk');
        AWS.config.update({region: AWSregion});

        var docClient = new AWS.DynamoDB();

        console.log('writing item to DynamoDB table');

        docClient.putItem(params, function (err, data) {
            if (err) {
                callback(err, null)
            } else {
               callback(null, data)
            }
        });
    }
}

Кто-нибудь знает, почему данные не отображаются в базе данных? Я проверил IAM и установил политику AmazonDynamoDBFullAccess.


person 8azan    schedule 18.03.2018    source источник
comment
Как правило, вы должны использовать get() или query() вместо scan(), потому что сканирование будет считывать каждый элемент. Вот пример JS вызова putItem: docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/   -  person jarmod    schedule 19.03.2018
comment
Спасибо за совет. У вас есть идеи, почему приведенный выше код не помещает элементы в базу данных?   -  person 8azan    schedule 21.03.2018
comment
Вызов putItem() не работает? Как вы проверяете, что пункт не был написан? Есть ли шанс, что у вас есть таблица с одинаковым именем в нескольких регионах и вы записываете не в тот? PS ваш docClient неправильно назван. SDK имеет два интерфейса (сервисный интерфейс и клиент документов) — вы используете первый, но ваша переменная называется так, как если бы вы использовали последний.   -  person jarmod    schedule 21.03.2018
comment
Я тестирую его на сайте разработчиков Amazon, запустив навык. У меня есть только одна таблица, и я проверяю ее, заходя в DynamoDB и просматривая элементы в таблице. Кажется, что вызов выполняется, но в таблице ничего нового не появляется. Есть идеи, что не так?   -  person 8azan    schedule 21.03.2018
comment
Мне удалось исправить это сейчас. Спасибо за помощь!   -  person 8azan    schedule 21.03.2018
comment
Не поделитесь, в чем была проблема?   -  person jarmod    schedule 21.03.2018


Ответы (2)


После внесения нескольких изменений в функцию записи следующий код позволил мне записывать элементы в базу данных:

функция writeDynamoItem (параметры, обратный вызов) {

const AWS = require('aws-sdk');
AWS.config.update({region: AWSregion});

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

console.log('writing item to DynamoDB table');

docClient.put(params, function (err, data) {
    if (err) {
        callback(err, null)
         console.error("Unable to write item. Error JSON:", JSON.stringify(err, null, 2))
    } else {
       callback(null, data)
    }
});

}

person 8azan    schedule 21.03.2018

Чтобы записать в DynamoDB из функции Lambda (с использованием Python), вы должны использовать пакет boto3 и загрузить ресурс Dynamodb:

Надеюсь, это поможет, он записывает еду и калории из события и записывает их с помощью сгенерированного uuid.

import boto3
import os
import uuid

def writeToDynamo(event, context):

    recordId = str(uuid.uuid4())
    voice = event["food"]
    text = event["calories"]

    print('Generating new DynamoDB record, with ID: ' + recordId)
    print('Input food: ' + food)
    print('Input calories: ' + calories)

    #Creating new record in DynamoDB table
    dynamodb = boto3.resource('dynamodb')
    table = dynamodb.Table(os.environ['DB_TABLE_NAME'])
    table.put_item(
        Item={
            'id' : recordId,
            'food' : food,
            'calories' : calories
        }
    )

    return recordId
person SCouto    schedule 18.03.2018
comment
Я знаю, я могу помочь в питоне. Опу нужна была функция для записи в DynaModb. Он ничего не сказал о языках. Вы можете комбинировать функции на разных языках - person SCouto; 19.03.2018