Snowflake Serverless Tasksは、仮想ウェアハウスを事前に作成・管理することなく、SnowflakeがSQL文やストアドプロシージャを自動実行するタスク基盤です。 コンピュートの起動・サイジング・停止をSnowflakeが自動管理するため、運用オーバーヘッドが大幅に削減されます。
SnowflakeのタスクにはServerless Tasks(ウェアハウス不要)とUser-managed Tasks(WAREHOUSE句でウェアハウスを指定)の2種類があります。 違いを正確に理解することが試験対策でも実務設計でも重要です。
| 比較項目 | Serverless Tasks | User-managed Tasks |
|---|---|---|
| ウェアハウス指定 | 不要(USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZEで初期サイズのみ指定) | WAREHOUSE = <name> で明示指定が必須 |
| サイズ自動調整 | Snowflakeが実行履歴に基づき自動リサイズ | 手動でALTER WAREHOUSE ... SET WAREHOUSE_SIZEが必要 |
| 課金モデル | Serverless Credit(1.5倍の倍率)× 実行時間 | ウェアハウスのCredit × 稼働時間(最低60秒課金) |
| アイドルコスト | 実行時間のみ課金(アイドルコスト0) | AUTO_SUSPENDまでのアイドル時間も課金 |
| 起動遅延 | Snowflake管理のプールから迅速起動 | ウェアハウスがSUSPENDED状態だとresume待ち |
| 必要権限 | EXECUTE MANAGED TASK(アカウントレベル) | USAGE on WAREHOUSE + CREATE TASK |
| 適するケース | 低頻度バッチ、短時間タスク、個別タスク | 常時稼働パイプライン、大規模長時間バッチ |
Serverless TaskではWAREHOUSE句を省略し、代わりにUSER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZEパラメータでコンピュートの初期サイズを指定します。
-- Serverless Task の作成
CREATE OR REPLACE TASK etl_daily_aggregate
USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = 'MEDIUM'
SCHEDULE = 'USING CRON 0 2 * * * Asia/Tokyo'
ERROR_ON_NONDETERMINISTIC_MERGE = FALSE
AS
MERGE INTO analytics.daily_summary AS tgt
USING (
SELECT
event_date,
COUNT(*) AS event_count,
SUM(revenue) AS total_revenue
FROM raw.events
WHERE event_date = CURRENT_DATE() - 1
GROUP BY event_date
) AS src
ON tgt.event_date = src.event_date
WHEN MATCHED THEN UPDATE SET
event_count = src.event_count,
total_revenue = src.total_revenue
WHEN NOT MATCHED THEN INSERT
(event_date, event_count, total_revenue)
VALUES (src.event_date, src.event_count, src.total_revenue);対比として、User-managed Taskは以下のようにWAREHOUSE句を指定します。
-- User-managed Task の作成
CREATE OR REPLACE TASK etl_daily_aggregate_wh
WAREHOUSE = etl_warehouse
SCHEDULE = 'USING CRON 0 2 * * * Asia/Tokyo'
AS
MERGE INTO analytics.daily_summary AS tgt
USING (...) AS src
ON tgt.event_date = src.event_date
WHEN MATCHED THEN UPDATE SET ...
WHEN NOT MATCHED THEN INSERT ...;Serverless TasksでもAFTER句でタスクの依存関係を定義してDAGを構築できます。 ルートタスク(SCHEDULEを持つ最上位タスク)の実行完了後に子タスクが順次起動します。
-- ルートタスク(Serverless)
CREATE OR REPLACE TASK dag_root
USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = 'SMALL'
SCHEDULE = 'USING CRON 0 3 * * * Asia/Tokyo'
AS
INSERT INTO staging.raw_data
SELECT * FROM external_table WHERE loaded = FALSE;
-- 子タスク1(Serverless)
CREATE OR REPLACE TASK dag_transform
USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = 'MEDIUM'
AFTER dag_root
AS
INSERT INTO analytics.transformed
SELECT ... FROM staging.raw_data WHERE ...;
-- 子タスク2(Serverless)
CREATE OR REPLACE TASK dag_quality_check
USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = 'XSMALL'
AFTER dag_transform
AS
CALL quality_check_sp('analytics.transformed');
-- DAGの起動(ルートからRESUME)
ALTER TASK dag_quality_check RESUME;
ALTER TASK dag_transform RESUME;
ALTER TASK dag_root RESUME;Serverless Tasksを使用するには、タスクの所有ロールに対して アカウントレベルのEXECUTE MANAGED TASK権限を付与する必要があります。 User-managed TasksのUSAGE ON WAREHOUSE権限とは異なる権限体系です。
-- Serverless Task用の権限付与
GRANT EXECUTE MANAGED TASK ON ACCOUNT
TO ROLE etl_role;
-- タスク作成権限(Serverless/User-managed共通)
GRANT CREATE TASK ON SCHEMA analytics
TO ROLE etl_role;
-- User-managed Taskの場合はウェアハウス権限が必要
GRANT USAGE ON WAREHOUSE etl_warehouse
TO ROLE etl_role;Serverless Tasksのコスト履歴はSNOWFLAKE.ACCOUNT_USAGE.SERVERLESS_TASK_HISTORYビューで確認できます。 User-managed TasksのコストはWAREHOUSE_METERING_HISTORYから確認します。
-- Serverless Taskのクレジット消費を日別に集計
SELECT
DATE_TRUNC('DAY', START_TIME) AS exec_date,
TASK_NAME,
COUNT(*) AS exec_count,
SUM(CREDITS_USED) AS total_credits
FROM SNOWFLAKE.ACCOUNT_USAGE.SERVERLESS_TASK_HISTORY
WHERE START_TIME >= DATEADD('DAY', -30, CURRENT_TIMESTAMP())
GROUP BY exec_date, TASK_NAME
ORDER BY total_credits DESC;
-- タスクの実行履歴を確認
SELECT *
FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(
TASK_NAME => 'ETL_DAILY_AGGREGATE',
SCHEDULED_TIME_RANGE_START => DATEADD('DAY', -7, CURRENT_TIMESTAMP())
))
ORDER BY SCHEDULED_TIME DESC;タスクが失敗した場合はALERT機能やNotification Integrationと組み合わせて検知します。 TASK_HISTORYのSTATE列が'FAILED'の場合にERROR_MESSAGEから原因を特定します。
-- 直近の失敗タスクを抽出
SELECT
NAME,
SCHEDULED_TIME,
STATE,
ERROR_CODE,
ERROR_MESSAGE
FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(
RESULT_LIMIT => 100
))
WHERE STATE = 'FAILED'
ORDER BY SCHEDULED_TIME DESC;SnowPro
問題 1
Serverless Taskを作成する際、正しいSQL構文はどれですか?
正解: B
Serverless TaskではWAREHOUSE句を省略し、USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZEパラメータで初期コンピュートサイズを指定します。AのようにWAREHOUSEとUSER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZEを同時に指定することはできません。SERVERLESS = TRUEやCOMPUTE_POOLは存在しないパラメータです。
Serverless TasksのコストはUser-managed Tasksと比べて高いですか?
Serverless Tasksは1.5倍のServerless Credit倍率が適用されますが、ウェアハウスの待機コスト(アイドル時間や起動の最低1分課金)が不要です。タスクの実行頻度が低い場合(例:1時間に1回、実行時間10秒程度)はServerlessの方がトータルコストが低くなるケースが多く、反対に常時バッチが走り続けるパイプラインではUser-managedの方が有利です。SERVERLESS_TASK_HISTORYビューでクレジット消費を確認し判断します。
USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZEはどのサイズを選べばよいですか?
このパラメータはServerless Taskが初回実行時に使用するコンピュートサイズの目安です。XSMALL〜XXLARGEを指定でき、Snowflakeはその後の実行履歴に基づいてサイズを自動調整します。初期値は処理対象のデータ量で決めるのが基本で、数百万行以下のINSERT/MERGEならXSMALL〜SMALL、数十億行規模のGROUP BY集計ならMEDIUM〜LARGEが目安です。
Serverless Tasksでタスクツリー(DAG)は使えますか?
はい。Serverless Tasksでも通常のタスクと同様にAFTERキーワードで親子関係を定義してDAGを構築できます。ルートタスクをServerlessにし、子タスクもServerlessまたはUser-managedで混在させることが可能です。ルートタスクにSCHEDULEを設定し、ALTER TASK ... RESUMEで起動する点はUser-managed Tasksと同じです。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Snowflake資格一覧|全11試験(SnowPro)の難易度・費用
Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...
Snowflake試験の難易度ランキング|全11資格を徹底比較
Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...
Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ
Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...
SnowPro Core試験完全解説|出題範囲・問題例・合格戦略
SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...
SnowPro Platform Associate完全解説|入門試験の攻略
SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...