代码之家  ›  专栏  ›  技术社区  ›  Ethan Harlig

在将来的单个指定时间,仅调用AWS Lambda函数一次

  •  29
  • Ethan Harlig  · 技术社区  · 7 年前

    我希望能够设置一个调用AWS Lambda函数的时间,然后让该函数在当时和仅在那时被调用。例如,我希望我的Lambda函数在2017年12月19日晚上9:00运行。我不希望它重复,我不希望它现在调用,就在19日晚上9点。

    我知道CloudWatch提供了计划的事件,我在想,当输入此提醒的计划时间时,将创建一个CloudWatch计划的事件,以便从现在起在该时间段内启动(就像如果您将其计划在晚上8:22运行到晚上9点,则需要38分钟),然后在晚上9点调用Lambda函数,然后删除CloudWatch计划的事件。我的问题是,当创建CloudWatch计划事件时,它会立即执行,然后以指定的间隔执行。

    任何其他想法都将不胜感激,因为我想不出其他解决方案。提前感谢!

    5 回复  |  直到 7 年前
        1
  •  26
  •   Kush Vyas    7 年前

    可以使用以下语法计划lambda事件:

    cron(Minutes Hours Day-of-month Month Day-of-week Year)

    笔记 :所有字段均为必填字段,时区仅为UTC

    请参考此 AWS Documentation 有关详细信息。

    谢谢

        2
  •  20
  •   Muhammad Soliman    5 年前

    您可以使用DynamoDB TTL 要轻松实现此功能,只需执行以下操作:

    1-将项目放入 TTL公司 ,执行或调用lambda函数的确切时间。

    2-配置 DynamoDB Streams 在项目上触发lambda函数 remove 事件

    一旦项目/记录即将过期,将调用lambda。您不必删除或清理任何内容,因为dynamodb中的项目已经不存在了。

    注: 然而,这种方法很容易实现,并且可扩展性很好,但有一点需要注意;使用 DynamoDB TTL 由于可能存在延迟,因此调度机制无法保证精确的时间精度。计划的任务将在几分钟后执行。

        3
  •  9
  •   david_adler    4 年前

    您可以安排一个步骤函数,该函数可以 等待 直到使用任意负载调用lambda之前的特定时间点。

    https://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language-wait-state.html

    像这样的

    const stepFunctions = new AWS.StepFunctions()
    const payload = {
        stateMachineArn: process.env.SCHEDULED_LAMBDA_SF_ARN,
        name: `${base64.encode(email)}-${base64.encode(timestamp)}`, // Dedupe key
        input: JSON.stringify({
          timestamp,
          lambdaName: 'myLambdaName',
          lambdaPayload: {
            email,
            initiatedBy
          },
        }),
      }
    await stepFunctions.startExecution(payload).promise()
    
        4
  •  3
  •   Haziq    4 年前

    我知道现在回答这个问题已经很晚了。但任何只想使用CRON表达式触发事件(或调用API)一次的人都可以使用以下示例:

    此事件将仅在2025年1月1日-格林威治时间12:00:00触发一次

    00 12 01 01 ? 2025
    

    对于那些不太了解cron语法的人:

    Minutes Hours DayOfMonth Month DayOfWeek Year
    

    我用这个 AWS Cloudwatch Events 结果如下: enter image description here

    注意:我不必指定星期几,因为我给了它一个固定的日期,这很明显。

        5
  •  -1
  •   Gaurav Singh    6 年前

    通过事件调用lambda函数是异步调用选项。通过使用CloudWatchEvent触发Lambda函数,我们可以使用cron作业,但由于Lambda函数在同一cron调度中多次触发,我们仍然面临问题。PFB链接: https://cloudonaut.io/your-lambda-function-might-execute-twice-deal-with-it/

    但这需要在您的帐户中实现Dynamo DB,然后使Lambda函数幂等。