ジョブ(CronJob)
ジョブは、指定したスケジュールで定期的に実行されるタスクです。バッチ処理、データ集計、定期的なクリーンアップなどに使用できます。
ジョブとは
- 指定した時間に自動実行されるプログラム
- アプリケーションと同じリポジトリのコードを使用
- データベースに接続可能
- 実行履歴・ログを確認可能
ジョブを作成する
- プロジェクト詳細画面で「新規ジョブ」をクリック
- 基本設定を入力:
| 項目 | 説明 | 例 |
|---|---|---|
| ジョブ名 | 識別用の名前 | daily-report |
| 言語 | 使用するプログラミング言語 | Node.js / Go / Python |
- デプロイソースを選択:
| 項目 | 説明 | 例 |
|---|---|---|
| リポジトリ | ソースコードのリポジトリ | myorg/my-jobs |
| ブランチ | 使用するブランチ | main |
| ディレクトリ | サブディレクトリ(モノレポの場合) | jobs/report |
- 実行設定:
| 項目 | 説明 | 例 |
|---|---|---|
| 実行コマンド | 実行するコマンド | node report.js |
| セットアップコマンド | 依存関係のインストール | npm install |
| プリコマンド | 前処理コマンド | npm run build |
- スケジュール設定:
| 項目 | 説明 |
|---|---|
| スケジュールタイプ | プリセットまたはカスタム |
| Cron 式 | カスタムの場合のみ |
- オプション設定:
- スペック(リソースサイズ)
- 環境変数
-
データベース接続
-
「作成」をクリック
スケジュールタイプ
プリセット
| タイプ | 実行タイミング | Cron 式 |
|---|---|---|
| 毎時 | 毎時 0 分 | 0 * * * * |
| 毎日(深夜 0 時) | 毎日 0:00 | 0 0 * * * |
| 毎日(午前 3 時) | 毎日 3:00 | 0 3 * * * |
| 毎日(午前 9 時) | 毎日 9:00 | 0 9 * * * |
| 毎週(日曜) | 毎週日曜 0:00 | 0 0 * * 0 |
| 毎週(月曜) | 毎週月曜 0:00 | 0 0 * * 1 |
| 毎月(1 日) | 毎月 1 日 0:00 | 0 0 1 * * |
カスタム(Cron 式)
標準的な Cron 式で指定できます。
┌───────── 分 (0 - 59)
│ ┌───────── 時 (0 - 23)
│ │ ┌───────── 日 (1 - 31)
│ │ │ ┌───────── 月 (1 - 12)
│ │ │ │ ┌───────── 曜日 (0 - 6, 0 = 日曜日)
│ │ │ │ │
* * * * *
例:
| Cron 式 | 意味 |
|---|---|
*/15 * * * * |
15 分ごと |
0 */2 * * * |
2 時間ごと |
30 8 * * 1-5 |
平日 8:30 |
0 0 15 * * |
毎月 15 日 0:00 |
注意: タイムゾーンは UTC です。日本時間(JST)は UTC+9 です。
ジョブを即時実行する
スケジュールを待たずに今すぐ実行したい場合:
- ジョブ詳細画面を開く
- 「今すぐ実行」ボタンをクリック
- 確認ダイアログで「実行」をクリック
実行履歴を確認する
- ジョブ詳細画面で「実行履歴」タブをクリック
- 各実行の情報を確認:
- 開始時刻
- 終了時刻
- 実行時間
- ステータス(成功 / 失敗)
実行ログを確認する
- 実行履歴から確認したい実行を選択
- ログ画面で stdout / stderr の出力を確認
ジョブを編集する
- ジョブ詳細画面で「設定」タブをクリック
- 編集可能な項目:
- スケジュール
- 実行コマンド
- スペック
- 環境変数
- データベース接続
- 「保存」をクリック
ジョブを一時停止する
スケジュール実行を一時的に停止したい場合:
- ジョブ詳細画面で「一時停止」をクリック
- ジョブはスケジュール実行されなくなります
- 「再開」をクリックで再びスケジュール実行されます
ジョブを削除する
- ジョブ詳細画面で「設定」タブをクリック
- 「ジョブを削除」をクリック
- 確認ダイアログでジョブ名を入力
- 「削除」をクリック
⚠️ 警告: 実行履歴も削除されます。この操作は取り消せません。
ユースケース例
日次レポート生成
// report.js
const { Pool } = require('pg');
async function generateReport() {
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
const result = await pool.query(`
SELECT DATE(created_at) as date, COUNT(*) as count
FROM orders
WHERE created_at >= NOW() - INTERVAL '1 day'
GROUP BY DATE(created_at)
`);
console.log('Daily Report:', result.rows);
// メール送信やSlack通知など
}
generateReport().catch(console.error);
データクリーンアップ
# cleanup.py
import os
import psycopg2
from datetime import datetime, timedelta
conn = psycopg2.connect(os.environ['DATABASE_URL'])
cursor = conn.cursor()
# 30日以上前の一時データを削除
cursor.execute("""
DELETE FROM temp_data
WHERE created_at < NOW() - INTERVAL '30 days'
""")
conn.commit()
print(f"Deleted {cursor.rowcount} old records")