【Snowflake】コスト超過防止のためにやるべきこと

【Snowflake】コスト超過防止のためにやるべきこと | truestar Blog
snowflake_logo

こんにちは。

Snowflakeの新サービスが続々公開され、このデータ基盤一つで何でもできてしまうすごい、と思う今日この頃です。

 

一方で、Snowflakeを使用する際(当然別クラウドもですが)には、コストを意識する必要があります。

開発者が持つ「このSQL文コストかかりそうだな」という勘所ももちろん大事ではありますが、コストを異常に発生させない仕組みづくりも大事だと筆者は思います。

 

今回は、Snowflakeのコストのおさらいと、コストを出し過ぎないための仕組みづくりについてお話ししていきます。

1. おさらい – コスト構造・注意するべきコスト

Snowflakeでは、利用時のコストは大きく以下3つに分類されます。

・ コンピュートコスト:ウェアハウスコスト・Snowflake Cortex全般(AI機能)コスト・その他 諸々含む

・ ストレージコスト:データ格納で発生

・ データ転送コスト:Snowflake外とのデータ通信で発生

その中でも、コンピュートコストが膨大になりがちです。

1.1. ウェアハウスのコスト

ウェアハウスコストは以下の計算式となります。

ウェアハウスコスト = ウェアハウスのサイズ × 稼働時間 × 単価(クレジット/時間)

・ ウェアハウスのサイズ:XSmall, Small, Medium, Largeなど、サイズアップするほどクレジット消費も増加(2倍, 4倍…..)

・ 稼働時間:ウェアハウスが稼働している時間 ※停止している時間は非課金

・ 単価:1h・XSでウェアハウスを動かしたときの単価

 AWS TokyoのStandardプランでXSを2時間回す場合、

ウェアハウスコスト

= 1(XSサイズ) * 2(稼働時間) * $2.85(単価) 

= $5.70約900円

となります。

1.2. Snowflake Cortex LLM(AI機能)のコスト

SnowflakeのLLM関数を使用する場合、クエリの実行時間の代わりに、処理されるトークン数に比例します。

LLMコスト = トークン数 * 単価(クレジット/トークン)

・ トークン数:入出力される文字 ※1トークン=約4文字(Character)くらい

・ 単価:1トークンあたりのLLM使用料金 ※関数・モデル・クラウドリージョンごとに異なる。

 

AWS TokyoのEnterpriseプランで、COMPLETE(会話)をmistral-largeモデルを使用すると、目安としては、

・5.1クレジット * 約7ドル/クレジット * 約150ドル/円  → 約5300円

・100万トークン * 4文字/1トークン → 400万文字

⇒ 1300円 / 100万文字(入出力合計)

となります。

※なお、Snowflake Cortexのその他AIサービス(Cortex SearchやAgent等)の料金形態は調査中です。

 

2. コストを出しすぎないための予防策

2.1. 予算設定・アラート設定

① Budgetsでアカウント全体の予算設定

Snowflakeアカウント全体に対して月予算を設定でき、設定予算を超えたときにアラートを飛ばすことができます。

コンピュートコスト(ウェアハウスコストやAIコスト等)、ストレージコスト、データ転送コスト Snowflake上のすべてのコストを網羅します。

なお、Budgetsでは、月予算の110%にならないとアラートが飛ばない点に注意が必要です。

 

② リソースモニターでウェアハウスコストの予算設定

ウェアハウス(主にSQL計算で発生する)コストの月予算を設定でき、予算の一定を超えたらウェアハウスを停止したり、アラートを飛ばすことが可能です。

アラートは25%, 50%, 75%, 100%のように小刻みに設定し、月半ばで予算対50%になっているか、といったように定期的に使用状況を確認できるようにしましょう。

また、100%になったタイミングでウェアハウスを強制停止することも可能ですが、日次で走っているSQLがある場合はデータフローに影響が出るため、個人的には非推奨です。

2.2. ウェアハウス設定の見直し

① Auto Suspend(自動停止するまでの時間)を小さく設定

ウェアハウスが一定時間使っていないと、停止してくれる便利なサービスです。

オンにし、可能であればmin1分で設定するとよいでしょう。

② STATEMENT_TIMEOUT_IN_SECONDS(SQLの実行上限時間)を小さく設定

一回のSQLで最大どのくらいの時間実行するかを設定でき、予期せぬ長時間実行を防ぎます。

過去のクエリ履歴から、自分のSnowflake環境において正常な最大実行時間がどのくらいかを確認し、少し余裕を持たせて設定しておくといいでしょう。

2.3. 【調査中】Snowflake Cortex(AI機能)のコスト管理について

Snowflake Cortexはリソースモニターに相当するコスト管理サービスがまだ存在していません。

Snowflake Cortexの料金を確認するいくつかの方法を紹介しておきます。

 

① Cost Management – Consumptionから確認

Usage Type:Compute、Service Type:AI Serviceにすると、Snowflake Cortexで使用した料金が表示されます。

なお、Consumptionにはアラート機能等は無いため、もしアラート機能を実装したい場合は②を試す必要があります。

※ AI Servicesでは、日ごとのグラフは表示されないようです。Nameが空である故、図表が作られないのかな。。

 

② Snowflake Cortexコストのメタデータ取得 ⇒ アラート関数で通知(未実装)

Snowflake Cortex関連のコストをACCOUNT_USAGEから取り出し、アラート関数で通知するTASKが可能です。

ACCOUNT_USAGE内では、以下のテーブルがCortex周りのコスト情報を持っていることが確認できています。

MATERING_HISTORY:日付ごとのCortexコストを取得可能 ※「SERVICE_TYPE:AI Services」でフィルター

CORTEX_AISQL_USAGE_HISTORY:クエリ単位でコストを取得可能

 

おわりに

Snowflakeは便利で性能がいいサービスが多く、つい使ってしまいがちですが、良きものにはコストも当然発生します。

開発者や管理者が気楽にSnowflakeを使えるようにするためにも、コストの異常検知はなるべく仕組み化しておきたいなと改めて感じました。

それでは。