タスクの紹介¶
タスクを使用して、データパイプラインのビジネスプロシージャを自動化、スケジュール、および最適化します。
Snowflake では、 SQL、 JavaScript、Python、Java、Scala、または Snowflake Scripting などサポートされている言語とツール を使用して、タスクがストアドプロシージャの呼び出しを実行できます。Python の例については、 PythonによるSnowflakeタスクとタスクグラフの管理 をご参照ください。
タスクグラフ を作成することで、一連のタスクを組み合わせることができます。タスクグラフはロジックを使って動的な動作を行うことができ、タスクを並列に実行したり、順番に実行したりすることができます。
注釈
テーブルスキーマの進化 はタスクでサポートされていません。
このトピックの内容:
タスク作成ワークフローの概要¶
以下の手順でコマンドを実行できる タスク管理者ロール を作成します。
CREATE TASK を使って新しいタスクを定義します。
EXECUTE TASK を使ってタスクを手動でテストします。
ALTER TASK ... RESUME を使ってタスクを連続実行できるようにします。
ALTER TASK を使って、必要に応じてタスクを絞り込みます。
タスクの実行に関する情報は、こちらをご参照ください。
コンピュートリソースの割り当て¶
タスクは、 SQL、Python、Java、Scala 関数、およびストアドプロシージャを実行するためのコンピュートリソースを必要とします。各タスクについて、Snowflakeにリソースを管理させるか サーバーレスタスク を作成して、または ユーザー管理型仮想ウェアハウスモデル を使用して自分で管理するかを選択できます。
サーバーレスタスク¶
このモデルでは、タスクはSnowflakeが管理するコンピュート上で実行されます。Snowflakeは、各ワークロードに必要なリソースのサイズを自動的に変更します。Snowflakeは、同じタスクの直近の実行に関する統計の動的分析に基づいて、指定された実行に最適なコンピュートリソースのサイズを決定します。
このモデルは、以下のような定期的または準定期的に実行されるタスクにお勧めします。
常に同じ時間に開始するタスク。
新しいデータが到着したときにのみ実行されるタスク。詳細については、 トリガーされるタスク をご参照ください。
制限事項¶
サーバーレス・コンピュート・モデルを使ったタスクの作成¶
CREATE TASK または ALTER TASK を使用する場合は、 WAREHOUSE パラメーターを省略します。
タスクを実行するロールは、グローバル EXECUTE MANAGED TASK 権限を持っている必要があります。タスクのアクセス制御要件の詳細については、 タスクセキュリティ をご参照ください。
以下のパラメーターをセットすることで、サーバーレスタスクのコストとパフォーマンスをある程度コントロールすることができます。
SERVERLESS_TASK_MAX_STATEMENT_SIZE:想定外のコストを防ぐため、ウェアハウスの最大サイズを設定します。
SERVERLESS_TASK_MIN_STATEMENT_SIZE:予測可能なパフォーマンスのためのウェアハウスの最小サイズ。
TARGET_COMPLETION_INTERVAL: タスクが実行されるウィンドウ。
Snowflakeがサーバーレスのコンピュートリソースを推定する方法¶
Snowflakeは、ターゲット時間枠と以前のタスク実行のパフォーマンスに基づいて、タスクを完了するために必要な計算リソースを自動的に推定します。
TARGET_COMPLETION_INTERVAL を使ってターゲットタイムフレームをセットできます。この値がセットされていない場合、Snowflakeはサーバーレスのコンピュートリソースのサイズを変更して、次の実行スケジュール時刻までに完了するようにします。
タスクが完了すると、Snowflakeは必要な計算リソースを次のように見積もります。
例¶
例1: 1時間ごとに実行するサーバーレスタスクを作成します。Snowflakeは、スケジュール時間内にタスクを完了できると推定されるサーバーレスコンピュートリソースを割り当てます。
CREATE TASK SCHEDULED_T1
SCHEDULE='60 MINUTES'
AS SELECT 1;
from datetime import timedelta
from snowflake.core.task import Cron, Task
tasks = root.databases["TEST_DB"].schemas["TEST_SCHEMA"].tasks
task = tasks.create(
Task(
name="SCHEDULED_T1",
definition="SELECT 1",
schedule=timedelta(minutes=60),),
),
)
例2: 毎日、午前0時から2時間実行するサーバーレスタスクを作成します。スケジュール (CRON を使用)は、タイムゾーンを含め、タスクの開始時間を定義します。ターゲット完了間隔はタスクがいつ完了するかを定義します。Snowflakeは、タスクがスケジュール時間内に完了するようにサーバーレスコンピュートを見積もって割り当てます。
CREATE TASK SCHEDULED_T2
SCHEDULE='USING CRON 0 * * * * America/Los_Angeles'
TARGET_COMPLETION_INTERVAL='120 MINUTE'
SERVERLESS_TASK_MAX_STATEMENT_SIZE='LARGE'
AS SELECT 1;
from datetime import timedelta
from snowflake.core.task import Cron, Task
tasks = root.databases["TEST_DB"].schemas["TEST_SCHEMA"].tasks
task = tasks.create(
Task(
name="SCHEDULED_T2",
definition="SELECT 1",
schedule=Cron("0 * * * *", "America/Los_Angeles"),
target_completion_interval=timedelta(minutes=120),
serverless_task_max_statement_size="LARGE",
),
)
例3: ターゲット完了間隔と最小・最大ウェアハウスサイズの範囲内で、1日1回スケジュールされるサーバーレスタスクを作成します。
CREATE TASK SCHEDULED_T3
SCHEDULE='USING CRON 0 0 * * * UTC'
TARGET_COMPLETION_INTERVAL='180 M'
SERVERLESS_TASK_MIN_STATEMENT_SIZE='MEDIUM'
SERVERLESS_TASK_MAX_STATEMENT_SIZE='LARGE'
AS SELECT 1;
from datetime import timedelta
from snowflake.core.task import Cron, Task
tasks = root.databases["TEST_DB"].schemas["TEST_SCHEMA"].tasks
task = tasks.create(
Task(
name="SCHEDULED_T3",
definition="SELECT 1",
schedule=Cron("0 0 * * *", "UTC"),
target_completion_interval=timedelta(minutes=180),
serverless_task_min_statement_size="MEDIUM",
serverless_task_max_statement_size="LARGE",
),
)
この構成では、サーバーレスタスクは少なくとも中規模ウェアハウスで1日1回深夜に実行され、 TARGET_COMPLETION_INTERVAL は3時間です。Snowflakeは、 SERVERLESS_TASK_MAX_STATEMENT_SIZE に達するまで、タスクの実行が指定された TARGET_COMPLETION_INTERVAL 内で完了するように、サーバーレスコンピュートのサイズを自動的に調整します。
例4: 完了間隔をターゲットとせずに、10秒ごとに実行するようにスケジュールされたサーバーレスタスクを作成します。
CREATE TASK SCHEDULED_T4
SCHEDULE='10 SECONDS'
SERVERLESS_TASK_MAX_STATEMENT_SIZE='LARGE'
AS SELECT 1;
from datetime import timedelta
from snowflake.core.task import Cron, Task
tasks = root.databases["TEST_DB"].schemas["TEST_SCHEMA"].tasks
task = tasks.create(
Task(
name="SCHEDULED_T4",
definition="SELECT 1",
schedule=timedelta(seconds=10),
serverless_task_max_statement_size="LARGE",
),
)
この構成では、サーバーレスタスクは10秒ごとに実行されます。一連のタスク実行時間が次のスケジュール時間までに完了しない場合、Snowflakeは自動的にサーバーレスコンピュートサイズを設定し、 SERVERLESS_TASK_MAX_STATEMENT_SIZE に達するまで指定された SCHEDULE 内でタスク実行が完了するようにします。
パラメーターと構文の詳細については、 CREATE TASK と ALTER TASK をご参照ください。
ユーザー管理型仮想ウェアハウスモデル¶
このモデルでは、各ワークロードに使用されるコンピュートリソースを完全に制御できます。
このモデルは、コンピュートリソースの予測不可能な負荷を手動で管理したい場合に推奨されます。 マルチ・クラスタ・ウェアハウス 自動サスペンドおよび自動再開 を有効にすると、クレジット消費を抑えることもできます。
ウェアハウスのサイズの選択¶
既存のウェアハウスを使用して個々のタスクにコンピューティングリソースを提供することを選択する場合は、 ウェアハウスに関する考慮事項 で説明されているベストプラクティスに従ってください。タスクに必要なコンピューティングクラスタを理解するには、ウェアハウスのサイズとクラスタリングに基づいて異なるウェアハウスを使用して、単一のタスクまたは タスクグラフ の平均実行時間を分析します。ウェアハウスが複数のプロセスで共有されているかどうかも考慮する必要があります。詳細については、 タスク期間 をご参照ください。
コンピューティングモデルの選択に関する推奨事項¶
次のテーブルでは、サーバーレスタスクとユーザー管理タスクのどちらを使用するかを決定するために役立つ、さまざまな要因について説明します。
カテゴリ |
サーバーレスタスク |
ユーザー管理のタスク |
注意 |
---|---|---|---|
同時タスクワークロードの数、期間、および予測可能性 |
同時に実行されるタスクが少なすぎたり、短時間で完了するような、十分に活用されていないウェアハウスにお勧めです。 実行が比較的安定しているタスクは、サーバーレスタスクに適しています。 |
複数のタスクが同時進行するフル稼働のウェアハウスにお勧めです。 また、コンピューティングリソースの予測不可能な負荷にも推奨されます。 自動中断と自動再開 を有効にした マルチクラスターウェアハウス は、クレジットの消費を抑えるために役立ちます。 |
サーバーレスタスクの場合、Snowflakeは実際のコンピューティングリソースの使用量に基づいてアカウントに請求します。 ユーザー管理タスクの場合、ウェアハウスの請求はウェアハウスのサイズに基づいており、ウェアハウスが再開されるたびに最低60秒の請求があります。 |
スケジュール間隔 |
スケジュール間隔の順守が非常に重要な場合に推奨されます。 スタンドアロンタスクまたはスケジュールされたタスクグラフの実行が間隔を超えると、Snowflakeは計算リソースのサイズを増やします。 |
スケジュール間隔の順守がそれほど重要でない場合に推奨されます。 |
スケジュール間隔 は、スタンドアロンタスクまたはタスクグラフ内にあるルートタスクのスケジュールされた実行間における時間間隔を指します。 コンピューティングリソースを増加すると、一部(すべてではなく)の SQL コードの実行時間が短縮される可能性がありますが、バッチウィンドウ内でタスクの実行を確実に完了するとは限りません。 |
サーバーレスタスク実行の最大サイズは、 XXLARGE ウェアハウスに相当します。タスクのワークロードでより大きなウェアハウスが必要な場合は、必要なサイズのウェアハウスを持つユーザー管理タスクを作成します。
スケジュールやトリガーの定義¶
タスクは固定スケジュールで実行するようにセットすることもできますし、ストリームに新しいデータが入った時などのイベントによってトリガーすることもできます。
注: スケジュールやトリガーが定義されていても、タスクはサスペンド状態で開始します。後で、 EXECUTE TASK を使ってタスクを1回だけ開始することも、 ALTER TASK ... RESUME を使って継続的に実行させることもできます。
固定スケジュールでのタスク実行¶
固定スケジュールでタスクを実行するには、 CREATE TASK または ALTER TASK を使ってタスクを作成または変更する際にスケジュールを定義するか、 Snowsight で SCHEDULE パラメーターを使ってタスクを編集します。
Snowflakeは スケジュールのタスクのうち1つのインスタンスのみが一度に実行されるようにします。次のスケジュールされた実行時間が発生したときにタスクがまだ実行されている場合、そのスケジュールされた時間はスキップされます。
次の例では、10秒ごとに実行するタスクを作成します。
CREATE TASK task_runs_every_10_seconds
SCHEDULE='10 SECONDS'
AS SELECT 1;
特定の時間や曜日をベースにスケジュールを定義するには、 SCHEDULE ='USING CRON...' パラメーターを使用します。
次の例では、アメリカ/ロサンゼルス時間帯を使用して、毎週日曜日の午前3時に実行するタスクを作成します。
CREATE TASK task_sunday_3_am_pacific_time_zone
SCHEDULE='USING CRON 0 3 * * SUN America/Los_Angeles'
AS SELECT 1;
詳細については、 CREATE TASK ... SCHEDULE をご参照ください。
ストリームに新しいデータがあるたびにタスクを実行¶
トリガーされるタスク を使用して、定義された ストリーム に、Extract、Load、Transform(ELT)などの新しいデータが発生するたびに、タスクを実行します。これにより、新しいデータの可用性が予測できない場合に、ソースを頻繁にポーリングする必要がなくなります。また、データが即座に処理されるため、待ち時間も短縮されます。例:
CREATE TASK triggered_task_stream
WHEN SYSTEM$STREAM_HAS_DATA('orders_stream')
AS
INSERT INTO completed_promotions
SELECT order_id, order_total, order_time, promotion_id
FROM orders_stream;
詳細については、 トリガーされるタスク をご参照ください。
ストリームに新しいデータがある場合のみ、スケジュールに従って実行。¶
スケジュールタスクとトリガータスクを組み合わせることができます。たとえば、ストリームに新しいデータがある場合にのみ、1時間ごとにタスクを実行するようにセットできます。例:
CREATE TASK triggered_task_stream
SCHEDULE = '1 HOUR'
WHEN SYSTEM$STREAM_HAS_DATA('orders_stream')
AS SELECT 1;
タスクが失敗した場合の定義¶
失敗した実行後のタスクの自動中断¶
必要に応じて、指定された数の連続したタスクの実行が失敗するかタイムアウトになると、タスクを自動的に中断します。この機能は、Snowflakeクレジットを消費するタスクを中断することでコストを削減しますが、タスクは完了しません。
タスクに SUSPEND_TASK_AFTER_NUM_FAILURES = num
パラメーターを設定します。パラメーターが 0
より大きい値に設定されると、タスクは指定された数の連続したタスクの実行が失敗するかタイムアウトになると、自動的に中断します。
CREATE TASK を使用してタスクの作成時に、または ALTER TASK を使用して後から、このパラメーターを定義できます。この値は Snowsight でも変更できます。
SUSPEND_TASK_AFTER_NUM_FAILURES パラメータは、アカウント、データベース、およびスキーマレベルでも設定できます。この設定は、変更されたオブジェクト内のすべてのタスクに適用されます。パラメーターをより低いレベルで明示的に設定すると、より高いレベルで設定されたパラメーター値が上書きされることに注意してください。
失敗したタスクの実行を自動的に再試行¶
タスクがFAILEDの状態で完了した場合、Snowflakeは自動的にタスクを再試行できます。タスクの自動再試行はデフォルトでは無効になっています。この機能を有効にするには、TASK_AUTO_RETRY_ATTEMPTSを0より大きい値に設定します。
エラー通知を使用するタスクは、再試行が失敗するたびに通知を送信します。詳細については、 エラー通知を送信するタスクの構成 をご参照ください。
アカウント、データベース、またはスキーマレベルで TASK_AUTO_RETRY_ATTEMPTS パラメーター値を明示的に設定すると、その変更は、次のスケジュールされた実行時に、変更されたオブジェクト内のタスクに適用されます(進行中の実行のすべての子タスクを含む)。
追加セッションパラメーターの定義¶
タスクは、すべてのセッションパラメーターをサポートします。完全なリストについては、 パラメーター をご参照ください。タスクはアカウントやユーザーパラメーターをサポートしていません。
タスクにセッションパラメーターをセットするには、 CREATE TASK でタスク定義にパラメーターを追加するか、 ALTER TASK ... SET でタスクを修正します。例:
CREATE TASK my_task
SCHEDULE = 'USING CRON 0 * * * * UTC'
TIMESTAMP_INPUT_FORMAT = 'YYYY-MM-DD HH24'
USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = 'XSMALL'
AS
INSERT INTO mytable(ts) VALUES(CURRENT_TIMESTAMP);
ALTER TASK my_task
SET USER_TASK_TIMEOUT_MS = 10000 -- Changes maximum runtime to 10 seconds
タスクの実行¶
このセクションでは、タスクのスケジュールと実行の異なる方法と、タスクのバージョンがどのように決定されるかについて説明します。
タスクを手動で実行¶
CREATE TASK または ALTER TASK を使って新しいタスクとそのパラメーターをセットアップした後、 EXECUTE TASK を使ってタスクのシングルランを開始することができます。このコマンドは、新しいタスクや変更されたタスクをテストするのに便利です。
注釈
このSQLコマンドは、スクリプトまたはストアドプロシージャで直接呼び出すことができます。
このコマンドは外部データパイプラインのタスク統合をサポートします。
Snowflake アカウントに認証でログインし、 SQL アクションを承認できるサードパーティサービスであれば、 EXECUTE TASK コマンドでタスクを実行できます。
タスク実行のバージョニング¶
内のスタンドアロンタスクが最初に再開されると、タスクの初期バージョンが設定されます。スタンドアロンタスクは、このバージョンを使用して実行されます。タスクが中断および変更された後、スタンドアロンタスクが再開されるか、手動で実行されると、新しいバージョンが設定されます。
タスクが中断されると、今後スケジュールされるタスクの実行はすべてキャンセルされます。現在実行中のタスクは現在のバージョンを使用して実行され続けます。
例えば、タスクが中断されているが、このタスクのスケジュールされた実行がすでに開始されているとします。タスクの所有者は、タスクの実行中に、タスクによって呼び出されたSQLコードを変更します。タスクが実行され、タスクが実行を開始したときに最新だったバージョンのタスクを使用して、定義内の SQL コードが実行されます。タスクが再開されるか、手動で実行されると、タスクの新しいバージョンが設定されます。この新しいバージョンには、タスクへの変更が含まれています。
タスクバージョンの履歴を取得するには、 TASK_VERSIONS Account Usageビュー (SNOWFLAKE 共有データベース内)をクエリします。
アカウントのタスク履歴を表示する¶
SQL または Snowsight を使用して、アカウントのタスク履歴を表示できます。 Snowsight でタスク履歴を表示するには、 Snowsight でタスクとタスクグラフを表示する をご参照ください。必要な権限については、 タスク履歴の表示 をご参照ください。
単一のタスクの実行履歴を表示するには、
- SQL:
TASK_HISTORY テーブル関数( Snowflake Information Schema 内)をクエリします。
現在スケジュールまたは実行されているタスクグラフ実行の詳細を表示するには、次を実行します。
- SQL:
CURRENT_TASK_GRAPHS テーブル関数( Snowflake Information Schema 内)をクエリします。
過去60分間に正常に実行された、失敗した、またはキャンセルされたタスクグラフの実行の履歴を表示するには、次を実行します。
- SQL:
COMPLETE_TASK_GRAPHS テーブル関数( Snowflake Information Schema 内)をクエリします。
COMPLETE_TASK_GRAPHS ビュー ビュー(Account Usage 内)をクエリします。
タスクのコスト¶
SQL コードを実行するためのタスク実行に関連するコストは、タスクのコンピューティングリソースのソースによって異なります。
- ユーザー管理のウェアハウス
Snowflakeは、タスク実行中のウェアハウスの使用量に基づいて、アカウントに クレジット使用状況 を請求します。これは、クライアントまたはSnowflakeウェブインターフェイスで、同じ SQL ステートメントを実行する際のウェアハウスの使用量と類似しています。秒あたりのクレジット請求と自動一時停止により、より大きなウェアハウスサイズから始めて、ワークロードに合わせてサイズを調整する柔軟性が得られます。
- サーバーレスコンピューティングモデル
Snowflakeは、コンピューティングリソースの使用量に基づいてアカウントに課金します。料金は、 コンピューティング時間 のクレジット使用状況で測定されたリソースの合計使用状況(クラウドサービスの使用状況を含む)に基づいて計算されます。計算時間はウェアハウスのサイズとクエリの実行時間によって変わります。詳細については、 サーバーレスのクレジット使用状況 または クエリ: サーバーレスタスクの総コスト をご参照ください。
Snowflakeはタスク履歴のタスク実行を分析し、サーバーレスのコンピューティングリソースの適切なサイズと数を動的に決定します。タスク実行を管理するためにSnowflakeが自動的にリソースを増減させると、タスク実行にかかるコストも比例して増減します。
タスクにより消費されたクレジット量を知る方法については、 Snowflakeサービス利用テーブル の「サーバーレス機能クレジットテーブル」をご参照ください。
タスクを作成する際にコストを最適化するために、以下のベストプラクティスを検討してください:
SCHEDULE、運転頻度を少なく設定してください。
自動サスペンドと自動再試行のパラメーターを使用して、失敗したタスクによるリソースの浪費を防ぎます。
データストリームに新しいデータが入ったときなど、特定の条件下でのみ実行する必要があるタスクのために、 トリガーされるタスク をセットします。
サーバーレス機能の予算と支出制限のアラートを作成します。詳細については、 Budgetsを使用したクレジット使用状況のモニター をご参照ください。
特定のタスクに対する現在のクレジット使用状況を取得するには、 SERVERLESS_TASK_HISTORY テーブル関数をクエリします。
<database_name>
はタスクを含むデータベース、<task_name>
はタスクの名前です。SET num_credits = (SELECT SUM(credits_used) FROM TABLE(<database_name>.information_schema.serverless_task_history( date_range_start=>dateadd(D, -1, current_timestamp()), date_range_end=>dateadd(D, 1, current_timestamp()), task_name => '<task_name>') ) );
すべてのサーバーレスタスクに対する現在のクレジット使用状況を取得するには、 SERVERLESS_TASK_HISTORY ビューをクエリします。アカウント管理者として、次のステートメントを実行します。
SELECT start_time, end_time, task_id, task_name, credits_used, schema_id, schema_name, database_id, database_name FROM snowflake.account_usage.serverless_task_history ORDER BY start_time, task_id;
コストのモニター¶
サーバーレスタスクは、使用時に コンピュートコスト が発生します。ACCOUNT_USAGE および ORGANIZATION_USAGE スキーマのコスト関連ビューを使用して、サーバーレスタスクに関連するコストを追跡できます。これらのビューをクエリする際は、 service_type
列をフィルターして、 SERVERLESS_TASK
または SERVERLESS_TASK_FLEX
の値を検索します。
ビュー |
スキーマ |
|
必要な権限を持つロール |
---|---|---|---|
ACCOUNT_USAGE |
SERVERLESS_TASK |
ACCOUNTADMIN ロール USAGE_VIEWER データベースロール |
|
ACCOUNT_USAGE |
SERVERLESS_TASK |
ACCOUNTADMIN ロール USAGE_VIEWER データベースロール |
|
ORGANIZATION_USAGE |
SERVERLESS_TASK |
ACCOUNTADMIN ロール USAGE_VIEWER データベースロール |
|
ORGANIZATION_USAGE |
SERVERLESS_TASK |
ORGADMIN ロール GLOBALORGADMIN ロール ORGANIZATION_USAGE_VIEWER データベースロール |
例: サーバーレスタスクが組織全体で負担したアカウントコストの合計を表示します。
例; サーバーレスタスクが2024年12月1日から2024年12月31日の間に発生したアカウントコストの合計を表示します。
SELECT
name,
SUM(credits_used_compute) AS total_credits
FROM
SNOWFLAKE.ACCOUNT_USAGE.METERING_HISTORY
WHERE
service_type ILIKE '%SERVERLESS_TASK%'
AND start_time >= '2024-12-01'
AND end_time <= '2024-12-31'
GROUP BY
name
ORDER BY
name ASC;
例: サーバーレスタスクが組織全体で負担したアカウントコストの合計を表示します。
SELECT
usage_date AS date,
account_name,
SUM(usage) AS credits,
currency,
SUM(usage_in_currency) AS usage_in_currency
FROM
SNOWFLAKE.ORGANIZATION_USAGE.USAGE_IN_CURRENCY_DAILY
WHERE
USAGE_TYPE ILIKE '%SERVERLESS_TASK%'
GROUP BY
usage_date, account_name, currency
ORDER BY
USAGE_DATE DESC;
Trust Centerの運用のために1コンピュート時間あたり何クレジットが課金されるかの情報については、 Snowflake Service Consumption Table のテーブル5をご参照ください。
タスク期間¶
タスク期間には、タスクの開始スケジュールから実行完了までの時間が含まれます。この期間には以下の両方が含まれます。
キューイング時間: タスクが実行を開始する前に計算リソースが利用可能になるのを待つ時間。キュー時間を計算するには、 TASK_HISTORY ビュー にクエリを発行し、 SCHEDULED_TIME と QUERY_START_TIME を比較します。
実行時間: タスクが SQL ステートメントやその他のオペレーションを実行するのにかかる時間。実行時間を計算するには、 TASK_HISTORY ビュー をクエリし、 QUERY_START_TIME と COMPLETED_TIME を比較します。
たとえば、次の図は15秒ごとに実行するようにスケジュールされたサーバーレスタスクを示しています。このタスクの実行時間は合計12秒で、キューイング時間5秒と実行時間7秒を含みます。
タイムアウト¶
タスクの実行がスケジュール時間またはターゲット完了間隔を超えた場合、デフォルトでは、タスクは完了するまで実行され続けるか、タイムアウトするか、失敗します。
STATEMENT_TIMEOUT_IN_SECONDS と label-user_task_timeout_ms
の両方がセットされている場合、タイムアウトは2つのパラメーターのうち 最も小さい 非ゼロ値になります。
STATEMENT_QUEUED_TIMEOUT_IN_SECONDS と USER_TASK_TIMEOUT_MS の両方が設定されている場合、 USER_TASK_TIMEOUT_MS の値が優先されます。
タスクグラフのタイムアウトに関する情報は、 タスクグラフのタイムアウト をご参照ください。
考慮事項¶
サーバーレスタスクの場合、Snowflakeは自動的にリソースをスケーリングし、キュー時間を含むターゲット完了間隔内でタスクが完了するようにします。
ユーザー管理タスクの場合、共有ウェアハウスや混雑しているウェアハウスでタスクが実行されるスケジュールでは、キュー期間が長くなるのが一般的です。
タスクセキュリティ¶
タスクを開始するには、適切なアクセス権限が必要です。このセクションでは、タスクへのアクセスを管理する方法について説明します。
タスクグラフの所有権については、 タスクグラフの所有権の管理 をご参照ください。
アクセス制御権限¶
タスクの作成¶
タスクを作成するには、少なくとも次の権限を持つロールが必要です。
オブジェクト |
権限 |
注意 |
---|---|---|
アカウント |
EXECUTE MANAGED TASK |
サーバーレスコンピューティングリソースに依存するタスクにのみ必要です。 |
データベース |
USAGE |
|
スキーマ |
USAGE, CREATE TASK |
|
ウェアハウス |
USAGE |
ユーザー管理のウェアハウスに依存するタスクにのみ必要です。 |
タスクの実行¶
タスクが作成された後、タスク所有者はタスクを実行するために次の権限を持つ必要があります。
オブジェクト |
権限 |
注意 |
---|---|---|
アカウント |
EXECUTE TASK |
ロールが所有するタスクを実行するために必要です。ロールの EXECUTE TASK 権限を取り消すと、それ以降、すべてのタスクの実行はそのロールで開始できなくなります。 |
アカウント |
EXECUTE MANAGED TASK |
サーバーレスコンピューティングリソースに依存するタスクにのみ必要です。 |
データベース |
USAGE |
|
スキーマ |
USAGE |
|
タスク |
USAGE |
|
ウェアハウス |
USAGE |
ユーザー管理のウェアハウスに依存するタスクにのみ必要です。 |
またロールは、タスクによって実行される SQL ステートメントの実行に必要な権限を持っている必要があります。
タスク履歴の表示¶
タスクを表示するには、以下の権限を1つ以上持っている必要があります。
ACCOUNTADMINロール。
タスクに対する OWNERSHIP 権限。
MONITOR EXECUTION グローバル権限。
タスクの再開または中断¶
タスクの所有者に加えて、タスクに対するOPERATE権限を持つロールは、タスクを一時停止または再開できます。このロールには、タスクを含むデータベースとスキーマに対するUSAGE権限が必要です。他の権限は必要ありません。
タスクが再開されると、Snowflakeは、タスクの所有者のロールが タスクの実行 にリストされている権限を持っていることを確認します。
タスクの権限を管理するためのカスタムロールの作成¶
カスタムロールを使用すると、Snowflakeの各アカウントまたはロールに付与された権限を簡単に管理できます。カスタムロールを使用するすべてのアカウントまたはロールの権限を変更するには、カスタムロールを更新します。または、カスタムロールを削除することで権限を取り消します。
タスクを作成するカスタムロールの作成¶
Snowflakeは、サーバーレスタスクとユーザー管理タスクを作成するために異なる権限を必要とします。
例えば、ユーザが管理するタスクを作成するには、 warehouse_task_creation
というカスタムロールを作成し、そのロールがタスクを作成できるウェアハウスで、 CREATE TASK と USAGE 権限をそのロールに付与します。
USE SYSADMIN;
CREATE ROLE warehouse_task_creation
COMMENT = 'This role can create user-managed tasks.';
from snowflake.core.role import Role
root.session.use_role("SYSADMIN")
my_role = Role(
name="warehouse_task_creation",
comment="This role can create user-managed tasks."
)
root.roles.create(my_role)
USE ACCOUNTADMIN;
GRANT CREATE TASK
ON SCHEMA schema1
TO ROLE warehouse_task_creation;
from snowflake.core.role import Securable
root.session.use_role("ACCOUNTADMIN")
root.roles['warehouse_task_creation'].grant_privileges(
privileges=["CREATE TASK"], securable_type="schema", securable=Securable(name='schema1')
)
GRANT USAGE
ON WAREHOUSE warehouse1
TO ROLE warehouse_task_creation;
from snowflake.core.role import Securable
root.roles['warehouse_task_creation'].grant_privileges(
privileges=["USAGE"], securable_type="warehouse", securable=Securable(name='warehouse1')
)
サーバーレスタスクを作成できるロールの例として、 serverless_task_creation
というカスタムロールを作成し、そのロールに CREATE TASK 権限とアカウントレベル EXECUTE MANAGED TASK 権限を付与します。
USE SYSADMIN;
CREATE ROLE serverless_task_creation
COMMENT = 'This role can create serverless tasks.';
from snowflake.core.role import Role
root.session.use_role("SYSADMIN")
my_role = Role(
name="serverless_task_creation",
comment="This role can create serverless tasks."
)
root.roles.create(my_role)
USE ACCOUNTADMIN;
GRANT CREATE TASK
ON SCHEMA schema1
TO ROLE serverless_task_creation;
from snowflake.core.role import Securable
root.session.use_role("ACCOUNTADMIN")
root.roles['serverless_task_creation'].grant_privileges(
privileges=["CREATE TASK"], securable_type="schema", securable=Securable(name='schema1')
)
GRANT EXECUTE MANAGED TASK ON ACCOUNT
TO ROLE serverless_task_creation;
root.roles['serverless_task_creation'].grant_privileges(
privileges=["EXECUTE MANAGED TASK"], securable_type="account"
)
タスクを管理するカスタムロールの作成¶
カスタムロールを作成し、 EXECUTE TASK 権限を付与し、このカスタムロールをタスク所有者ロールに付与して、自分のタスクを変更できるようにします。タスク所有者ロールがタスクを実行する機能を削除するには、このカスタムロールをタスク所有者ロールから取り消します。
たとえば、カスタムロール名 taskadmin
を作成し、そのロールに EXECUTE TASK 権限を付与します。 myrole
という名前のタスク所有者ロールに taskadmin
ロールを割り当てます。
USE ROLE securityadmin;
CREATE ROLE taskadmin;
from snowflake.core.role import Role
root.session.use_role("securityadmin")
root.roles.create(Role(name="taskadmin"))
新しいロールにアカウントレベルの権限を付与する前に、アクティブなロールをACCOUNTADMINに設定します。
USE ROLE accountadmin;
GRANT EXECUTE TASK, EXECUTE MANAGED TASK ON ACCOUNT TO ROLE taskadmin;
root.session.use_role("accountadmin")
root.roles['taskadmin'].grant_privileges(
privileges=["EXECUTE TASK", "EXECUTE MANAGED TASK"], securable_type="account"
)
このロールが他のロールにロールを付与できることを示すために、アクティブなロールをSECURITYADMINに設定します。
USE ROLE securityadmin;
GRANT ROLE taskadmin TO ROLE myrole;
from snowflake.core.role import Securable
root.session.use_role("securityadmin")
root.roles['myrole'].grant_role(role_type="ROLE", role=Securable(name='taskadmin'))
カスタムロールとロール階層の作成の詳細については、 アクセス制御の構成 をご参照ください。
タスク所有者ロールのドロップ¶
タスクの所有者ロールをドロップすると、タスクは所有者ロールをドロップしたロールに所有権を移します。タスクの所有権が移ると、タスクは自動的に一時停止され、新しい所有者がタスクを再開するまで新しい実行はスケジュールされません。
タスクの実行中にロールを削除すると、タスクの実行はドロップされたロールの下で完了します。
システムサービスタスクの実行¶
Snowflakeは、タスク所有者の権限でタスクを実行しますが、タスクの実行はユーザーに関連付けられていません。代わりに、各実行はシステムサービスによって実行されます。タスクは特定のユーザーから切り離され、ユーザーのドロップ、認証の問題が原因によるロック、ロールの削除などにより発生する可能性のある複雑さを回避します。
タスクの実行はユーザーから切り離されているため、タスクの実行のクエリ履歴はシステムサービスに関連付けられています。そのため、このサービスにはユーザー認証情報がなく、いかなる個人もそのIDを引き受けることはできません。システムサービスのアクティビティはアカウントに制限されています。他の操作に適用されるのと同じ暗号化保護および他のセキュリティプロトコルがこのサービスに組み込まれています。
タスク DDL¶
タスクの作成と管理をサポートするために、Snowflakeは以下の特別な DDL 操作セットを提供します。
さらに、プロバイダーは、次の標準アクセス制御 DDL を使用して、ELT に必要なデータベースオブジェクトへのアクセスを表示、許可、または取り消すことができます。
DatabaseRoleResource メソッド:
grant_future_privileges
grant_privileges
grant_privileges_on_all
grant_role
iter_future_grants_to
iter_grants_to
revoke_future_privileges
revoke_grant_option_for_future_privileges
revoke_grant_option_for_privileges
revoke_grant_option_for_privileges_on_all
revoke_privileges
revoke_privileges_on_all
revoke_role
RoleResource (アカウントロール) メソッドを使用します:
grant_future_privileges
grant_privileges
grant_privileges_on_all
grant_role
iter_future_grants_to
iter_grants_of
iter_grants_on
iter_grants_to
revoke_future_privileges
revoke_grant_option_for_future_privileges
revoke_grant_option_for_privileges
revoke_grant_option_for_privileges_on_all
revoke_privileges
revoke_privileges_on_all
revoke_role
UserResource メソッド:
grant_role
iter_grants_to
revoke_role
タスク関数¶
タスクに関する情報の取得をサポートするために、Snowflakeは次の関数のセットを提供します。