Snowflake Task による SQL の定期実行
[履歴] [最終更新] (2022/02/11 12:40:38)

概要

こちらのページで基本的な使い方を把握した Snowflake において、cron のように定期的に SQL を実行する仕組みとして Task が提供されています。基本的な使い方を記載します。

サンプル

データベースとテーブルを作成しておきます。

CREATE DATABASE mydb;
CREATE TABLE mytbl (c1 DATETIME, c2 STRING);

1分毎に INSERT を実行する task を作成します。WAREHOUSE パラメータを省略すると、Snowflake-managed な Compute リソースを利用して稼働します。

CREATE TASK mytask
  SCHEDULE = '1 MINUTE'
  USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = XSMALL
AS
INSERT INTO mytbl (c1, c2) VALUES (CURRENT_TIMESTAMP(), system$current_user_task_name());

初期状態では開始されていないため、以下の SQL を実行します。

ALTER TASK mytask RESUME;

参考資料:

ログ、ステータス

Task は schema オブジェクトの配下に位置するオブジェクトです。USE されている schema に関する task を show するコマンドは以下のとおりです。

USE DATABASE mydb;
SHOW TASKS;

USE されていない schema の task も表示するためには以下のようにします。

SHOW TASKS IN ACCOUNTS;

タスクの実行履歴は以下のコマンドで確認します。

SELECT * FROM TABLE(information_schema.task_history());
SELECT * FROM TABLE(information_schema.serverless_task_history());

監査用の Snowflake DB から SELECT する場合は以下のようにします。

SELECT * FROM snowflake.account_usage.task_history LIMIT 10;

Snowflake におけるセキュリティ関連の機能 に記載の snowflake database を利用する場合は遅延が発生します。Information Schema を利用する場合は、保持期限が存在することに注意します。

参考資料:

権限

ACCOUNTADMIN を用いずに、他のロールに権限を委譲する設定を記載します。

Task History の閲覧

Task が格納される database および schema の USAGE 権限に加えて、Task の OWNERSHIP 権限を持つ場合、以下のクエリが実行できます。

SELECT * FROM TABLE(information_schema.task_history());

または MONITOR EXECUTION 権限を持つ場合にも、上記クエリを実行可能です。

GRANT MONITOR EXECUTION ON ACCOUNT TO ROLE myrole;

上記は Information Schema に関する記載です。snowflake database から SELECT するための権限は、こちらのページをご参照ください。

参考資料:

作成、実行

以下のようなカスタムロール taskadmin を作成して、権限を委譲できます。

// accountadmin である必要はありません。
USE ROLE securityadmin;

// ロールの作成。
CREATE ROLE taskadmin;

// useradmin が grant できるように、OWNERSHIP を移管しています。
GRANT OWNERSHIP ON ROLE taskadmin TO ROLE useradmin;

// accountadmin の直下に配置することで、taskadmin が OWNERSHIP を持つオブジェクトが発生しても accountadmin で管理できるようにしておきます。
GRANT ROLE taskadmin TO ROLE accountadmin;

// 以下の grant には accountadmin が必要です。
USE ROLE accountadmin;

GRANT EXECUTE TASK, EXECUTE MANAGED TASK ON ACCOUNT TO ROLE taskadmin;

上記 taskadmin に加えて、必要な権限は以下のとおりです。

  • database および schema の USAGE 権限。
  • warehouse の USAGE 権限。 ← Snowflake-managed な Compute リソースを利用しない Task の場合。
  • Task で定期実行する SQL に必要な権限。

補足1

Task の OWNERSHIP 権限は user ではなく role が持ちます。特定の user が管理する task というものはなく、role を持つ複数の user で管理する task ということになります。

例えば ACCOUNTADMIN で create した task の OWNERSHIP は ACCOUNTADMIN となるため、taskadmin では drop 等ができません。

補足2

shared database 配下に task を作成することはできませんが、task の SQL 内で参照することはできます。

CREATE TASK mytask
  SCHEDULE = '1 MINUTE'
  USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = XSMALL
AS
INSERT INTO mytbl (c1, c2) SELECT CURRENT_TIMESTAMP(), query_text FROM snowflake.account_usage.query_history LIMIT 1;

参考資料:

関連ページ
    概要 Snowflake アカウントの運用時において、ACCOUNTADMIN は必要な場合以外は利用しないことが推奨されます。SYSADMIN 直下ではなく ACCOUNTADMIN 直下に位置付けた Custom Role を作成することで、ACCOUNTADMIN が持つ権限を委譲する例を記載します。 関連資料: