我想安排一个 CloudWatch 事件每隔一周星期一运行一次,并已使用以下命令开始:
0 14 ? * 2 *
目前使用上述命令,我可以获得周一执行的每周时间表:
Mon, 27 Jul 2020 14:00:00 GMT
Mon, 03 Aug 2020 14:00:00 GMT
Mon, 10 Aug 2020 14:00:00 GMT
Mon, 17 Aug 2020 14:00:00 GMT
Mon, 24 Aug 2020 14:00:00 GMT
Mon, 31 Aug 2020 14:00:00 GMT
Mon, 07 Sep 2020 14:00:00 GMT
Mon, 14 Sep 2020 14:00:00 GMT
Mon, 21 Sep 2020 14:00:00 GMT
Mon, 28 Sep 2020 14:00:00 GMT
但是,我希望将时间表设置为每隔一周的星期一,例如
Mon, 27 Jul 2020 14:00:00 GMT
Mon, 10 Aug 2020 14:00:00 GMT
Mon, 24 Aug 2020 14:00:00 GMT
Mon, 07 Sep 2020 14:00:00 GMT
Mon, 21 Sep 2020 14:00:00 GMT
我见过使用
exp
和 #
的示例,但我认为 AWS CloudWatch 事件不接受此类参数。
克里斯的回答是正确的。目前,我无法想到将其表达为 CloudWatch 计划事件的一部分。
但是,解决方法可能是将其设置为每周一 (
0 14 ? * 2 *
) 并触发 Lambda 函数,在触发实际目标之前检查它是在工作日还是在休息周。
尽管这增加了一些复杂性,但这将是一个可行的解决方案。
您将无法执行任何更高级的命令(尤其是那些从命令行使用变量的命令)。
您可以非常基本地执行此操作,但需要 2 个单独的事件才能执行它:
0 14 ? * 2#1 *
- 在每月的第一个星期一运行。0 14 ? * 2#3 *
- 每月第三个星期一运行。不幸的是,计划表达式没有兼容的语法来允许每隔一周的概念,因此上述命令有时可能会导致 3 周的间隙。
如果你不关心星期一,你当然可以使用
0 14 1,15 * *
在每个月的1号和15号运行(大约每两周一次)。
最后的选择是每周一运行,但如果不是每隔一周运行一次,则让脚本退出,则表达式将是
0 14 ? * 2 *
。
有关语法的更多信息,请参阅“计划事件”页面的 Cron 表达式 部分。
在要点中添加@Chris 的答案,
可以添加额外的规则以适应有 5 个星期一的月份
您可以使用费率调度程序并设置开始日期来完成此操作。
在 AWS SAM 中,它看起来像这样:
Events:
CWSchedule:
Type: ScheduleV2
Properties:
ScheduleExpression: "rate(14 days)"
FlexibleTimeWindow:
Mode: FLEXIBLE
MaximumWindowInMinutes: 5
StartDate: "2024-04-01T12:00:00.000Z"
ScheduleExpressionTimezone: UTC