タグでサーバーレスタスクのコスト管理をする #SnowflakeDB
Snowflakeのサーバーレスタスクを利用したいけど、部署毎に利用クレジットを出しているもしくはプロジェクトごとに利用クレジットを出しているというコスト管理の面が懸念されると思います。
なんとなくサーバーレスタスクにタグをつけたらいい感じに管理できそうな気がしたので年明けから試していたのですが、なかなかうまく行きませんでした。そこで思い切ってSnowflakeのサポートに質問したところ優しく教えてもらったので、ブログで紹介します。
やりたいこと
サーバーレスタスクとウェアハウスにタグをつけてそれを使用しているプロジェクトがどれだけコンピューティングコストを消費しているかを確認したい。
これは結論から言うとうまくいきませんでした。ウェアハウスの利用クレジットが確認できるのはaccount_usage.warehouse_metering_history
で、サーバーレスタスクの利用クレジットが確認できるのがaccount_usage.serverless_task_history
で別のビューで確認する必要があったからです。軽率にunionしてみたのですが、予期しないunionと怒られてしまいました。(小声)
できたこと
サーバーレスタスクとウェアハウスにタグをつけて、それぞれに付与したタグの値を利用して消費コストを計算する。
各オブジェクトにタグの値を付与するところまでは行ったのですが、そこからどうやってそのタグの値と各オブジェクトの利用クレジットのビューを結びつければいいのかがわかりませんでした。
そこでSnowflakeサポートに問い合わせて教えてもらったのが以下のクエリです。
オブジェクトにタグをつける
新たにオブジェクトを作成する際にタグ付けをする場合には、with tag(tag_name='tag_value')
でタグをつけることができます。
CREATE or REPLACE TASK serverlesstask_with_tag1 with tag(cost_management='tag1') schedule = '1 minute' USER_TASK_MANAGED_INITIAL_WAREHOUSE_SIZE = 'Large' as select * from TRIPS;
また、すでにあるオブジェクトにタグ付けをする場合には、alterコマンドで変更を加えます。
alter warehouse COMPUTE_WH set tag cost_management = 'tag2';
付与したタグからサーバーレスタスクの利用クレジットを計算する
サーバーレスタスクを2つ作成してそれぞれcost_managementタグの値tag1を付与しています。
select start_time, task_name, sum(credits_used) from snowflake.account_usage.serverless_task_history where task_name in (select object_name from snowflake.account_usage.tag_references where tag_name='COST_MANAGEMENT' and tag_value='tag1' and tag_database = 'CITIBIKE' and tag_schema = 'PUBLIC') group by start_time, task_name order by start_time, task_name; +-------------------------------+--------------------------+-------------------+ | START_TIME | TASK_NAME | SUM(CREDITS_USED) | |-------------------------------+--------------------------+-------------------| | 2023-01-19 16:00:00.000 -0800 | SERVERLESSTASK_WITH_TAG1 | 0.748504499 | | 2023-01-19 16:00:00.000 -0800 | SERVERLESSTASK_WITH_TAG2 | 0.741978031 | | 2023-01-19 17:00:00.000 -0800 | SERVERLESSTASK_WITH_TAG1 | 0.680540834 | | 2023-01-19 17:00:00.000 -0800 | SERVERLESSTASK_WITH_TAG2 | 0.711390388 | | 2023-01-19 18:00:00.000 -0800 | SERVERLESSTASK_WITH_TAG1 | 0.699000983 | | 2023-01-19 18:00:00.000 -0800 | SERVERLESSTASK_WITH_TAG2 | 0.720698466 | | 2023-01-19 19:00:00.000 -0800 | SERVERLESSTASK_WITH_TAG1 | 0.425067768 | | 2023-01-19 19:00:00.000 -0800 | SERVERLESSTASK_WITH_TAG2 | 0.446714047 | | 2023-01-26 18:00:00.000 -0800 | SERVERLESSTASK_WITH_TAG2 | 0.312286377 | | 2023-01-26 19:00:00.000 -0800 | SERVERLESSTASK_WITH_TAG2 | 0.699561252 | | 2023-01-26 20:00:00.000 -0800 | SERVERLESSTASK_WITH_TAG2 | 0.650168089 | | 2023-01-26 21:00:00.000 -0800 | SERVERLESSTASK_WITH_TAG2 | 0.738715829 | | 2023-01-26 22:00:00.000 -0800 | SERVERLESSTASK_WITH_TAG2 | 0.728850448 | | 2023-01-26 23:00:00.000 -0800 | SERVERLESSTASK_WITH_TAG2 | 0.720471026 | | 2023-01-27 00:00:00.000 -0800 | SERVERLESSTASK_WITH_TAG2 | 0.690635009 | | 2023-01-27 01:00:00.000 -0800 | SERVERLESSTASK_WITH_TAG2 | 0.642463167 | +-------------------------------+--------------------------+-------------------+
where句でaccount_usage.tag_references
からタグとタグの値とデータベースとスキーマを元にタスクの名前を引っ掛けて計算を出します。
account_usage.tag_references
では下のようにタグに関する情報を取得することができます:
select * from snowflake.account_usage.tag_references; +--------------+------------+--------+-----------------+-----------+-----------------+---------------+-----------+--------------------------+-------------------------------+-----------+-----------+-------------+ | TAG_DATABASE | TAG_SCHEMA | TAG_ID | TAG_NAME | TAG_VALUE | OBJECT_DATABASE | OBJECT_SCHEMA | OBJECT_ID | OBJECT_NAME | OBJECT_DELETED | DOMAIN | COLUMN_ID | COLUMN_NAME | |--------------+------------+--------+-----------------+-----------+-----------------+---------------+-----------+--------------------------+-------------------------------+-----------+-----------+-------------| | CITIBIKE | PUBLIC | 1 | COST_MANAGEMENT | tag2 | NULL | NULL | 9 | COMPUTE_WH | NULL | WAREHOUSE | NULL | NULL | | CITIBIKE | PUBLIC | 1 | COST_MANAGEMENT | tag1 | NULL | NULL | 10 | ANALYTICS_WH | NULL | WAREHOUSE | NULL | NULL | | CITIBIKE | PUBLIC | 1 | COST_MANAGEMENT | tag1 | CITIBIKE | PUBLIC | 4 | SERVERLESSTASK_WITH_TAG1 | NULL | TASK | NULL | NULL | | CITIBIKE | PUBLIC | 1 | COST_MANAGEMENT | tag1 | CITIBIKE | PUBLIC | 5 | SERVERLESSTASK_WITH_TAG2 | NULL | TASK | NULL | NULL | +--------------+------------+--------+-----------------+-----------+-----------------+---------------+-----------+--------------------------+-------------------------------+-----------+-----------+-------------+ 8 Row(s) produced. Time Elapsed: 1.927s
付与したタグの値からウェアハウスの利用クレジットを計算する
今度はタグを付与したウェアハウスの利用クレジットを出してみます。
select start_time, warehouse_name, sum(credits_used) from snowflake.account_usage.warehouse_metering_history where warehouse_name in (select object_name from snowflake.account_usage.tag_references where tag_name='COST_MANAGEMENT' and tag_value='tag1' and tag_database = 'CITIBIKE' and tag_schema = 'PUBLIC') and start_time between '2023-01-01' and '2023-01-27' group by start_time, warehouse_name order by start_time, warehouse_name; +-------------------------------+----------------+-------------------+ | START_TIME | WAREHOUSE_NAME | SUM(CREDITS_USED) | |-------------------------------+----------------+-------------------| | 2023-01-11 18:00:00.000 -0800 | ANALYTICS_WH | 0.775666389 | | 2023-01-12 02:00:00.000 -0800 | ANALYTICS_WH | 0.213684166 | | 2023-01-15 19:00:00.000 -0800 | ANALYTICS_WH | 0.260400000 | | 2023-01-15 21:00:00.000 -0800 | ANALYTICS_WH | 0.191111111 | | 2023-01-16 23:00:00.000 -0800 | ANALYTICS_WH | 0.140000000 | | 2023-01-19 00:00:00.000 -0800 | ANALYTICS_WH | 0.280176944 | +-------------------------------+----------------+-------------------+
便宜上今月分に絞って計算しています。
from句が違うだけでwhere句の書き方はサーバーレスタスクと同じです。
まとめ
ウェアハウスの利用クレジットとサーバーレスタスクの利用クレジットをまとめて計算することはできませんでしたが、タグを付与して複数のオブジェクトの利用クレジットをまとめて計算できるので、部署ごとに利用料金を出したいのでサーバーレスタスクを使用したくてもできなかったと言う方は、ぜひこの方法で消費クレジットを計算してみてください。