Snowflakeタスクが動かない原因と「Task is suspended」の解決方法

Snowflakeタスクが動かない原因と「Task is suspended」エラーの解決手順を初心者向けに解説する記事のアイキャッチ図解 Snowflake
この記事をシェアする𝕏B!FacebookLINEPocket

はじめに:タスクが「動かない!」と焦る前に

「夜中に動くはずだったSnowflakeのタスク(TASK)が、朝来てみたら一度も実行されていなかった…」「ALTER TASK …EXECUTEを叩いたらTask is suspendedと怒られた…」そんな経験はありませんか?実はSnowflakeのタスクは、作っただけでは絶対に動いてくれない仕組みになっています。

この記事では、タスクが動かない代表的な原因と、よく見かける「Task is suspended」エラーの解決手順を解説していきます。

記事タイトルを示すアイキャッチ図で、Snowflakeのタスク(TASK)が動かない代表的な原因と、ALTER TASK実行時に表示される「Task is suspended」エラーの解決手順をまとめたビジュアル

そもそもSnowflakeのタスクとは?

SnowflakeのTASKは、指定した時刻や間隔でSQLやストアドプロシージャを自動実行してくれる「スケジューラ」のような機能です。たとえば「毎朝6時に集計テーブルを更新する」「30分ごとにストリームから差分をマージする」といった処理を、外部のジョブツールを使わずSnowflake内だけで完結できます。

タスクは大きく2種類のステータスを持ちます。

  • SUSPENDED:停止中。スケジュールが来ても動かない。
  • STARTED:起動中。スケジュールに従って自動実行される。

そして、CREATE TASK直後は必ずSUSPENDED状態でスタートします。これがハマりやすい最大のポイントです。

原因①:そもそもRESUMEしていない

「Task is suspended」というメッセージや、「定刻になっても何も起きない」という症状の8割はコレです。タスクを作っただけでは動きません。明示的に開始させる必要があります。

-- 状態を確認
SHOW TASKS LIKE 'MY_DAILY_TASK';

-- 起動する
ALTER TASK MY_DAILY_TASK RESUME;

これでstate列がstartedに変われば成功です。停止したい時はALTER TASK MY_DAILY_TASK SUSPEND;を使います。

原因②:子タスク(依存タスク)を1つずつ起動しようとしている

SnowflakeのタスクはAFTER句を使って親子関係を作れます。ETLパイプラインのように「タスクA → タスクB → タスクC」と数珠つなぎにできるのですが、子タスクを単独でRESUMEしようとすると、こんなエラーが出ることがあります。

Cannot resume a child task.

子タスク(ルート以外)は、必ずルートタスクから順番に有効化していく必要があります。一括で有効化したい時は、便利な専用関数が用意されています。

-- ルートタスク配下の全タスクを一括RESUME
SELECT SYSTEM$TASK_DEPENDENTS_ENABLE('MY_ROOT_TASK');

逆に停止する場合は、子から順にSUSPENDするのが安全です。

原因③:必要な権限が足りていない

タスクを実行するロールには、いくつかの権限が必要です。特に見落としがちなのは次の2つ。

  • EXECUTE TASK権限(アカウントレベル):タスクを動かすために必須。
  • タスクが触るテーブル・ウェアハウスへのUSAGE / SELECT / INSERT権限。
-- 実行権限を付与
GRANT EXECUTE TASK ON ACCOUNT TO ROLE TASK_RUNNER_ROLE;

-- タスクの所有権限の確認
SHOW GRANTS ON TASK MY_DAILY_TASK;

権限不足で失敗するケースは、Insufficient privileges to operate on の原因と解決手順Object does not exist or not authorized エラーの正体も合わせて読むと理解が深まりますよ。

原因④:ウェアハウスが指定されていない・存在しない

タスクはどこかのコンピュートで実行する必要があります。ユーザー管理ウェアハウスを使う場合、WAREHOUSE句で指定したウェアハウスが存在し、ロールにUSAGE権限があることを確認しましょう。指定がない、または名前が間違っているとタスクが起動できません。詳しくは「Warehouse does not exist」エラーの原因と解決法を参考にしてください。

サーバーレス実行を使う場合はUSER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZEを指定します。

図解:Snowflakeタスクのウェアハウス設定とサーバーレス実行の選択肢を比較し、WAREHOUSE句指定時のUSAGE権限確認と、USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE指定によるサーバーレス起動の流れを示した構成図

原因⑤:実行履歴を確認していない

タスクが動いた・動かなかったのログはTASK_HISTORYテーブル関数で見られます。エラー原因を特定する第一歩はココです。

SELECT name, state, scheduled_time, error_code, error_message
FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(
  TASK_NAME => 'MY_DAILY_TASK',
  SCHEDULED_TIME_RANGE_START => DATEADD('day', -1, CURRENT_TIMESTAMP())
))
ORDER BY scheduled_time DESC;

stateSKIPPEDになっている場合、前回の実行がまだ終わっていない、もしくはタスクがSUSPENDEDだったことが原因の可能性が高いです。

すぐに試したい時のチートシート

  1. SHOW TASKS;で状態確認 → SUSPENDEDならALTER TASK ... RESUME;
  2. 依存ツリーがあるならSYSTEM$TASK_DEPENDENTS_ENABLE('ROOT')で一括起動
  3. EXECUTE TASK権限がロールに付いているか確認
  4. ウェアハウス名・SQL本体を手動で実行してエラーが出ないか確認
  5. TASK_HISTORYで実行履歴とerror_messageを確認

手動で1回だけ走らせたい時はEXECUTE TASK MY_DAILY_TASK;が便利です。スケジュールを待たずに動作確認できます。

まとめ

Snowflakeのタスクは「作ったら自動的に動く」のではなく、明示的にRESUMEする必要があるという基本ルールさえ押さえれば、ほとんどのトラブルは解決します。子タスクのある構成ではSYSTEM$TASK_DEPENDENTS_ENABLEを活用し、権限・ウェアハウス・履歴の3点セットを順にチェックする習慣をつけましょう。これで夜中のジョブが空振りする悲劇とはサヨナラです!

参考リンク

関連記事

この記事をシェアする𝕏B!FacebookLINEPocket