サーバーレスでスケジュール実行!cron-job.org 完全ガイド
前節ではローカル環境でCrontabを使う方法を学びました。しかし、24時間稼働のサーバーを持っていない場合、どうすればよいでしょうか?
もしあなたが無料のPaaSプラットフォーム(Render、Heroku、Vercelなど)にWebサイトやAPIをデプロイしている場合、これらのプラットフォームでは無料版では「バックグラウンドの定期タスク」機能が提供されていないか、厳しい制限(例:15分間リクエストがないとサーバーがスリープ状態になる)があるかもしれません。
そんな時こそ、cron-job.org が救世主になります!
Webhookスケジューリングとは?
cron-job.orgの仕組みは非常にシンプルです。これは本質的にヨーロッパにあるサーバーで、あなたが指定したURLと時間間隔に従って動作します。指定した時間になると、このサーバーがあなたの指定したURLにアクセスします(まるで見えないユーザーがブラウザを開くように)。
URL(API)がアクセスされると、あなたのバックエンドサーバーは設定したコードを実行します。これがWebhookトリガーメカニズムと呼ばれるものです。
[!TIP] よくある使用例:無料サーバーのスリープ防止(Keep-alive) Renderなどの多くの無料プラットフォームでは、15分間HTTPリクエストがないとサーバーを「シャットダウン」してリソースを節約します。次に誰かがアクセスすると、最大50秒の起動時間(コールドスタート)がかかります。 cron-job.orgを利用して10分ごとに自動的にあなたのウェブサイトのホームページを叩くように設定できます。これで、無料サーバーを「常時起動」状態に保てます。一銭も払わずに有料レベルのサービスを実現!
登録と最初のCronjob作成
1. アカウント登録
まずcron-job.orgにアクセスし、右上のSign Upから無料アカウントを登録します。これは10年以上安定して運営されている非営利サービスで、非常に親切です。
2. 新規タスク作成(Create Cronjob)
ログイン後、画面の**"CREATE CRONJOB"**ボタンをクリックします。
設定が必要なフィールドが表示されます:
- Title(タイトル): タスクに名前を付けます(例:「打刻ボット生存維持タスク」)
- URL: トリガーするAPIのURLを入力(例:
https://my-fastapi-app.onrender.com/api/daily-task) - Execution schedule(実行スケジュール):
直感的なインターフェースで頻度を設定可能:
Every minute(毎分)Every 5 minutes(5分ごと)User-defined(カスタム):カスタムを選ぶと、前節で学んだCrontabとよく似たインターフェースで、特定の月、曜日、時間を選択できます
3. 詳細設定(Advanced)
基本的な「生存維持タスク」なら上記設定で十分ですが、データベースを変更するような重要なAPIをトリガーする場合は詳細設定が必要です:
- HTTP Method: デフォルトは
GET。バックエンドAPIがPOSTリクエストを受け取るように設計されている場合は、ここでPOSTに変更 - Headers: 悪意のあるハッカーがあなたのスケジュールAPIを乱用しないよう、カスタム認証を追加
例:
- Key:
Authorization - Value:
Bearer my_super_secret_token_123
- Key:
- Request Body: POSTリクエストの場合、ここでJSONデータを追加してバックエンドに送信可能
4. 保存と監視
設定が完了したら、下部のCREATEをクリックするとスケジュールが開始されます!
cron-job.orgのダッシュボードでは、過去の実行成功/失敗記録(History)を確認できます。APIがエラー(500エラー)を返した場合、サーバーからのエラーメッセージも記録され、タスク失敗時に自動でメールを送信するアラート設定も可能です!
実践例:FastAPIエンドポイント設計
cron-job.orgと連携するバックエンドコード(Python FastAPIの場合)は次のようになります:
from fastapi import FastAPI, Depends, HTTPException, Header
import os
app = FastAPI()
# 環境変数からシークレットキーを取得
CRON_SECRET = os.getenv("CRON_SECRET", "my_super_secret_token_123")
def verify_cron_token(authorization: str = Header(None)):
"""cron-job.orgからのリクエストか検証"""
if authorization != f"Bearer {CRON_SECRET}":
raise HTTPException(status_code=401, detail="Unauthorized Request")
return True
@app.post("/api/daily-task")
async def run_daily_task(authorized: bool = Depends(verify_cron_token)):
"""
このAPIはcron-job.orgによって毎日定時に呼び出される
"""
print("毎日タスクを実行中...")
# ここに自動実行したいビジネスロジックを記述
# 例:データベースからレポート取得、Line通知送信、期限切れデータのクリーンアップなど
return {"status": "success", "message": "Daily task completed."}
[!IMPORTANT] セキュリティ最優先! Webhook APIが「データ書き込み」や「メッセージ送信」を行う場合、絶対に認証なしで公開しないでください。ネット上には悪意のあるボットがURLをスキャンしており、見つかると1日に1万回もAPIが呼び出され、データベースが破壊されたりスパムメールが大量送信される可能性があります。上記の例のようにTokenを使用して保護してください。
cron-job.orgとバックエンドAPIを組み合わせることで、80%の定期タスク要件を解決でき、しかもサーバーコストを一切増やさずに実現できます!
更多 Cron Job 範例
# 每小時執行一次
0 * * * * /usr/bin/python3 /home/user/scripts/hourly_report.py
# 每天凌晨3點執行資料庫備份
0 3 * * * /home/user/scripts/backup_db.sh
# 每週一上午9點發送週報
0 9 * * 1 /home/user/scripts/weekly_report.py
# 每月1號凌晨執行月結
0 0 1 * * /home/user/scripts/monthly_close.py
常見問題排除
如果你發現你的 Cron Job 沒有按時執行,可能的原因:
- PATH 環境變數:Cron 的 PATH 很簡潔,建議使用絕對路徑
- 權限問題:確認腳本有執行權限 (
chmod +x) - 日誌檢查:查看
/var/log/cron或syslog確認執行記錄 - 郵件通知:Cron 預設會將輸出寄給使用者,可在 crontab 中設定 MAILTO