仅在指定的未来时间调用AWS Lambda函数一次

Eth*_*lig 12 amazon-web-services amazon-cloudwatch aws-lambda

我希望能够设置一个时间来调用AWS Lambda函数,然后再调用该函数.例如,我希望我的Lambda函数在2017年12月19日晚上9点运行.我不想重复它,我不希望它现在调用,只是在19日晚上9点.

我知道CloudWatch提供了计划事件,而我当时认为当输入安排此提醒的时间时,会创建一个CloudWatch计划事件,以便在此后的一段时间内启动(因此,如果您在晚上8:22安排它)在晚上9点运行,它将是38分钟),然后它在晚上9点调用Lambda函数,然后删除CloudWatch预定事件.我的问题是,当创建CloudWatch Scheduled Event时,它会立即执行,然后以指定的时间间隔执行.

任何其他想法将不胜感激,因为我想不出另一种解决方案.提前致谢!

Muh*_*man 18

您可以使用 DynamoDBTTL功能轻松实现这一点,只需执行以下操作:

1- 将 item 与TTL,您要执行或调用 lambda 函数的确切时间。

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

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

注意:然而,该方法易于实施且可扩展性非常好,但有一个预防措施需要提及;使用DynamoDB TTL的调度机制不能保证确切的时间精度可能有延迟。计划任务在几分钟后执行。

  • 只要您同意,实际上最多需要 48 小时。根据文档:“DynamoDB 通常会在过期后 48 小时内删除过期项目。项目在过期后真正被删除的确切持续时间取决于工作负载的性质和表的大小。已过期且已过期的项目未删除的项目仍然出现在读取、查询和扫描中。这些项目仍然可以更新,并且可以成功更新以更改或删除过期属性。” (7认同)

Kus*_*yas 13

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

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

注意:所有字段都是必填字段,时区仅限UTC

有关详细信息,请参阅此AWS文档.

谢谢

  • @EthanHarlig你误解了文档.可以为重复和一次事件设置cron.您必须为任务指定年,月,日,小时和分钟. (7认同)
  • 也许我误解了文档,但似乎所有针对 cron 表达式给出的示例都是重复事件。根据他们的示例,我似乎不想使用它在给定时间调用一次 Lambda 函数。 (3认同)
  • @RredCat 我明白了!因此,如果我想在 12 月 20 日 (UTC) 中午 12:00 调用 Lambda,我会使用 `cron(0 12 20 12 * 2017)` 并指定它是 2017 年 12 月 20 日的 12:00,那是星期几并不重要? (2认同)
  • 文档不清楚,如果一个计划永远不能再次触发,它会自动清理吗? (2认同)

dav*_*ler 7

您可以安排一个步进函数,该函数可以等到特定时间点,然后再使用任意负载调用 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()
Run Code Online (Sandbox Code Playgroud)