DevToolBoxฟรี
บล็อก

Cron สำหรับ Serverless: GitHub Actions, Vercel Cron และ Cloudflare Workers

9 นาทีในการอ่านโดย DevToolBox
Ad Space

Cron expression คือภาษาสากลสำหรับการกำหนดตารางงาน แต่แพลตฟอร์ม serverless แต่ละแห่งมีข้อจำกัดต่างกัน

พื้นฐาน Cron Expression

Cron มาตรฐานมี 5 ฟิลด์:

┌───────────── minute (0-59)
│ ┌───────────── hour (0-23)
│ │ ┌───────────── day of month (1-31)
│ │ │ ┌───────────── month (1-12)
│ │ │ │ ┌───────────── day of week (0-6, Sun=0)
│ │ │ │ │
* * * * *

ตัวอักษรพิเศษที่พบบ่อย:

  • *ค่าใดก็ได้
  • */5ทุก 5 หน่วย
  • 1,3,5ค่าเฉพาะ
  • 1-5ช่วงค่า

ทดสอบ cron ด้วย Cron Parser ของเรา →

แพลตฟอร์ม 1: GitHub Actions

GitHub Actions ใช้ event schedule.

การกำหนดค่า

# .github/workflows/scheduled.yml
name: Scheduled Job
on:
  schedule:
    - cron: '30 5 * * 1-5'  # Weekdays at 5:30 AM UTC
    - cron: '0 12 1 * *'    # 1st of every month at noon UTC
jobs:
  run:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: echo "Running scheduled task"

ข้อจำกัดหลัก

ด้านรายละเอียด
เขตเวลาUTC เท่านั้น
ช่วงต่ำสุดทุก 5 นาที (*/5 * * * *)
ความแม่นยำอาจล่าช้าได้
Branchเฉพาะ branch หลัก
ปิดการใช้งานหลัง 60 วันไม่ใช้งาน

ตารางที่พบบ่อย

# Every 5 minutes
- cron: '*/5 * * * *'

# Every hour at minute 0
- cron: '0 * * * *'

# Daily at midnight UTC
- cron: '0 0 * * *'

# Daily at 9 AM Eastern (UTC-5, no DST)
- cron: '0 14 * * *'

# Weekdays at 8 AM UTC
- cron: '0 8 * * 1-5'

# Every Monday and Thursday at 6 PM UTC
- cron: '0 18 * * 1,4'

# First day of every month at midnight
- cron: '0 0 1 * *'

Tip: GitHub Actions อาจไม่ตรงเวลา.

แพลตฟอร์ม 2: Vercel Cron Jobs

กำหนดค่าใน vercel.json.

การกำหนดค่า

// vercel.json
{
  "crons": [
    {
      "path": "/api/daily-report",
      "schedule": "0 8 * * *"
    },
    {
      "path": "/api/cleanup",
      "schedule": "0 0 * * 0"
    }
  ]
}

API Route

// app/api/daily-report/route.ts
import { NextResponse } from 'next/server';

export async function GET() {
  // Your scheduled logic here
  await sendDailyReport();
  return NextResponse.json({ ok: true });
}

// Vercel recommends setting maxDuration for long tasks
export const maxDuration = 60; // seconds

ข้อจำกัดหลัก

แผนช่วงต่ำสุดMax Cron Jobsจำกัดการรัน
Hobby (free)Once per day210s
ProOnce per hour4060s (default)
EnterpriseOnce per minute100900s

Important: Vercel ใช้ UTC. Hobby: 1/วัน.

แพลตฟอร์ม 3: Cloudflare Workers

กำหนดค่าใน wrangler.toml.

การกำหนดค่า

# wrangler.toml
name = "my-worker"
main = "src/index.ts"

[triggers]
crons = [
  "*/5 * * * *",    # Every 5 minutes
  "0 12 * * 1-5",   # Weekdays at noon UTC
  "0 0 1 * *"       # First of every month
]

Worker Code

// src/index.ts
export default {
  async scheduled(
    controller: ScheduledController,
    env: Env,
    ctx: ExecutionContext
  ) {
    // controller.cron contains the cron pattern that triggered
    switch (controller.cron) {
      case '*/5 * * * *':
        await doHealthCheck(env);
        break;
      case '0 12 * * 1-5':
        await sendReport(env);
        break;
    }
  },
};

ข้อจำกัดหลัก

ด้านรายละเอียด
เขตเวลาUTC เท่านั้น
ช่วงต่ำสุด1 ครั้ง/นาที
Max cron triggers3 ต่อ Worker (ฟรี)
CPU10ms/30s
ความแม่นยำเชื่อถือได้สูง

เปรียบเทียบแพลตฟอร์ม

ฟีเจอร์GitHub ActionsVercel CronCF Workers
TimezoneUTCUTCUTC
Min interval (free)5 min1/day1 min
Min interval (paid)5 min1/min1 min
ReliabilityMedium (can delay)HighVery high
Max execution time6 hours10s-900s10ms-30s
Config location.github/workflows/vercel.jsonwrangler.toml
Trigger handlerWorkflow YAMLAPI routescheduled() event

กับดักเขตเวลา

ทั้งสามใช้ UTC เท่านั้น.

เวลาท้องถิ่นUTC OffsetCron (9 โมงท้องถิ่น)
US Eastern (EST)UTC-50 14 * * *
US Pacific (PST)UTC-80 17 * * *
Central Europe (CET)UTC+10 8 * * *
China (CST)UTC+80 1 * * *
Japan (JST)UTC+90 0 * * *

เวลาออมแสงเปลี่ยน offset UTC.

10 Cron Expression พร้อมใช้

ตารางที่ใช้บ่อย:

# Every 5 minutes
*/5 * * * *

# Every hour at :00
0 * * * *

# Every day at midnight UTC
0 0 * * *

# Every day at noon UTC
0 12 * * *

# Weekdays (Mon-Fri) at 9 AM UTC
0 9 * * 1-5

# Every Monday at 8 AM UTC
0 8 * * 1

# Every 6 hours
0 */6 * * *

# First day of every month at midnight
0 0 1 * *

# Every 15 minutes during business hours (8-17 UTC)
*/15 8-17 * * 1-5

# Last day of month at 11 PM UTC (approximate)
0 23 28-31 * *

ตรวจสอบ cron ด้วย Cron Parser →

คำถามที่พบบ่อย

GitHub Actions ใช้เขตเวลาใด?

UTC เสมอ.

ช่วงต่ำสุด Vercel Cron?

Hobby: 1/วัน, Pro: 1/ชม., Enterprise: 1/นาที.

Cloudflare Workers ทุกวินาที?

ไม่ได้. ความละเอียดต่ำสุด: 1 นาที.

ลองเครื่องมือที่เกี่ยวข้อง

Cron Expression Parser
Ad Space

บทความที่เกี่ยวข้อง

การตรวจสอบ YAML Docker Compose: 10 ข้อผิดพลาดไวยากรณ์ที่พบบ่อยและวิธีแก้ไข

หยุดเสียเวลากับข้อผิดพลาด YAML Docker Compose เรียนรู้การระบุและแก้ไข 10 ข้อผิดพลาดที่พบบ่อยที่สุด