Kamui Platform Kamui Platform ドキュメント
EN JA

ジョブ(CronJob)

ジョブは、指定したスケジュールで定期的に実行されるタスクです。バッチ処理、データ集計、定期的なクリーンアップなどに使用できます。

ジョブとは

  • 指定した時間に自動実行されるプログラム
  • アプリケーションと同じリポジトリのコードを使用
  • データベースに接続可能
  • 実行履歴・ログを確認可能

ジョブを作成する

  1. プロジェクト詳細画面で「新規ジョブ」をクリック
  2. 基本設定を入力:
項目 説明
ジョブ名 識別用の名前 daily-report
言語 使用するプログラミング言語 Node.js / Go / Python
  1. デプロイソースを選択:
項目 説明
リポジトリ ソースコードのリポジトリ myorg/my-jobs
ブランチ 使用するブランチ main
ディレクトリ サブディレクトリ(モノレポの場合) jobs/report
  1. 実行設定:
項目 説明
実行コマンド 実行するコマンド node report.js
セットアップコマンド 依存関係のインストール npm install
プリコマンド 前処理コマンド npm run build
  1. スケジュール設定:
項目 説明
スケジュールタイプ プリセットまたはカスタム
Cron 式 カスタムの場合のみ
  1. オプション設定:
  2. スペック(リソースサイズ)
  3. 環境変数
  4. データベース接続

  5. 「作成」をクリック

スケジュールタイプ

プリセット

タイプ 実行タイミング 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 です。

ジョブを即時実行する

スケジュールを待たずに今すぐ実行したい場合:

  1. ジョブ詳細画面を開く
  2. 「今すぐ実行」ボタンをクリック
  3. 確認ダイアログで「実行」をクリック

実行履歴を確認する

  1. ジョブ詳細画面で「実行履歴」タブをクリック
  2. 各実行の情報を確認:
  3. 開始時刻
  4. 終了時刻
  5. 実行時間
  6. ステータス(成功 / 失敗)

実行ログを確認する

  1. 実行履歴から確認したい実行を選択
  2. ログ画面で stdout / stderr の出力を確認

ジョブを編集する

  1. ジョブ詳細画面で「設定」タブをクリック
  2. 編集可能な項目:
  3. スケジュール
  4. 実行コマンド
  5. スペック
  6. 環境変数
  7. データベース接続
  8. 「保存」をクリック

ジョブを一時停止する

スケジュール実行を一時的に停止したい場合:

  1. ジョブ詳細画面で「一時停止」をクリック
  2. ジョブはスケジュール実行されなくなります
  3. 「再開」をクリックで再びスケジュール実行されます

ジョブを削除する

  1. ジョブ詳細画面で「設定」タブをクリック
  2. 「ジョブを削除」をクリック
  3. 確認ダイアログでジョブ名を入力
  4. 「削除」をクリック

⚠️ 警告: 実行履歴も削除されます。この操作は取り消せません。

ユースケース例

日次レポート生成

// 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")

次のステップ