基于字典配置EC2定时开关机的Lambda函数运行失效求助
Lambda定时EC2调度函数故障排查
核心致命错误:字典取值写法错误
- 代码中所有访问调度字典的位置,都错误地将变量名
current_dayoftheweek作为字符串硬编码进了字典取值的中括号,实际写法为app_off["current_dayoftheweek"]。 - 这种写法相当于去字典中查找key为**字符串"current_dayoftheweek"**的条目,而非使用变量存储的实际星期值(如"Monday")。由于调度字典中根本不存在这个key,代码运行到对应分支时会直接抛出
KeyError: 'current_dayoftheweek',Lambda执行直接中断。 - 正确写法是去掉外层引号,直接用变量取值:
app_off[current_dayoftheweek]。所有web_off、sql_off、app_on、web_on、sql_on的访问都存在同样的问题,需要逐一修正。
时间匹配失效的次生问题
就算修正了字典取值的写法,以下问题仍会导致时间逻辑无法正常触发:
时区不匹配
- 代码使用
time.strftime()获取时间,默认读取Lambda运行环境的UTC时区,而你的日志显示期望的时区为UTC-7(太平洋标准时间)。若未做时区转换,拿到的时间和你配置的调度时间存在固定时差,永远无法匹配。 - 修正方案:可在代码中显式设置时区偏移,或使用带时区的时间库获取对应时区的当前时间。
时间格式不匹配
- 调度字典中开机时间的写法为
"5:00"(小时无前置零),而time.strftime("%H:%M")输出的24小时制时间带前置零(如凌晨5点输出为"05:00")。字符串严格相等匹配时,"05:00" != "5:00",永远触发不了开机逻辑。 - 修正方案:统一时间格式,要么将字典中的时间都改为带前置零的写法(如
"05:00"),要么修改时间格式化的规则为"%-H:%M"(Linux运行环境下去掉小时位的前置零),保证两边格式完全一致。
空Tag判断缺失
- 部分无标签的EC2实例,其
instance.tags属性值为None而非空列表,直接遍历会抛出类型错误导致函数中断。 - 修正方案:遍历前增加判断:
if not instance.tags: continue,跳过无标签的实例。
日志断更的可能原因
- 你的代码存在未捕获的
KeyError、类型错误等异常,Lambda每次触发都会直接执行失败。如果你的CloudWatch Logs视图只筛选了正常运行的INFO日志,没有显示错误级别的堆栈日志,就会看起来像函数从2021年之后没有运行记录。 - 若修正代码后仍无新日志,需检查两点:
- CloudWatch Events定时规则是否处于启用状态,是否存在权限问题导致规则无法触发Lambda
- Lambda的执行角色是否具备CloudWatch Logs写入权限、EC2实例的查看/启停权限
代码冗余优化建议
- 循环中重复判断
tag['Key'] == 'Schedule_Name'的逻辑冗余,可合并到同一个条件分支内 - 多余的
pass语句无实际作用,可删除 - 可增加通用异常捕获逻辑,避免单实例的tag缺失导致整个函数执行中断
内容的提问来源于stack exchange,提问作者condescendent
相关产品推荐
相关产品推荐

