【问题标题】:Amazon Lambda writing to DynamoDBAmazon Lambda 写入 DynamoDB
【发布时间】:2018-08-27 04:50:09
【问题描述】:

我是 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。

【问题讨论】:

  • 一般来说,您应该使用 get() 或 query() 而不是 scan(),因为扫描会读取每个项目。下面是调用 putItem 的 JS 示例:docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/…
  • 感谢您的提示。您知道为什么上面的代码没有将项目放入数据库吗?
  • putItem() 调用是否失败?您如何检查该项目是否未写入?您是否有可能在多个区域中拥有同名表并且正在写入错误的表? PS您的 docClient 名称错误。 SDK 有两个接口(服务接口和文档客户端) - 您使用的是前者,但您的变量被命名为就好像您使用的是后者一样。
  • 我正在亚马逊开发者网站上通过运行该技能对其进行测试。我只有一张表,我通过进入 dynamoDB 并查看表中的项目来检查它。该调用似乎正在执行,但表中没有显示任何新内容。知道有什么问题吗?
  • 愿意分享问题所在吗?

标签: amazon-web-services aws-lambda amazon-dynamodb alexa alexa-skills-kit


【解决方案1】:

在对 write 函数进行一些更改后,以下代码允许我将项目写入数据库:

function writeDynamoItem(params, callback) {

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)
    }
});

}

【讨论】:

    【解决方案2】:

    要从 Lambda 函数(使用 Python)写入 DynamoDB,您必须使用 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
    

    【讨论】:

    • 我知道,我可以在 python 方面提供帮助。 Op 想要一个写入 dynamodb 的函数。他没有说任何关于语言的事情。您可以组合不同语言的功能
    猜你喜欢
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多