❄️

Snowflakeでのコスト管理

2023/02/28に公開

Snowflakeを最近触ってみることがあったので、コスト周りについて個人的に調べたログ

参考ドキュメント↓

Snowflakeでのコスト管理 | Snowflake Documentation

お品書き

  • Snowflakeのコストについて
  • Snowflakeのコスト調査
  • Snowflakeのコスト制御

Snowflakeのコストについて

Snowflakeでのコストは次の3つの領域に分類される。

  • コンピューティング: ユーザー管理(仮想ウェアハウス)、Snowflake管理(Snowpipeなどのサーバーレス機能)、およびクラウドサービス
  • ストレージ: データステージング、データベーステーブル、マテリアライズドビュー、Time Travel、Fail-safe等の機能
  • データ転送: Snowflakeとのデータ転送

コストの発生について

総コストについて | Snowflake Documentation

Snowflakeを使用する総コストは、データ転送、ストレージ、およびコンピューティングリソースを使用するコストの合計。

コンピューティングリソース

Snowflake内でコンピューティングリソースを使用すると、Snowflakeクレジットが消費される。コンピューティングリソースを使用した請求コストは、消費されたクレジットの数にクレジットの価格を掛けて計算される。

  • 仮想ウェアハウスコンピューティング
    • Snowflakeは秒単位の請求(ウェアハウスが開始するたびに最小60秒)を使用するため、ウェアハウスは、アクティブに作業しているときに実際に消費したクレジットに対してのみ請求される。
  • サーバーレスコンピューティング
    • コストを最小限にするために、これらのサーバーレスコンピューティングリソースは、各ワークロードの必要に応じて、Snowflakeによって自動的にサイズ変更、およびスケールアップまたはスケールダウンされる。
  • クラウドサービスコンピューティング
    • nowflakeアーキテクチャのクラウドサービスレイヤーは、認証、メタデータ管理、アクセス制御などのバックグラウンドタスクを実行するときにクレジットを消費する。クラウドサービスレイヤーの使用量は、クラウドリソースの日次消費量がウェアハウスの日次使用量の10%を超えた場合にのみ請求される。

ストレージリソース

Snowflakeにデータを格納するための月額コストは、テラバイト(TB)あたりの定額に基づいている。

アカウントの種類(キャパシティまたはオンデマンド)とリージョンによって価格は異なる。

ストレージは、Snowflakeアカウントに毎日保存されるディスク上の平均バイト数に基づいて毎月計算される。

参考: ストレージコスト

データ転送リソース

Snowflakeは、データをアカウントに取り込むためのデータイングレス料金を請求しないが、データエグレス(アカウントからデータを取り出す)には料金を請求する。

Snowflakeアカウントから同じクラウドプラットフォームの別のリージョン、またはまったく異なるクラウドプラットフォームにデータを転送すると、Snowflakeはバイト単位の料金を請求する。

このデータエグレスのバイト単位の料金は、Snowflakeアカウントがホストされているリージョンによって異なる。

参考: 価格ガイド

Snowflakeのコスト調査

Snowflakeでのコスト調査 | Snowflake Documentation

  • 総コストの調査
  • コンピューティングコストの調査
  • ストレージコストの調査
  • データ転送コストの調査

総コストの調査

総コストの調査 | Snowflake Documentation

Snowsight, the Snowflake web interface を使用するか、 ACCOUNT_USAGEおよび ORGANIZATION_USAGE スキーマのビューに対してクエリを記述することによって、コスト履歴を調査できる。

Snowsight を使用すると、視覚的なダッシュボードからコストに関する情報をすばやく簡単に取得できる。

総コストの表示

アカウント管理者( ACCOUNTADMIN ロールを持つユーザー)は、 Snowsight を使用して、特定の日、週、または月のSnowflake使用総コストを表示可能。

Snowsight を使用して全体のコストを調べるには、以下手順でコンピューティング、ストレージ及びデータ転送リソースのコストが合計され、組織の通貨単価を使用して棒グラフで表示される。

  1. Admin » Usage に移動。
  2. ドロップダウンリストから、 All Usage Types を選択。(画像は社内の検証用アカウントで確認したもの)

注意

ダッシュボードはクエリを使用して共有 SNOWFLAKE データベースからコストと使用状況の情報を取得するため、コンピューティングリソースを消費する。

そのため、データを表示する際には XSの仮想ウェアハウスを選択して使用することをお勧めする。

総コストのデータのクエリ

Snowflakeは、使用状況とコストに関連するデータを含む2つのスキーマ、 ORGANIZATION_USAGEと ACCOUNT_USAGEを提供している。

これらのスキーマに対してクエリを記述することでSnowflakeのコストをより効果的に管理するための貴重な洞察を得ることができる。

<クエリ例: アカウント別に分類された、組織の合計使用コスト(ドル単位)>

select account_name,
  round(sum(usage_in_currency), 2) as usage_in_currency
from snowflake.organization_usage.usage_in_currency_daily
where usage_date > DATEADD(Month,-1,CURRENT_TIMESTAMP())
group by 1
order by 2 desc;

コンピューティングコストの調査

※項目内容が多いため、大まかに記述

コンピューティングコストの調査 | Snowflake Documentation

コンピューティングコスト合計は、次の全体的な使用で構成される。

  • 仮想ウェアハウス(ユーザー管理のコンピューティングリソース)
  • Snowflakeが管理するコンピューティングリソースを使用する、自動クラスタリングやSnowpipeなどのサーバーレス機能
  • Snowflakeアーキテクチャのクラウドサービスレイヤー

ここではSnowsight, the Snowflake web interface を使用するか、 ACCOUNT_USAGE
 および ORGANIZATION_USAGEスキーマのビューに対するクエリを記述することによって、コンピューティングコスト履歴に対する洞察を得る方法について説明。

組織のクレジット使用状況の表示

すべてのコンピューティングリソース(仮想ウェアハウス、サーバーレス、クラウドサービス)は、Snowflakeクレジットを消費する。

アカウント管理者(つまり、 ACCOUNTADMIN ロールを持つユーザー)は、 Snowsight を使用して、特定の日、週、または月のコンピューティング使用状況の総コストを表示できる。

Snowsight を使用してコンピューティングコストを調査するには、

  1. Admin » Usage に移動。
  2. 使用状況のタイプドロップダウンから Compute を選択。

タグ別にフィルターする

組織内の理論ユニットに使用している リソースのコストを帰属させる
 ためにタグを使用できる。

Usage ダッシュボードをフィルターして、特定のタグと値の組み合わせに関連したコストを表示するには、

  1. Snowsight で、 Usage ダッシュボードを開く。
  2. Tags ドロップダウンから、タグを選択。
  3. タグの値のリストから値を選択。
  4. Apply を選択。

コンピューティングコストのデータのクエリ

コンピューティングコストの調査 | Snowflake Documentation

ORGANIZATION_USAGE および ACCOUNT_USAGE スキーマのほとんどのビューには、消費された クレジットに関するコンピューティングリソースのコストが含まれている。

クレジットではなく通貨単位でコンピューティングコストを調査するには、 USAGE_IN_CURRENCY_DAILY ビューに対するクエリを記述する。

※題材のクエリ数が多いため、詳細はドキュメントを参照

ストレージコストの調査

データ転送コストの調査 | Snowflake Documentation

ストレージコストの合計は、以下に関連するコストの合計

  • ステージングされたファイルのストレージ
  • データベーステーブルのストレージ
  • Fail-safe及び、Time Travelのストレージ

ここでは、コンピューティングコスト同様、Snowsight, the Snowflake web interface を使用するか、 ACCOUNT_USAGEおよび ORGANIZATION_USAGEスキーマのビューに対するクエリを記述することによって、コンピューティングコスト履歴に対する洞察を得る方法について説明。

組織のストレージ履歴の表示

ACCOUNTADMIN ロールを持つユーザーは、 Snowsight を使用して、Snowflakeに保存されているデータの量を表示できる。

Snowsight を使用してストレージコストを調査するには、

  1. Admin » Usage に移動。
  2. 使用状況のタイプドロップダウンから Storage を選択。

テーブルのデータ使用量の表示

適切なアクセス権限を持つユーザーは、ウェブインターフェイスを使用して、スキーマ/データベース内にある個々のテーブルのサイズ(バイト単位)を表示できる。

Snowsight を使用してテーブルのサイズを表示するには、

  1. Data » Databases を選択。
  2. Databases ページの左側で、データベースオブジェクトエクスプローラーにドリルダウン。
  3. データベースを展開してから、データベース内の任意のスキーマを展開。
  4. 任意のテーブルをクリックして、サイズを含むテーブル統計を表示。

テーブルサイズのデータのクエリ

ウェブインターフェイスを使用する代わりに、 SQL クエリを記述して、テーブルのサイズなどに対する洞察を得ることができる。

適切なアクセス権限を持つユーザーは、 SHOW TABLES コマンドを使用してテーブルに関するデータをリストできる。

さらに、 ACCOUNTADMIN ロールを持つユーザーは、 ACCOUNT_USAGE スキーマの TABLE_STORAGE_METRICS ビューに対するクエリを実行することにより、 SQL を使用してテーブルサイズ情報を表示できる。

ストレージコストのデータのクエリ

※題材のクエリ数が多いため、詳細はドキュメントを参照

ストレージコストの調査 | Snowflake Documentation

データ転送コストの調査

データ転送コストの調査 | Snowflake Documentation

ここでは、コンピューティングコスト同様、Snowsight, the Snowflake web interface を使用するか、 ACCOUNT_USAGEおよび ORGANIZATION_USAGEスキーマのビューに対するクエリを記述することによって、コンピューティングコスト履歴に対する洞察を得る方法について説明。

組織のデータ転送履歴の表示

ACCOUNTADMIN ロールを持つユーザーは、 Snowsight を使用して、指定された日付範囲内で、Snowflakeアカウントから別のクラウドプロバイダーまたはリージョンに転送されたデータの量を表示できる。測定単位はバイト。

Snowsight を使用してデータ転送コストを調査するには、

  1. Admin » Usage に移動。
  2. 使用状況のタイプドロップダウンから Data Transfer を選択。

**データ転送コストのデータのクエリ

データ転送コストの調査 | Snowflake Documentation

※題材のクエリ数が多いため、詳細はドキュメントを参照

Snowflakeのコスト制御

仮想ウェアハウスの使用量を制限するために使用できる 制御 について説明。

これらの制御により、仮想ウェアハウスを使用する実際のコストが予想コストを超えないようにすることが可能になる。

Snowflakeでのコスト制御 | Snowflake Documentation

ウェアハウスへのアクセスを制御する

費用対効果の高い構成を持つ既知のウェアハウスに制限して、ウェアハウスで作業できるユーザーと、それらのウェアハウスで何ができるかを定義できる。

Snowflakeのアクセス制御により、ウェアハウスに対して次の権限を付与できる。

  • CREATE WAREHOUSE: 新しいウェアハウスを作成できるロールを制限するグローバル権限。
  • MODIFY: ウェアハウスのサイズ変更や 自動中断の設定の無効化など、コストに影響する設定を変更できる特定のウェアハウスに対する権限。
  • USAGE: 特定のウェアハウスに対する権限。この権限を割り当てることで、ユーザーはワークロードに適したサイズと構成のウェアハウスのみを使用できるようになる。

最適なウェアハウスのサイズを選択する

コスト管理のベストプラクティスの1つは、ワークロードごとに異なるウェアハウスを使用すること。

これにより、ワークロードごとに適切なサイズを選択できる。ウェアハウスの最適なサイズがわからない場合は、小さいサイズから始めて、ワークロードのパフォーマンスとその SLA に基づいて徐々にサイズを大きくするのが良い。

参考: コンピューティングリソースの管理(Snowflakeブログ)

クエリ時間を制限する

ハングしたクエリは、予想よりも長く実行されるため、過剰なクレジットを消費する。

SnowflakeではSTATEMENT_TIMEOUT_IN_SECONDSパラメーターを設定して、 SQL ステートメントがキャンセルされるまでに実行できる最大時間を設定できる。

ステートメントのキュー時間を制限する

SQL ウェアハウスを使用するためにキューに入っているステートメントは、クレジットを消費しない。

ただし、クエリがキューに長時間留まると、クエリが実行されるまでに関連性(実行の必要性)がなくなる可能性がある。関連性がなくなったクエリを実行するとクレジットが浪費されるため、 SQL ステートメントがキャンセルされる前にキューに入れることができる最大時間を設定することで、コスト管理を実装できる。

自動中断を使用する

デフォルトでは、すべてのウェアハウスで自動中断の設定が有効になっている。

ウェアハウスは、定義された期間非アクティブになると自動的にシャットダウンされる。

中断されたウェアハウスはクレジットを消費しないため、ウェアハウスはワークロードを処理しているときにのみコストが発生する。

ユーザーが自動中断の設定を無効にできないように制限すると、未使用のウェアハウスがクレジットを浪費するのを防ぐのに役立つ。

アクセス制御を使用して、自動中断の設定を変更できないようにすることも可能。

支出制限を強制する

リソースモニター は、特定の時間間隔または日付範囲内でウェアハウスによって消費されるクレジットに制限を設定する機能を提供する。

これにより、ウェアハウスが通常予想されるよりも多くのクレジットを意図せずに消費することを防止できる。

複数のウェアハウスまたはアカウント全体に対して1つのリソースモニターを設定できるため、全体的な支出制限に達したときに、複数のウェアハウスを効果的に中断できる。

ウェアハウスは、それ自体のリソースモニターとアカウント固有のリソースモニターに同時に割り当てることが可能。

いずれかのクレジットの限度に達すると、ウェアハウスは中断される。

Discussion