我什么时候应该使用DynamoDB触发器而不是通过另一个调用Lambda?

时间:2019-07-23 01:09:24

标签: aws-lambda amazon-dynamodb amazon-dynamodb-streams

我目前有一个AWS Lambda函数正在更新DynamoDB表,并且我需要另一个Lambda函数,该函数需要在数据更新后运行。在这种情况下,使用DynamoDB触发器而不是使用第一个Lambda调用第二个Lambda有什么好处?

看起来,编程调用可以让我更好地控制Lambda的调用时间(即,在调用之前我可以等待多个更新发生),并且从DynamoDB Stream进行读取会花费金钱,而仅调用Lambda不会。

那么,在这里使用触发器有好处吗?还是我最好自己调用Lambda?

3 个答案:

答案 0 :(得分:2)

数据更新后,您可以发布SQS消息,然后添加触发器以配置另一个功能以在Lambda控制台中从Amazon SQS读取,创建一个SQS触发器。

创建触发器

  1. 打开Lambda控制台的“功能”页面。

  2. 选择一个功能。

  3. 在Designer下,选择“添加触发器”。

  4. 选择触发器类型。

  5. 配置必需的选项,然后选择“添加”。

Lambda支持以下Amazon SQS事件源选项。

事件源选项

  • SQS队列 –用于读取记录的Amazon SQS队列。
  • 批处理大小 –每个批处理中从队列中读取的项目数,最多10个。如果Lambda从队列中读取的批处理中的项目较少,则该事件可能包含更少的项目。< / li>
  • 已启用 –禁用事件源以停止处理项目。

答案 1 :(得分:2)

DynamoDB Stream似乎是更好的做法,因为:

  • 您委派了从writer-Lambda调用后处理器功能的责任。使作者更简单(又名更快)
  • 您简化了将新的外部编写器连接到同一表的操作,否则,您还必须实现逻辑以在所有它们中调用后处理器,
  • 您保证对所有数据进行后期处理(即使有人在DynamoDB的Web界面中添加了新项目。:)
  • 从金钱上来讲,您将花费从编写器Lambda发送invoke()操作的执行时间可能会覆盖流的成本。
  • 除非您使用DynamoDB事务处理,否则如果您过早从编写者处打电话给他,则数据可能仍无法用于后处理器。如果您的业务逻辑不需要交易,则仅使用交易即可解决此问题=额外的时间/成本。

P.S。您当然可以通过简单的设置从DynamoDB流中直接进行批处理。您没有义务为每个写操作调用后处理器。

答案 2 :(得分:0)

var QUEUE_URL = 'https://sqs.us-east-1.amazonaws.com/{AWS_ACCUOUNT_}/matsuoy-lambda';
var AWS = require('aws-sdk');
var sqs = new AWS.SQS({region : 'us-east-1'});

exports.handler = function(event, context) {
  var params = {
    MessageBody: JSON.stringify(event),
    QueueUrl: QUEUE_URL
  };
  sqs.sendMessage(params, function(err,data){
    if(err) {
      console.log('error:',"Fail Send Message" + err);
      context.done('error', "ERROR Put SQS");  // ERROR with message
    }else{
      console.log('data:',data.MessageId);
      context.done(null,'');  // SUCCESS 
    }
  });
}

请不要忘记将另一个函数的触发器添加到此SQS主题。该功能将接收自动处理的SQS消息。