你是否遇到过这样的情况:在 AWS 上配置了一个 EventBridge Scheduler 来定时运行 Lambda(例如每天定时关闭开发环境的 EC2),调度器状态显示“Enabled”,时间到了却什么都没发生?
Lambda 控制台没有报错,CloudWatch 甚至没有生成日志流。一切看起来都配置得天衣无缝,但就是不工作。
本文将复盘一次真实的排查过程,带你找出那个导致任务“静默失败”的隐蔽杀手——IAM 策略中的地区(Region)错配。
问题现象
在本次案例中,我们的目标是:每天晚上自动触发一个名为 StopEC2ByTag 的 Lambda 函数。
环境配置如下:
- Region:
ap-southeast-1(新加坡) - Service: Amazon EventBridge Scheduler -> AWS Lambda
- Status: Scheduler 显示 Enabled。
遇到的问题:
到了预定时间,Lambda 没有任何反应。查看 Lambda 的 Monitor 页面,没有调用记录,CloudWatch Logs 里也没有生成任何日志。
排查过程
1. 排除视觉误区:为什么 Lambda 界面没连线?
首先,很多从旧版 EventBridge Rule 迁移过来的用户会产生疑惑:“为什么我的 Lambda 界面上没有显示触发器?”
- 旧版 EventBridge Rule: 会作为 Trigger 显示在 Lambda 函数的拓扑图中。
- 新版 EventBridge Scheduler: 是一种单向调用机制。它不会在 Lambda 控制台显示为“触发器”。
结论: Lambda 界面看不到连线是正常的,不要因此认为配置没挂上。
2. 检查 CloudWatch Logs
这是排查 AWS 问题的第一原则。
- 如果 Lambda 代码报错,CloudWatch 会有 Error 日志。
- 如果 CloudWatch 完全没有日志,说明请求根本没进到 Lambda。
在本例中,日志为空。这意味着问题出在 Scheduler 调用 Lambda 的这个环节被拦截了。
3. 锁定嫌疑人:IAM 执行角色
Scheduler 必须拥有“调用”Lambda 的权限。我们检查了 Scheduler 绑定的 IAM Role:Amazon_EventBridge_Scheduler_LAMBDA_xxx。
查看角色的 Trust relationships(信任关系):
{
"Effect": "Allow",
"Principal": {
"Service": "scheduler.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
信任关系没问题,允许调度器服务扮演该角色。
4. 深入分析:Permissions 策略
接着,我们查看该角色挂载的权限策略(Policy)。在策略详情中,我们找到了这行关键代码:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": [
"arn:aws:lambda:ap-northeast-1:061599735862:function:StopEC2ByTag:*",
"arn:aws:lambda:ap-northeast-1:061599735862:function:StopEC2ByTag"
]
}
]
}
乍一看,Action 是 lambda:InvokeFunction,Resource 是 StopEC2ByTag,似乎没问题。但仔细对比 ARN 和实际环境,问题浮出水面。
根本原因:Region Mismatch (地区错配)
请注意 ARN 中的地区字段:
- 实际 Lambda 所在地区:
ap-southeast-1(新加坡) - IAM 策略中允许的地区:
ap-northeast-1(东京)
Resource ARN: arn:aws:lambda:ap-northeast-1:061599735862...
原因分析:
EventBridge Scheduler 身在新加坡(southeast-1),试图去调用 Lambda,但它手里的“通行证”(IAM Role)只允许它去东京(northeast-1)执行操作。AWS IAM 严格校验后拒绝了这次调用,因此 Lambda 根本不知道有过这次请求。
解决方案
修正 IAM 策略中的 ARN 即可。
修正后的 JSON:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": [
"arn:aws:lambda:ap-southeast-1:061599735862:function:StopEC2ByTag:*",
"arn:aws:lambda:ap-southeast-1:061599735862:function:StopEC2ByTag"
]
}
]
}
保存更改后,再次触发 Scheduler,Lambda 成功运行,EC2 实例按预期停止。
总结与检查清单
当你的 AWS Scheduler 看起来“静默失败”时,请按以下顺序排查:
- 看日志: CloudWatch 无日志 = 权限问题或配置错误(非代码逻辑错误)。
- 看时区: 确认 Scheduler 的 Cron 表达式时区是否与你的预期一致(Asia/Shanghai vs UTC)。
- 看权限(最重要):
- 检查 IAM Role 是否有
lambda:InvokeFunction。 - 核对 ARN 的每一个字段,特别是 Region(地区) 和 Account ID。
- 检查 IAM Role 是否有
- 看参数: 如果 Lambda 依赖 payload,确保 Scheduler 传递了正确的 JSON。