【问题标题】:Invoke AWS-Lambda function only the first time that it's triggered in that day仅在当天第一次触发 AWS-Lambda 函数时调用它
【发布时间】:2021-03-01 02:15:33
【问题描述】:

我有一个 AWS lambda 函数,每次有人在指定的 S3 存储桶中上传文件时都会触发该函数,然后它会发送一封电子邮件通知人们存储桶中有新文件,但是,这种情况最多只能发生一个每天的时间,以避免在同时上传大量文件时产生电子邮件。有没有办法限制 lambda 函数中的请求以忽略当天第一个文件上传后的所有新文件上传?

【问题讨论】:

    标签: node.js amazon-web-services datetime amazon-s3 aws-lambda


    【解决方案1】:

    如果您只想每天触发一次电子邮件,以响应当天第一个上传的对象,然后记录您发送当天电子邮件的事实,以便稍后进行测试。

    对 DynamoDB 执行此操作很简单。该项目的分区键将是日期。如果您有多个存储桶需要执行此操作,则键可以是存储桶名称和日期的组合。

    这可能比 S3 等其他解决方案更好,因为 you can guarantee 只有一个 Lambda 调用将该项目写入 DynamoDB(因此只发送一封电子邮件)。

    综上所述,您的用户在上传第一个文件时收到一封电子邮件,然后不知道稍后发生的后续上传是否可以接受?

    【讨论】:

    • 文件每月上传一次,用户只需要知道更新发生在哪一天就可以查看系统中的文件,基本上就是邮件通知。
    【解决方案2】:

    当然,lambda 函数的本质是它们不存储自己的状态。

    所以你需要弄清楚如何保存状态“直到2021-03-01 12:22”或任何相关的时间戳。

    您可以将名称类似于 .email-next-send-time 的小文件与上传的文件一起写入您的 S3 存储桶。在那个文件中你可以写一行,值

    Date.now() + 24 * 60 * 60 * 1000  /* one day in milliseconds */
    

    然后,在您从 lambda 任务发送电子邮件之前,从您的 S3 存储桶中读取该文件。如果它不存在或它的内容在Date.now() 之前,请发送电子邮件。

    发送电子邮件时,首先在文件中写入一个新值。 (如果文件同时上传,首先这样做可以防止几乎所有的竞争条件。)

    你也可以使用一个很小的 ​​redis.io 实例(AWS 称之为 Elasticache),但这需要花钱。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-19
      • 2019-11-16
      • 2020-02-22
      • 1970-01-01
      • 2020-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多