我什么时候应该使用 DynamoDB 触发器而不是用另一个触发器调用 Lambda?
When should I use a DynamoDB trigger over calling the Lambda with another?
我目前有一个 AWS Lambda 函数正在更新 DynamoDB table,我需要另一个 Lambda 函数需要在数据更新后 运行。在这种情况下使用 DynamoDB 触发器而不是使用第一个 Lambda 调用第二个 Lambda 有什么好处吗?
看起来编程调用可以让我更好地控制何时调用 Lambda(即,我可以在调用之前等待几次更新发生),并且从 DynamoDB Stream 读取需要花钱,而只需调用 Lambda才不是。
那么,在这里使用触发器有什么好处吗?还是我自己调用 Lambda 会更好?
数据更新后,可以发布SQS消息,然后添加触发器配置另一个函数在Lambda控制台从Amazon SQS读取,创建SQS触发器.
创建触发器
打开 Lambda 控制台功能页面。
选择函数。
在设计器下,选择添加触发器。
选择触发器类型。
配置所需的选项,然后选择添加。
Lambda 支持 Amazon SQS 事件源的以下选项。
事件源选项
- SQS 队列 – 从中读取记录的 Amazon SQS 队列。
- Batch size – 每个批次要从队列中读取的项目数,最多 10 个。如果 Lambda 从队列中读取的批次,则事件可能包含较少的项目有更少的项目。
- Enabled – 禁用事件源以停止处理项目。
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消息自动处理
DynamoDB Stream 似乎是更好的做法,因为:
- 您委派了从您的 writer-Lambda 调用 post-processor 函数的责任。使编写器更简单(又名更快),
- 您简化了将新的外部编写器连接到相同的 Table,否则您必须实现在所有这些编写器中调用 post-processor 的逻辑,
- 您保证所有数据都是 post-processed(即使有人在 DynamoDB 的 web-interface 中添加了新项目。:)
- 从金钱的角度来看,您从编写器 Lambda 发送 invoke() 操作所花费的执行时间可能会覆盖流的成本。
- 除非您使用 DynamoDB 事务,否则您的数据可能仍无法用于 post-processor 如果您过早地从 writer 调用他。如果您的业务逻辑不需要事务,那么使用它们来解决这个问题 = extra time/cost.
P.S。当然,您可以通过简单的设置从 DynamoDB 流中进行批处理。您不必为每个写入操作调用 post-processor。
我目前有一个 AWS Lambda 函数正在更新 DynamoDB table,我需要另一个 Lambda 函数需要在数据更新后 运行。在这种情况下使用 DynamoDB 触发器而不是使用第一个 Lambda 调用第二个 Lambda 有什么好处吗?
看起来编程调用可以让我更好地控制何时调用 Lambda(即,我可以在调用之前等待几次更新发生),并且从 DynamoDB Stream 读取需要花钱,而只需调用 Lambda才不是。
那么,在这里使用触发器有什么好处吗?还是我自己调用 Lambda 会更好?
数据更新后,可以发布SQS消息,然后添加触发器配置另一个函数在Lambda控制台从Amazon SQS读取,创建SQS触发器.
创建触发器
打开 Lambda 控制台功能页面。
选择函数。
在设计器下,选择添加触发器。
选择触发器类型。
配置所需的选项,然后选择添加。
Lambda 支持 Amazon SQS 事件源的以下选项。
事件源选项
- SQS 队列 – 从中读取记录的 Amazon SQS 队列。
- Batch size – 每个批次要从队列中读取的项目数,最多 10 个。如果 Lambda 从队列中读取的批次,则事件可能包含较少的项目有更少的项目。
- Enabled – 禁用事件源以停止处理项目。
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消息自动处理
DynamoDB Stream 似乎是更好的做法,因为:
- 您委派了从您的 writer-Lambda 调用 post-processor 函数的责任。使编写器更简单(又名更快),
- 您简化了将新的外部编写器连接到相同的 Table,否则您必须实现在所有这些编写器中调用 post-processor 的逻辑,
- 您保证所有数据都是 post-processed(即使有人在 DynamoDB 的 web-interface 中添加了新项目。:)
- 从金钱的角度来看,您从编写器 Lambda 发送 invoke() 操作所花费的执行时间可能会覆盖流的成本。
- 除非您使用 DynamoDB 事务,否则您的数据可能仍无法用于 post-processor 如果您过早地从 writer 调用他。如果您的业务逻辑不需要事务,那么使用它们来解决这个问题 = extra time/cost.
P.S。当然,您可以通过简单的设置从 DynamoDB 流中进行批处理。您不必为每个写入操作调用 post-processor。