概述

EventBridge Scheduler 是 AWS 托管的定时任务服务,可以在指定时间或按固定频率触发各种 AWS 目标(Lambda、ECS Task、SNS、SQS 等),无需管理服务器。

与老版本的 EventBridge Rules(Cron Rules) 相比,Scheduler 是独立的服务,功能更强:

特性 EventBridge Rules EventBridge Scheduler
时区支持 仅 UTC 支持任意时区
一次性调度 不支持 支持
灵活速率表达式 有限 支持 rate、cron、一次性
目标数 每条规则最多 5 个 每个 Schedule 1 个
错误重试 无内置重试 支持重试策略和死信队列(见 AWS SQS)
时间窗口 无 支持弹性时间窗口

核心概念

Schedule 类型

类型 说明 示例
Rate 固定间隔重复 rate(5 minutes)
Cron Cron 表达式,支持时区 cron(0 2 * * ? *) 每天凌晨 2 点
One-time 指定某个时刻执行一次 2026-06-01T00:00:00

Schedule Group

Schedule 的逻辑分组,用于统一管理(打标签、批量删除)。默认分组为 default。

Flexible Time Window(弹性时间窗口)

允许任务在指定时间后的一个窗口内任意时刻触发,有助于分散负载、避免整点突刺。

flexibleTimeWindow:
  mode: FLEXIBLE
  maximumWindowInMinutes: 15

权限模型

Scheduler 需要一个 IAM Role 来代表它调用目标服务,该 Role 的信任策略需允许 scheduler.amazonaws.com Assume:

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": { "Service": "scheduler.amazonaws.com" },
    "Action": "sts:AssumeRole"
  }]
}

Role 附加的权限策略需包含目标操作,例如调用 Lambda:

{
  "Effect": "Allow",
  "Action": "lambda:InvokeFunction",
  "Resource": "arn:aws:lambda:ap-northeast-1:123456789012:function:my-function"
}

OpenTofu / Terraform 配置

完整示例:每天触发 Lambda

# IAM Role for Scheduler
resource "aws_iam_role" "scheduler" {
  name = "eventbridge-scheduler-role"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Effect    = "Allow"
      Principal = { Service = "scheduler.amazonaws.com" }
      Action    = "sts:AssumeRole"
    }]
  })
}

resource "aws_iam_role_policy" "scheduler_lambda" {
  role = aws_iam_role.scheduler.id

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Effect   = "Allow"
      Action   = "lambda:InvokeFunction"
      Resource = aws_lambda_function.my_func.arn
    }]
  })
}

# Schedule Group(可选,使用默认 group 时省略)
resource "aws_scheduler_schedule_group" "default" {
  name = "my-app-schedules"
}

# Schedule
resource "aws_scheduler_schedule" "daily_job" {
  name       = "daily-backup"
  group_name = aws_scheduler_schedule_group.default.name

  flexible_time_window {
    mode = "OFF"
  }

  schedule_expression          = "cron(0 18 * * ? *)"   # UTC 18:00 = 北京时间 02:00
  schedule_expression_timezone = "Asia/Tokyo"            # 直接用时区写法更直观

  target {
    arn      = aws_lambda_function.my_func.arn
    role_arn = aws_iam_role.scheduler.arn

    input = jsonencode({
      action = "backup"
    })

    retry_policy {
      maximum_retry_attempts       = 3
      maximum_event_age_in_seconds = 3600
    }
  }
}

一次性调度示例

resource "aws_scheduler_schedule" "one_time" {
  name = "migration-trigger"

  flexible_time_window {
    mode = "OFF"
  }

  schedule_expression = "at(2026-06-01T02:00:00)"

  target {
    arn      = aws_lambda_function.migrate.arn
    role_arn = aws_iam_role.scheduler.arn
  }
}

常用 CLI 命令

# 列出所有 Schedule
aws scheduler list-schedules

# 查看某个 Schedule 详情
aws scheduler get-schedule --name daily-backup

# 列出 Schedule Group
aws scheduler list-schedule-groups

# 手动触发(Scheduler 本身不支持手动触发,可直接调用 Lambda 测试)
aws lambda invoke --function-name my-function /tmp/output.json

Cron 表达式说明

EventBridge 使用 6 字段 Cron(与标准 5 字段略有不同):

cron(分 时 日 月 星期 年)
字段 范围 特殊字符
分钟 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W
月份 1-12 或 JAN-DEC , - * /
星期 1-7 或 SUN-SAT , - * ? / L #
年份 1970-2199 , - * /

注意:日期和星期不能同时指定,必须有一个用 ? 占位。

常用示例:

cron(0 2 * * ? *)      # 每天 02:00(UTC)
cron(0/30 * * * ? *)   # 每 30 分钟
cron(0 9 ? * MON-FRI *) # 工作日每天 09:00
cron(0 0 1 * ? *)      # 每月 1 日 00:00

费用

  • 免费额度:每月前 1,400,000 次调用免费
  • 超出部分:$1.00 / 百万次调用

对于低频定时任务(如每天一次备份),基本不产生费用。

参考