在立即触发的时间间隔内安排 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 中,这可能如下所示:
- 获取您想要定位的未来日期并添加一些分钟(在本例中为 10 分钟):
const date = new Date();
const minutesToAdd = 10;
const future = new Date(date.getTime() + minutesToAdd * 60000);
- 将那个未来日期转换为 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}`;
const futureEvent = events.schedule.expression('cron(' + dateToCron(future) + ')');
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 通常每天触发一次。而且在每日计划之上,它会在部署成功时触发。
到运行 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 中,这可能如下所示:
- 获取您想要定位的未来日期并添加一些分钟(在本例中为 10 分钟):
const date = new Date();
const minutesToAdd = 10;
const future = new Date(date.getTime() + minutesToAdd * 60000);
- 将那个未来日期转换为 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}`;
const futureEvent = events.schedule.expression('cron(' + dateToCron(future) + ')');
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 通常每天触发一次。而且在每日计划之上,它会在部署成功时触发。