如何用AWS EventBridge Scheduler设置每月第14个工作日执行Lambda任务?
实现Lambda每月第14个工作日执行的方案
标准的Cron表达式(包括AWS CloudWatch使用的)没办法直接实现“每月第14个工作日”的触发逻辑,因为Cron只能基于固定的日期、星期值,没法动态计算当月的工作日天数。下面给你两种可行的实现方案:
方案一:辅助Lambda做日期判断+CloudWatch每日触发
- 创建CloudWatch Events规则,用Cron表达式每天固定时段触发(以上午10点为例,对应表达式:
0 2 ? * * *——注意AWS Cron默认时区是UTC,若需用业务时区比如Asia/Shanghai,UTC+8的10点对应UTC的2点,要按需调整) - 该规则触发一个辅助Lambda函数,核心逻辑:
- 计算当前月份的第14个工作日(仅排除周六周日的话,遍历当月所有日期,统计周一到周五的天数,直到数到第14个)
- 如果当前日期正好等于这个第14个工作日,就调用你的文件检查Lambda
辅助Lambda的Python示例代码
import datetime import boto3 lambda_client = boto3.client('lambda') TARGET_LAMBDA_NAME = '你的文件检查Lambda名称' def is_14th_weekday(): today = datetime.date.today() month = today.month year = today.year count = 0 day = 1 while True: try: current_date = datetime.date(year, month, day) except ValueError: # 超出当月天数,理论上每月工作日远多于14天,此情况可忽略 return False if current_date.weekday() < 5: # 0-4对应周一到周五 count +=1 if count ==14: return current_date == today day +=1 def lambda_handler(event, context): trigger_flag = is_14th_weekday() if trigger_flag: lambda_client.invoke( FunctionName=TARGET_LAMBDA_NAME, InvocationType='Event' # 异步触发,按需可改为RequestResponse同步 ) return {"status": "checked", "triggered": trigger_flag}
方案二:AWS Step Functions编排工作流
如果想更清晰地管理流程分支,可以用Step Functions:
- 创建状态机,包含两个核心节点:
- 调用辅助Lambda判断当前是否为当月第14个工作日
- 通过Choice状态做分支:如果是则执行文件检查Lambda,否则直接结束流程
- 同样用CloudWatch Events每天触发这个状态机,逻辑和方案一一致
额外注意事项
- 时区校准:在CloudWatch Events规则里务必设置正确的业务时区,避免触发时间偏差
- 节假日扩展:如果需要排除法定节假日,可在辅助Lambda中加入节假日列表,统计工作日时跳过这些日期
- 容错机制:给辅助Lambda配置重试策略,避免因临时网络或服务故障导致漏触发
内容的提问来源于stack exchange,提问作者Junn Sorran
相关产品推荐
相关产品推荐

