AWS EventBridge Scheduler 未触发 Lambda排查记录

你是否遇到过这样的情况:在 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 看起来“静默失败”时,请按以下顺序排查:

  1. 看日志: CloudWatch 无日志 = 权限问题或配置错误(非代码逻辑错误)。
  2. 看时区: 确认 Scheduler 的 Cron 表达式时区是否与你的预期一致(Asia/Shanghai vs UTC)。
  3. 看权限(最重要):
    • 检查 IAM Role 是否有 lambda:InvokeFunction
    • 核对 ARN 的每一个字段,特别是 Region(地区)Account ID
  4. 看参数: 如果 Lambda 依赖 payload,确保 Scheduler 传递了正确的 JSON。