Snowflakeタスク入門|定期実行ジョブを5分で作る方法

Snowflakeタスク入門|定期実行ジョブを5分で作る方法 Snowflake

Snowflakeタスク(Task)って何ができるの?

「毎日深夜に集計テーブルを更新したい」「1時間ごとにステージのファイルを取り込みたい」——こんな 定期実行ジョブ をSnowflakeの中だけで完結させたいと思ったことはありませんか?そんなときに登場するのが タスク (Task) です。

タスクは、SQL文やストアドプロシージャ、スクリプトを スケジュール実行 してくれるSnowflake標準の機能。AirflowやcronをわざわざEC2に立てなくても、Snowflake内部だけでバッチ処理パイプラインを組めるのがうれしいポイントです。

AirflowやcronなしでSnowflakeタスクが定期実行ジョブを担う基本概念を示すフロー図

タスクの基本概念

タスク=「定刻になったら走る小さなロボット」

タスクは「いつ動くか(スケジュール)」と「何をするか(SQL本体)」をセットで定義したオブジェクトです。一度 CREATE TASK で作って RESUME すれば、あとはSnowflakeが勝手に時間通りに動かしてくれます。

2種類のスケジュール指定

  • INTERVAL方式: SCHEDULE = '5 MINUTE' のように間隔で指定
  • CRON方式: SCHEDULE = 'USING CRON 0 9 * * * Asia/Tokyo' のように曜日・時刻指定

タスクが使うコンピュート

タスク実行には2つの選択肢があります。
①自分で仮想ウェアハウスを指定する従来型、②Snowflakeが裏で自動的にリソースを割り当てる サーバーレスタスク。短い処理ならサーバーレスのほうが安く済むケースも多いです。

実際にタスクを作ってみよう

例1: 5分おきに集計テーブルを更新

CREATE OR REPLACE TASK refresh_sales_summary
  WAREHOUSE = COMPUTE_WH
  SCHEDULE  = '5 MINUTE'
AS
  INSERT INTO sales_summary
  SELECT product_id, SUM(amount), CURRENT_TIMESTAMP()
  FROM sales
  WHERE created_at >= DATEADD('minute', -5, CURRENT_TIMESTAMP())
  GROUP BY product_id;

例2: 平日朝9時にプロシージャを実行(CRON)

CREATE OR REPLACE TASK daily_etl_task
  WAREHOUSE = ETL_WH
  SCHEDULE  = 'USING CRON 0 9 * * MON-FRI Asia/Tokyo'
AS
  CALL run_daily_etl();

作成した直後のタスクは SUSPENDED(停止状態) なので、必ず以下で開始しましょう。

ALTER TASK refresh_sales_summary RESUME;
平日朝9時にCRON実行するdaily_etl_taskのCREATE文とRESUMEで開始するSnowflakeタスクのSQL例

タスクツリー: 複数タスクをつなげてパイプライン化

タスクの強みは 親子関係(タスクツリー / DAG) を作れること。AFTER 句で前のタスクを指定すれば、「Aが終わったらBを実行」という依存関係を簡単に表現できます。

CREATE OR REPLACE TASK child_task
  WAREHOUSE = ETL_WH
  AFTER parent_task
AS
  CALL aggregate_step();

これで、ロード→クレンジング→集計のような ETLパイプライン がSnowflake内で完結します。Snowpipeでファイルを取り込み、タスクで集計、という組み合わせも王道パターンです。

実行履歴を確認するには

SELECT *
FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY())
ORDER BY scheduled_time DESC
LIMIT 20;

よくあるユースケースと注意点

  • 定期集計: 売上サマリやKPIテーブルの更新
  • データ品質チェック: 毎朝の異常値検知
  • 古いデータの削除: 90日以上前のログを定期的に DELETE
  • 外部関数呼び出し: 通知やメール送信

注意点として、タスクは作成直後は止まっています。RESUME 忘れは初心者あるある。また、リアルタイム性が必要なら動的テーブルのほうが向いていることも覚えておきましょう。

まとめ

Snowflakeのタスクを使えば、外部スケジューラなしで 定期実行ジョブ を構築できます。CREATE TASK + SCHEDULE + RESUME の3点セットで、まずは1つ作ってみるのがおすすめ。慣れてきたらタスクツリーでパイプラインを組み、Snowflake内でETLを完結させましょう!

参考リンク

関連記事