在具有立即触发器的间隔中调度AWS lambda



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

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

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

我如何通过程序或CDK实现这一点?

注意:此解决方案仅适用于那些使用AWS CodeBuild部署Lambdas的用户。

在此示例项目中(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通常每天触发一次。但是,除了日常日程安排之外,它还会在部署成功时触发。

由于CloudwatchEvents支持cron表达式的Year,因此您可以使用非常特定的计划表达式创建一个单次发生的CloudwatchEvent规则。您需要大致了解到部署完成需要多长时间。虽然这种方法不会是即时的,但只要几分钟的缓冲区可以,它就足够接近,可以在没有复杂的自定义资源或部署后触发的情况下达到您的目的。

例如,在Typescript中,这可能看起来如下:

  1. 获取您想要的未来日期,并添加一些分钟(在这种情况下为10分钟(:
const date = new Date();
const minutesToAdd = 10;
const future = new Date(date.getTime() + minutesToAdd * 60000);
  1. 将该未来日期转换为该单个日期的cron表达式,然后将该表达式的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. 创建时间表表达式
const futureEvent = events.schedule.expression('cron(' + dateToCron(future) + ')');
  1. 使用表达式安排事件规则
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创建一个表达式

我需要这种确切类型的设置,所以我为此创建了一个库,简化了上面的过程,以便在给定的未来日期为一次OnDeploy或一次At生成时间表表达式。虽然任何人都可以自由使用,但你应该了解它为什么有效,以及它是否是满足你需求的正确选择。

最新更新