タスクの紹介¶
タスクは、データ処理を自動化し、データパイプラインのビジネスプロシージャを最適化する強力な方法です。
タスクは、スケジュールされた時間に実行することも、:doc:`ストリーム</user-guide/streams-intro>`に新しいデータが到着したときなどのイベントによってトリガーすることもできます。
タスクは、JavaScript、Python、Java、Scala、Snowflakeスクリプト などの:ref:サポートされている言語とツール <label-stored-procedures-handler-languages>
を使用する SQL コマンドとストアドプロシージャを実行できます。
複雑なワークフローの場合は、:doc:`タスクグラフ</user-guide/tasks-graphs>`と呼ばれるタスクのシーケンスを作成できます。タスクグラフは、ロジックを使用して動的動作を実行し、タスクを並行または連続して実行できます。
このトピックの内容:
制限事項¶
テーブルスキーマの進化 はタスクでサポートされていません。
タスク作成ワークフローの概要¶
以下の手順でコマンドを実行できる タスク管理者ロール を作成します。
CREATE TASK を使って新しいタスクを定義します。
EXECUTE TASK を使ってタスクを手動でテストします。
ALTER TASK ... RESUME を使ってタスクを連続実行できるようにします。
ALTER TASK を使って、必要に応じてタスクを絞り込みます。
タスクの実行に関する情報は、こちらをご参照ください。
コンピューティングリソースの定義¶
タスクには、ステートメントとプロシージャを実行するためのコンピューティングリソースが必要です。以下の2つのモデルから選択できます。
サーバーレスタスク:Snowflakeは、必要なリソースを予測し、自動的に割り当てます。
ユーザー管理の仮想ウェアハウスモデル:仮想ウェアハウスを使用してコンピューティングリソースを管理します。
サーバーレスタスク¶
このモデルでは、タスクを実行するタイミングを設定すると、Snowflakeがその時間内にタスクを完了するために必要なコンピューティングリソースを予測して割り当てます。予測は、同じタスクの最近の実行の動的分析に基づいています。
制限事項¶
サーバーレスタスクの最大コンピュートサイズは XXLARGE 仮想ウェアハウス に相当します。
サーバーレス・コンピュート・モデルを使ったタスクの作成¶
タスクを定義するには CREATE TASK を使用します。WAREHOUSE パラメーターを含めないでください。
タスクを実行するロールは、グローバル EXECUTE MANAGED TASK 権限を持っている必要があります。詳細については、 タスクセキュリティ をご参照ください。
次の例では、1時間ごとに実行されるタスクを作成します。
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),
),
)
コストとパフォーマンス: ウェアハウスのサイズ¶
サーバーレスタスクを効率的に実行するために、次のパラメーターを設定して、最小および最大の :ref:` ウェアハウスサイズ <label-warehouse_size>` を設定できます。
SERVERLESS_TASK_MIN_STATEMENT_SIZE: 予測可能なパフォーマンスのための最小ウェアハウスサイズ(デフォルト: XSMALL)。
SERVERLESS_TASK_MAX_STATEMENT_SIZE: 想定外のコストを防ぐための最大ウェアハウスサイズ(デフォルト: XXLARGE)。
タスクが完了すると、Snowflakeはパフォーマンスを確認し、これらの制限内で今後の実行のためにコンピューティングリソースを調整します。
次の例は、最小ウェアハウスサイズが SMALL、最大ウェアハウスサイズが LARGE で、30秒ごとに実行されるタスクを示しています。
CREATE TASK SCHEDULED_T2
SCHEDULE='30 SECONDS'
SERVERLESS_TASK_MIN_STATEMENT_SIZE='SMALL'
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=timedelta(seconds=30),
serverless_task_min_statement_size="SMALL",
serverless_task_max_statement_size="LARGE",
),
)
ターゲット補完間隔¶
サーバーレスタスクの完了目標を早期に設定できます。サーバーレストリガータスク には、ターゲット完了間隔が必要です
設定すると、Snowflakeはリソースを推定し、ターゲット完了間隔内に完了するようにスケーリングします。タスクがすでに最大ウェアハウスサイズに達していて、実行時間が長すぎる場合、ターゲット完了間隔は無視されます。
以下の例では、タスクは毎日午前0時に実行され、午前2時までに完了することを目標としています。開始時間とタイムゾーンは USING CRON によって定義されます。タスクが最大のウェアハウスサイズに達した場合、最終的にタイムアウトをトリガーするまでに最大3時間実行される場合があります。
CREATE TASK SCHEDULED_T3
SCHEDULE='USING CRON 0 * * * * America/Los_Angeles'
TARGET_COMPLETION_INTERVAL='120 MINUTE'
SERVERLESS_TASK_MAX_STATEMENT_SIZE='LARGE'
USER_TASK_TIMEOUT_MS = 10800000 -- (3 hours)
SUSPEND_TASK_AFTER_NUM_FAILURES = 3
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 * * * *", "America/Los_Angeles"),
target_completion_interval=timedelta(minutes=120),
serverless_task_max_statement_size="LARGE",
user_task_timeout_ms=10800000, # (3 hours)
suspend_task_after_num_failures=3,
),
)
ユーザー管理型仮想ウェアハウスモデル¶
このモデルでは、各ワークロードに使用されるコンピュートリソースを完全に制御できます。
ウェアハウスを選択¶
ウェアハウスを選択するときは、次の点を考慮してください。
ウェアハウスに関する考慮事項 のベストプラクティスを確認してください。
ウェアハウスのサイズとクラスタリングに基づいて、異なるウェアハウスを使用してタスクの平均実行時間を分析してください。詳細については、 タスク期間 をご参照ください。
ウェアハウスが複数のプロセスで共有されている場合は、タスクが他のワークロードに与える影響を考慮してください。
ユーザー管理のコンピューティングモデルを使ったタスクの作成¶
CREATE TASK を使用し、WAREHOUSE パラメーターを含めます。
タスクを実行するロールは、グローバル EXECUTE MANAGED TASK 権限を持っている必要があります。詳細については、 タスクセキュリティ をご参照ください。
次の例では、1時間ごとに実行されるタスクを作成します。
CREATE TASK SCHEDULED_T1
WAREHOUSE='COMPUTE_WH'
SCHEDULE='60 MINUTES'
AS SELECT 1;
コンピューティングモデルの選択に関する推奨事項¶
次のテーブルでは、サーバーレスタスクとユーザー管理タスクのどちらを使用するかを決定するために役立つ、さまざまな要因について説明します。
カテゴリ |
サーバーレスタスク |
ユーザー管理のタスク |
注意 |
---|---|---|---|
同時タスクワークロードの数、期間、および予測可能性 |
同時に実行されるタスクが少なすぎたり、短時間で完了するような、十分に活用されていないウェアハウスにお勧めです。 実行が比較的安定しているタスクは、サーバーレスタスクに適しています。 |
複数のタスクが同時進行するフル稼働のウェアハウスにお勧めです。 また、コンピューティングリソースの予測不可能な負荷にも推奨されます。自動中断と自動再開 を有効にした マルチクラスターウェアハウス は、クレジットの消費を抑えるために役立ちます。 |
サーバーレスタスクの場合、Snowflakeは実際のコンピューティングリソースの使用量に基づいてアカウントに請求します。 ユーザー管理タスクの場合、ウェアハウスの請求はウェアハウスのサイズに基づいており、ウェアハウスが再開されるたびに最低60秒の請求があります。 |
スケジュール間隔 |
スケジュール間隔の順守が非常に重要な場合に推奨されます。 スタンドアロンタスクまたはスケジュールされたタスクグラフの実行が間隔を超えると、Snowflakeは計算リソースのサイズを増やします。 |
スケジュール間隔の順守がそれほど重要でない場合に推奨されます。 |
*スケジュール間隔*は、スタンドアロンタスクまたはタスクグラフ内にあるルートタスクのスケジュールされた実行間における時間間隔を指します。 コンピューティングリソースを増やすと、SQL コードの一部の実行時間が短縮される可能性がありますが、すべての実行時間が短縮されるわけではありません。また、タスクの実行がバッチウィンドウ内に完了することを保証するものでもありません。 |
サーバーレスタスク実行の最大サイズは、 XXLARGE ウェアハウスに相当します。タスクのワークロードでより大きなウェアハウスが必要な場合は、必要なサイズのウェアハウスを持つユーザー管理タスクを作成します。
スケジュールやトリガーの定義¶
タスクは固定スケジュールで実行するようにセットすることもできますし、ストリームに新しいデータが入った時などのイベントによってトリガーすることもできます。
タスクが作成されると、一時停止状態で開始されます。タスクにスケジュールに従わせたり、イベントを継続的に検出させたりするには、ALTER TASK ... RESUME を使用します。タスクを1回実行するには、EXECUTE TASK を使用します。
固定スケジュールでのタスク実行¶
タスクを固定スケジュールで実行するには、CREATE TASK または ALTER TASK を使用してタスクを作成または変更するときにスケジュールを定義するか、SCHEDULE パラメーターを使用して Snowsight でタスクを編集することによってスケジュールを定義します。
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 をご参照ください。
ストリームに新しいデータがあるたびにタスクを実行¶
定義された :doc:` ストリーム </user-guide/streams-intro>` に新しいデータがあるたびにタスクを実行するには、トリガーされるタスク を使用します。このアプローチは、新しいデータの到着が予測できない場合にソースの頻繁なポーリングを不要にできるため、抽出、ロード、変換(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 でタスク履歴を表示するには、 タスク履歴の表示 をご参照ください。
必要な権限については、 タスク履歴の表示 をご参照ください。
単一のタスクの実行履歴を表示するには、
- 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 と USER_TASK_TIMEOUT_MS の両方が設定されている場合、タイムアウトは2つのパラメーターのうち :emph:` 最も低い`非ゼロ値になります。
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'))
カスタムロールとロール階層の作成の詳細については、アクセス制御の構成 をご参照ください。
タスク所有者ロールのドロップ¶
タスクの所有者ロールをドロップすると、タスクは所有者ロールをドロップしたロールに所有権を移します。タスクの所有権が移ると、タスクは自動的に一時停止され、新しい所有者がタスクを再開するまで新しいタスク実行はスケジュールされません。
タスクの実行中にロールを削除すると、タスクの実行はドロップされたロールの下で完了します。
システムサービスによって実行されるタスク¶
デフォルトでは、タスクはユーザーから切り離されたシステムサービスとして実行されます。
システムサービスは、タスク所有者と同じ権限を使用してタスクを実行します。
これにより、ユーザー管理に関連する複雑さを回避できます。たとえば、ユーザーが削除されたり、認証の問題によりロックされたり、ロールが削除されたりしても、タスクは中断することなく実行を継続します。
タスク実行のクエリ履歴は、システムサービスに関連付けられています。このサービスにはユーザー認証情報がなく、いかなる個人もそのIDを引き受けることはできません。システムサービスのアクティビティはアカウントに制限されています。他の操作に適用されるのと同じ暗号化保護および他のセキュリティプロトコルがこのサービスに組み込まれています。
ユーザー権限でタスクを実行する¶
タスクは、タスク所有者ロールの権限に加えて、特定のユーザーの権限で実行するように構成できます。EXECUTE AS USER を指定したタスクは、システムサービスの代わりに、指定されたユーザーの代理として実行されます。
複数ロールの権限を管理する:ユーザーがセカンダリロールを持つ場合、ユーザーはプライマリロールとセカンダリロールの権限を組み合わせてタスクを実行できます。この構成により、タスクは必要なすべてのリソースにアクセスするための権限を持つことができます。
ユーザーベースのデータマスキングポリシーと行アクセスポリシーを活用する:データガバナンスポリシーがクエリを実行するユーザーを考慮する場合、タスクをユーザーとして実行することで、そのタスクが適用されるポリシーに準拠することが保証されます。
Provide accountability for all operations: All instances of a task that are run with EXECUTE AS USER are attributed to the configured user instead of the SYSTEM user. This attribution helps maintain a clear audit trail for all operations.
アクセス制御¶
タスクの所有者ロールには、EXECUTE AS USER により指定されたユーザーに対する IMPERSONATE 権限が付与されている必要があり、指定されたユーザーにはタスクの所有者ロールが付与されている必要があります。
タスクが実行されると、タスクセッションのプライマリロールはタスクの所有者ロールになり、ユーザーのデフォルトのセカンダリロールがアクティブ化されます。ユーザーは、USE ROLE コマンドを使用してプライマリロールを切り替え、USE SECONDARY ROLES コマンドを使用してタスクセッション内のセカンダリロールを調整できるようになります。
例:サービスユーザーとチームロールの設定¶
管理者ロールを使用して、タスクに使用するサービスユーザーを設定します。
次の例では、
task_user
という名前のサービスユーザーを作成します。USE ROLE ACCOUNTADMIN; CREATE USER task_user;
タスクロールを作成し、それをサービスユーザーに付与します。
CREATE ROLE task_role; GRANT ROLE task_role to USER task_user;
タスクロールがチームユーザーロールに代わってクエリを実行できるようにします。
GRANT IMPERSONATE ON USER task_user TO ROLE task_role;
タスクロールに適切な権限を付与します。
USE ROLE ACCOUNTADMIN; -- Grant the team role the privileges to create tasks in a specific schema GRANT CREATE TASK ON SCHEMA schema1 TO ROLE task_role; -- Grant the team role the privileges to use a specific warehouse GRANT USAGE ON WAREHOUSE warehouse1 TO ROLE task_role; -- Grant the team role the privileges to run tasks on a serverless compute model GRANT EXECUTE MANAGED TASK ON ACCOUNT TO ROLE task_role;
サービスユーザーに代わってタスクを実行する¶
チームロールがタスクの所有権を持つと、チームメンバーはタスクを変更し、サービスユーザーに代わってタスクを実行できます。
例:
USE ROLE task_owner;
CREATE TASK team_task
SCHEDULE='12 HOURS'
EXECUTE AS USER task_user
AS SELECT 1;
前の例では、結果のログには task_user
がタスクを変更したことが示されます。
(テスト専用)ユーザーが他のユーザーを直接偽装することを許可する¶
変更をテストまたはプロトタイプ化する場合、管理者はユーザーが他のユーザーを直接偽装することを許可できます。このシナリオはサポートされていますが、実稼働環境では推奨されません。
偽装用のロールを設定します。
USE ROLE ACCOUNTADMIN; CREATE ROLE janes_role; GRANT ROLE janes_role to USER jane; GRANT IMPERSONATE ON USER jane TO ROLE janes_role;
新しいロールを使用してタスクを作成します。
USE ROLE janes_role; CREATE TASK janes_task SCHEDULE='60 M' AS SELECT 1;
別のユーザーにそのロールを付与します。
次の例では、ユーザーJaneがユーザーBillyにアクセス権を付与します。
--Logged in as Jane or account admin GRANT ROLE janes_role to USER billy;
他のユーザーがタスクを変更します。
次の例では、ユーザーBillyがタスクを変更します。
-- Logged in as billy USE ROLE janes_role; ALTER TASK janes_task SET EXECUTE AS USER jane;
ログを確認します。
SHOW GRANTS TO ROLE コマンドを実行するとJaneがBillyにロールを付与したことが表示されます。次に、QUERY_HISTORY ビューを確認すると、Billyがタスクを変更したことがわかります。今後そのタスクが実行された場合でも、実行者としては引き続きJaneとして表示されます。
USE ROLE ACCOUNTADMIN; SHOW GRANTS TO ROLE janes_role; QUERY_HISTORY() WHERE QUERY_TEXT ILIKE '%janes_task%';
タスクデータ定義言語(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は次の関数のセットを提供します。
その他のPythonの例¶
その他のPythonの例については、PythonによるSnowflakeタスクとタスクグラフの管理 をご参照ください。