無伺服器 - 定時 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 表示式導致觸發時間小於一分鐘,則不支援。