在立即触发的时间间隔内安排 AWS lambda

Schedule AWS lambda in a interval with immediately trigger

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

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

如果我需要在创建后立即 运行 这个 lambda 并且在某个时间间隔 运行 这个 lambda 怎么办?

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

由于 Cloudwatch Events 支持 cron 表达式的 Year,您可以创建 Cloudwatch Event Rule that occurs a single time using a very specific schedule expression。您需要大致知道部署完成需要多长时间。虽然这种方法不是即时的,但它可以足够接近地满足您的目的,而无需复杂的自定义资源或 post 部署触发,只要几分钟的缓冲就可以了。

例如,在 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:55PM,它将为 03:05 PM, on day 5 of the month, only in December, only in 2021

创建一个表达式

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

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

在这个示例项目 (https://github.com/dashmug/us-covid-stats) 中我做了一段时间,我将 Lambda 配置为也有另一个基于 CodeBuild 的“Build Succeeded”事件的触发器。

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 通常每天触发一次。而且在每日计划之上,它会在部署成功时触发。