【问题标题】:Schedule AWS lambda in a interval with immediately trigger在立即触发的时间间隔内安排 AWS lambda
【发布时间】:2022-01-09 10:21:59
【问题描述】:

要在一个区间内运行 lambda,我可以使用 EventBridge 规则:https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-create-rule-schedule.html

例如,如果我将规则设置为 7 天,则 lambda 将在 lambda 创建后 7 天执行。

如果我需要在创建此 lambda 后立即运行它并在一定间隔内运行此 lambda,该怎么办?

如何以编程方式或在 CDK 中执行此操作?

【问题讨论】:

标签: amazon-web-services aws-lambda aws-cdk aws-event-bridge


【解决方案1】:

注意:此解决方案仅适用于使用 AWS CodeBuild 部署其 Lambda 的人员。

在这个示例项目 (https://github.com/dashmug/us-covid-stats) 中,我不久前做过,我将 Lambda 配置为还有另一个基于 CodeBuild 的“构建成功”事件的触发器。

https://github.com/dashmug/us-covid-stats/blob/main/backend/serverless.yml#L71

RefreshDataFromSources:
    handler: us_covid_stats/etl/handler.refresh_data_from_sources
    events:
      - schedule:
          enabled: false
          rate: rate(1 day)
      - cloudwatchEvent:
          enabled: false
          event:
            source:
              - aws.codebuild
            detail-type:
              - CodeBuild Build State Change
            detail:
              build-status:
                - SUCCEEDED
              project-name:
                - us-covid-stats-deployment-backend

您会看到 Lambda 通常每天触发一次。而且在每日计划之上,它会在部署成功时触发。

【讨论】:

    【解决方案2】:

    由于 Cloudwatch Events 支持 Year 用于 cron 表达式这一事实,您可以使用非常具体的 schedule expression 创建一次出现的 Cloudwatch Event Rule。您需要大致知道部署完成需要多长时间。虽然这种方法不是即时的,但它可以足够接近您的目的,而无需复杂的自定义资源或部署后触发,只要几分钟的缓冲是可以的。

    例如在 Typescript 中,这可能如下所示:

    1. 获取您想要定位的未来日期并添加一些分钟(在本例中为 10 分钟):
    const date = new Date();
    const minutesToAdd = 10;
    const future = new Date(date.getTime() + minutesToAdd * 60000);
    
    1. 将那个未来日期转换为 cron expression 以准确地表示那个单一的日期,然后存储表达式,将 Day of Week 设置为 ? 以表示“没有特定值”,因为我们正在设置月份中的某一天。李>
    const minutes = future.getUTCMinutes();
    const hours = future.getUTCHours();
    const days = future.getUTCDay();
    const months = future.getUTCMonth() + 1;
    const years = future.getUTCFullYear();
    
    let futureCron = `${minutes} ${hours} ${days} ${months} ? ${years}`;
    
    1. 创建schedule expression
    const futureEvent = events.schedule.expression('cron(' + dateToCron(future) + ')');
    
    1. 使用表达式schedule an event rule
    new events.Rule(this, 'immediateTrigger', {
      schedule: futureEvent
      targets: [new targets.LambdaFunction(someHandler)]
    }
    

    这将导致计划事件仅在 UTC 时间的一个时间点发生。例如,如果您部署时是 2021 年 12 月 5 日下午 2:55,它将为 03:05 PM, on day 5 of the month, only in December, only in 2021 创建一个表达式

    我需要这种确切类型的设置,所以我 created a library for this purpose 简化了上述过程,为给定的未来日期生成一次 OnDeploy 或一次 At 的计划表达式。虽然任何人都可以免费使用它,但您应该了解它的工作原理以及它是否是满足您需求的正确选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-01
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多