
无服务器 - 定时 Lambda 函数
通常,您需要您的函数以固定的时间间隔被调用。这可以是每天一次,每周两次,工作日每分钟一次,等等。无服务器提供了两种类型的事件来以固定的频率调用函数。它们是 cron 事件和 rate 事件。
Cron 事件
cron 事件比 rate 事件具有更大的灵活性。唯一的缺点是它不如 rate 事件容易理解。cron 表达式的语法在AWS 文档中定义 -
cron(minutes hours day-of-month month day-of-week year)
可以看到,cron 表达式由 6 个字段组成。每个字段都可以接受某些值,以及一些 AWS 所称的通配符。
让我们先看看可接受的值 -
分钟 - 0-59
小时 - 0-23
月份中的某一天 - 1-31
月份 - 1-12 或 JAN-DEC
星期中的某一天 - 1-7 或 SUN-SAT
年份 - 1970-2199
现在可接受的值已经清楚了,让我们来看看通配符。cron 表达式中总共有 8 个可能的通配符(一些允许用于所有 6 个字段,一些只允许用于特定字段)。将它们列在这里 -
*(星号,允许用于所有 6 个字段) - 这是最常用的通配符。它简单地说,该字段的所有值都包含在内。小时字段中的 * 意味着 cron 将每小时运行一次。月份中的某一天字段中的 * 意味着 cron 将每天运行。
,(逗号,允许用于所有 6 个字段) - 用于指定多个值。例如,如果您希望您的 cron 在每小时的第 5、7 和 9 分钟运行,则您的分钟字段将类似于 5,7,9。同样,在星期几字段中使用 MON,TUE,WED,THU,FRI 可以表示 cron 仅在工作日运行。
-(破折号,允许用于所有 6 个字段) - 此通配符指定范围。在上一个通配符示例中,为了指定工作日,我们可以简单地写 MON-FRI,而不是指定 5 个用逗号分隔的值。
?(问号,仅允许用于月份中的某一天和星期中的某一天) - 这就像一个“不关心”通配符。如果您在星期几字段中指定了 MON,则您不关心星期一落在哪一天。因此,您将在月份中的某一天的位置输入?。同样,如果您希望 cron 在每月的第 5 天运行,您将在月份中的某一天字段中输入 5,并在星期几字段中输入?,因为您不关心每月的第 5 天是星期几。请注意,AWS 文档明确指出,您不能同时对星期几和月份中的某一天字段使用 *。如果您对一个使用 *,则必须对另一个使用?
/(正斜杠,允许用于除月份中的某一天之外的 5 个字段) - 此字段指定增量。如果您在小时字段中输入 0/2,则此 cron 将每隔偶数小时运行一次(0、0+2、0+2+2 等)。如果您在小时字段中指定 1/2,则此 cron 将每隔奇数小时运行一次(1、1+2、1+2+2 等)。正如您所猜到的那样,/ 前面的值是起始值,/ 后面的值定义增量。
L(仅允许用于月份中的某一天和星期中的某一天) - 指定该月的最后一天或该周的最后一天
W(仅允许用于月份中的某一天) - 这指定最接近该特定月份的那一天的工作日(星期一到星期五)。因此,如果您在月份中的某一天字段中指定 8W,并且它对应于一个工作日,例如星期二,则 cron 将在第 8 天触发。但是,如果 8 对应于一个周末,例如星期六,则 cron 将在第 7 天(星期五)触发。如果 8 对应于星期日,则 cron 将在第 9 天(星期一)触发。这是最少使用的通配符之一。
#(仅允许用于星期中的某一天) - 这是一个非常特殊的通配符,最好通过示例来理解。假设您希望 cron 在母亲节运行。现在,母亲节每年都在五月的第二个星期日。因此,您的月份字段将包含 MAY 或 5。但是您如何指定第二个星期日呢?请使用井号。表达式为 0#2。通配符前面的值是星期几(星期日为 0,星期一为 1,依此类推)。通配符后面的值指定出现次数。因此,这里的 2 指的是星期日的第二次出现或第二个星期日。
现在,要为您的 lambda 函数定义 cron 触发器,您只需要在 serverless.yml 中函数的 events 密钥中指定 cron 表达式即可。
functions: cron_triggered_lambda: handler: handler.hello events: - schedule: cron(10 03 * * ? *) #run at 03:10 (UTC) every day.
一些例子
下面是一些 cron 表达式的示例 -
cron(30 15 ? * MON-FRI *) - 在每个工作日的 15:30(UTC)触发
cron(0 9 ? 6 0#3 *) - 在 6 月的第三个星期日(父亲节)的 09:00(UTC)触发
cron(0/15 * ? * MON *) - 在星期一每 15 分钟触发一次
cron(0/30 9-18 ? * MON-FRI *) - 在工作日(对应于许多地方的办公时间)的上午 9 点到下午 5:30 每 30 分钟触发一次
Rate 事件
与 cron 表达式相比,这更直接。语法很简单,就是 rate(value unit)。例如,rate(5 minutes)。
值可以是任何正整数,允许的单位是分钟、小时、天。
为您的 lambda 函数定义 rate 触发器类似于定义 cron 触发器。
functions: rate_triggered_lambda: handler: handler.hello events: - schedule: rate(10 minutes) #run every 10 minutes
一些例子
rate(2 hours) - 每 2 小时触发一次
rate(1 day) - 每天触发一次(在 00:00 UTC)
rate(90 minutes) - 每 90 分钟触发一次
正如您所意识到的那样,rate 表达式的简单性是以降低灵活性为代价的。您可以将 rate 用于每 N 分钟/小时/天运行的 lambda。要执行更复杂的操作,例如仅在工作日触发您的 lambda,您必须使用 cron 表达式。
请注意,如果您的 cron 表达式导致触发时间小于一分钟,则不支持。
Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.