【问题标题】:Getting only the latest item from a DynamoDB table and putting it into another DynamoDB table via Lambda仅从 DynamoDB 表中获取最新项目并通过 Lambda 将其放入另一个 DynamoDB 表中
【发布时间】:2019-11-16 01:19:44
【问题描述】:

我正在尝试从一个 DynamoDB 表中复制最新更新,并使用 Lambda 将它们放入另一个表中。我在 DynamoDB 中设置了一个触发器,以在使用“蓝图”在表上发生新条目时更新 Lambda 函数。我需要帮助才能将最新项目放入新表中。

这是我的 Lambda 代码:

'use strict';

console.log('Loading function');

exports.handler = (event, context, callback) => {
    //console.log('Received event:', JSON.stringify(event, null, 2));
    event.Records.forEach((record) => {
        console.log(record.eventID);
        console.log(record.eventName);
        console.log('DynamoDB Record: %j', record.dynamodb);
    });
    callback(null, `Successfully processed ${event.Records.length} records.`);
};

这是我第一次这样做,所以任何帮助将不胜感激。

试图放入表#2的项目是:

{ "Item": { "Temp": "47.2", "Light": "29", "GWID": "BB00000002", "DateTm": "0\n18-05-05T16:44:39Z", "Status": "b", "ID": "AA00000024", "Hum": "29", "BatV": "3.01" } }

【问题讨论】:

  • 我认为最好使用 Dynamo Stream 来访问最新的更新:docs.aws.amazon.com/amazondynamodb/latest/developerguide/…
  • @Franky 感谢您的评论,但正如我所说,我对此很陌生;我已经在我正在收听的表上启用了流,并且设置了 Lambda 函数。但是您建议直接从流中获取项目?我正在尝试使用 Javascript 显示这些值。如果您能稍微解释一下您的评论,那就太好了。
  • 您的目标是让表#2 中的一项反映表#1 中的最新项目吗?还是将整个表#1复制到表#2?
  • @jarmod 我想在表#2 中有一项反映表#1 中的最新项目。不是整个表#1。

标签: amazon-web-services aws-lambda amazon-dynamodb


【解决方案1】:

不确定我是否理解您的意思,但是您是否检查过 dynamoDB SDK 来执行插入操作? https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html#putItem-property

【讨论】:

  • 是的,我确实阅读了本指南,但我不明白如何将它包含在我上面给出的 Lambda 函数中。我希望 Lambda 函数从 table#1 中读取最新的项目,并在 table#1 中对任何项目进行更新时将其放入 table#2。所以这些是具有 ID 的不同节点,我希望 table#2 中的每个节点 ID 有一行,其中包含 table#1 中的最新更新值。
  • 我不清楚您的应用程序的当前状态是什么或有什么问题,您是否通过 dynamoDB 流将事件接收到 lambda 中?更新 dynamoDB 时 lambda 是否会记录某些内容?
  • Lambda 函数按预期工作,但它仅在发生更新时检索值。它没有向 table#2 写入任何内容,因为我不知道在我的 Qs 帖子中给出的代码之后要添加什么代码。
  • 您能否使用event 对象更新您的问题以查看您需要处理哪些数据?
  • 请立即查看。我已经编辑了 Qs。感谢您的帮助。
【解决方案2】:

如果我做对了,即“我想在表#2 中有一个项目反映表#1 中的最新项目。而不是整个表#1”,有多种方法可以完成您正在寻找:

  1. BatchSize 设置为 1。您的 lambda 函数将在 dynamodb 表 #1 中的每一次更改时调用,您可以在表 #2 上使用 PutItem 操作;
  2. 增加BatchSize 并仅处理批处理中的最新事件。比如:

 var uniqueEvents = _.chain(event.Records)
    .reverse()
    .uniqBy(function (record) {
      return record.dynamodb.Keys.id.S;
    })
    .value();

选项 #2 是否适合您,它比 #1 更可取(不那么健谈且更便宜)

【讨论】:

    猜你喜欢
    • 2017-07-21
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多