如何通过EventBridge触发Lambda:每月最后一个周日的下周四执行
实现每月最后一个周日下周四触发Lambda的最优方案
核心思路
EventBridge标准cron表达式无法直接实现“每月最后一个周日的下周四”这种依赖相对日期的逻辑,最优方案是缩小cron触发范围+Lambda内部日期校验,既减少不必要的Lambda调用,又能精准满足需求。
步骤1:调整EventBridge规则的cron表达式
先把触发范围缩小到所有可能符合条件的周四:
- 当月最后一个周日最早可能在23日(如2025年2月),下周四为27日;
- 若最后一个周日是31日(仅大月可能,如2026年10月),下周四为次月4日。
调整后的cron表达式更精准,覆盖所有目标日期区间:
schedule_expression = "cron(0 0 27-31,1-4 * 4 *)"
步骤2:在Lambda中添加日期校验逻辑
在Lambda函数开头加入日期判断(以Python为例),仅当当天符合条件时才执行业务代码:
import datetime def is_target_date(): today = datetime.date.today() # 先确认今天是周四 if today.weekday() != 3: return False # 计算当月最后一个周日 first_day = today.replace(day=1) # 获取当月总天数 days_in_month = (first_day.replace(month=first_day.month % 12 + 1, day=1) - datetime.timedelta(days=1)).day last_day = today.replace(day=days_in_month) # 从当月最后一天倒推到最近的周日 last_sunday = last_day - datetime.timedelta(days=(last_day.weekday() + 1) % 7) # 目标日期为最后一个周日加4天(周日+4天=周四) target_date = last_sunday + datetime.timedelta(days=4) return today == target_date def lambda_handler(event, context): if not is_target_date(): print("今日不符合触发条件,直接退出") return { 'statusCode': 200, 'body': 'Skipped: Not target date' } # 此处编写你的业务逻辑 print("执行Lambda核心业务") return { 'statusCode': 200, 'body': 'Executed successfully' }
步骤3:Terraform脚本更新
仅需更新aws_cloudwatch_event_rule的cron表达式,其余代码保持不变:
resource "aws_cloudwatch_event_rule" "python_lambda_event_rule" { name = "poc-rule" description = "Event rule for triggering the Python Lambda function on the Thursday after the last Sunday of each month" schedule_expression = "cron(0 0 27-31,1-4 * 4 *)" tags = { name = "Event to trigger hello lambda" created_by = "Terraform" group = "POC" } }
替代方案:EventBridge目标过滤(无需修改Lambda)
若不想改动Lambda代码,可利用EventBridge的目标过滤条件,通过内置日期变量计算判断,但该方式语法复杂、对时区依赖高,灵活性不如Lambda内部校验,因此优先推荐第一种方案。
内容的提问来源于stack exchange,提问作者kanhaiyakumar
相关产品推荐
相关产品推荐

