はじめに:タスクが「動かない!」と焦る前に
「夜中に動くはずだったSnowflakeのタスク(TASK)が、朝来てみたら一度も実行されていなかった…」「ALTER TASK …EXECUTEを叩いたらTask is suspendedと怒られた…」そんな経験はありませんか?実はSnowflakeのタスクは、作っただけでは絶対に動いてくれない仕組みになっています。
この記事では、タスクが動かない代表的な原因と、よく見かける「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を指定します。

原因⑤:実行履歴を確認していない
タスクが動いた・動かなかったのログは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;
stateがSKIPPEDになっている場合、前回の実行がまだ終わっていない、もしくはタスクがSUSPENDEDだったことが原因の可能性が高いです。
すぐに試したい時のチートシート
SHOW TASKS;で状態確認 → SUSPENDEDならALTER TASK ... RESUME;- 依存ツリーがあるなら
SYSTEM$TASK_DEPENDENTS_ENABLE('ROOT')で一括起動 EXECUTE TASK権限がロールに付いているか確認- ウェアハウス名・SQL本体を手動で実行してエラーが出ないか確認
TASK_HISTORYで実行履歴とerror_messageを確認
手動で1回だけ走らせたい時はEXECUTE TASK MY_DAILY_TASK;が便利です。スケジュールを待たずに動作確認できます。
まとめ
Snowflakeのタスクは「作ったら自動的に動く」のではなく、明示的にRESUMEする必要があるという基本ルールさえ押さえれば、ほとんどのトラブルは解決します。子タスクのある構成ではSYSTEM$TASK_DEPENDENTS_ENABLEを活用し、権限・ウェアハウス・履歴の3点セットを順にチェックする習慣をつけましょう。これで夜中のジョブが空振りする悲劇とはサヨナラです!
参考リンク
- タスクの概要 – Snowflake公式ドキュメント
- ALTER TASK – Snowflake公式ドキュメント
- SYSTEM$TASK_DEPENDENTS_ENABLE – Snowflake公式ドキュメント
- TASK_HISTORY – Snowflake公式ドキュメント
関連記事
- Snowflake「Dynamic table refresh failed」の原因と解決ガイド – 自動更新系のもう一つの主役、ダイナミックテーブルのトラブル対処。
- Snowflake「Warehouse does not exist」エラーの原因と解決法 – タスクが使うウェアハウスでつまずいた時に。
- Insufficient privileges to operate on の原因と解決手順 – EXECUTE TASKなどの権限まわりを深掘り。
- Object does not exist or not authorized エラーの正体 – タスク内SQLで参照先が見えない時のデバッグに。
- Snowflake「Stream is stale」エラーの原因とストリーム再構築の手順を解説 – 関連するエラー対処の手順をまとめています


