Snowflakeのコストは「使った量」だけでは決まりません。ウェアハウスの止め方、クエリの書き方、ストレージの持ち方といった設計判断の積み重ねが、そのままクレジットの溶け方に直結します。本稿では、コスト構造の分解から、ウェアハウス適正化・AUTO_SUSPEND・Resource Monitor・クエリ効率・ストレージ・クラウドサービス課金の閾値までを、AWSコンサルティングとFinOpsの現場で培った視点で整理します。落とし穴はいずれも検証段階で先に踏み抜き、本番では未然に防いできたものです。

01コストは「クレジット×単価」— まず構造を分解する

Snowflakeの請求は、突き詰めるとコンピュート・ストレージ・データ転送の3つに分かれます。中心はコンピュートで、消費したクレジット数に単価を掛けたものが課金額です。コンピュートはさらに、ユーザーが起動する仮想ウェアハウス、Snowpipeや検索最適化などのサーバーレス、認証やメタデータ管理を担うクラウドサービス層に分かれます。ストレージはTBあたりの定額で日次の平均保存量に対して課金され、データ転送はリージョンやクラウドをまたぐegress(送出)にのみ発生します。最適化の効き目が最も大きいのはコンピュート、つまり「クレジットをどれだけ無駄なく使うか」です。まずはこの分解を頭に入れておくと、どこを触ればいくら効くのかが見通せます。

Snowflakeコストの3分解 総コスト = コンピュート(クレジット×単価) + ストレージ + データ転送 コンピュート 仮想WH(秒課金・60秒下限) サーバーレス(Snowpipe等) クラウドサービス層(>10%で課金) ストレージ テーブル実体(TB単価・日次平均) Time Travel(1〜90日) Fail-safe(7日・固定) データ転送 リージョン跨ぎ egress クラウド跨ぎ egress 同一リージョン内は無料 最適化の主戦場はコンピュート = クレジット消費をどう抑えるか
Snowflakeコストの分解。効き目が大きいのはコンピュート(クレジット)で、ここをどう設計・運用するかが最適化の中心になる。

02ウェアハウス適正化:サイズは「速く終わらせて止める」

ウェアハウスのクレジットは秒単位で課金されますが、起動・再開のたびに最低60秒ぶんが課金されます。サイズを一段上げるとクレジット消費レートは倍になりますが、その分クエリが速く終われば、結果としてコストが下がることもあります。逆に、並列化しにくいクエリでサイズだけ上げても時間が縮まらず、単価だけ倍になることもあります。判断材料は「サイズ」ではなく「実行時間×消費クレジット」です。重い単一クエリやスピリングにはサイズアップ(スケールアップ)、同時実行数の増減にはマルチクラスタ(スケールアウト)と、役割を分けて考えます。マルチクラスタのスケーリングポリシーは、キューを最小化するStandardと、クレジットを優先して既存クラスタを詰めて使うEconomyから選べます。

現場のコツ:本番相当のデータ量とクエリで、XS・S・Mを実測比較する。「速く終わって止まる」構成が、たいてい一番安い。

03AUTO_SUSPENDの設計:検証で先に踏んだ落とし穴

SnowflakeはAUTO_SUSPENDで、無操作が一定秒続いたウェアハウスを自動停止できます。Snowflakeは秒課金を前提に短めの値を推奨しています。検証環境で、AUTO_SUSPENDを長め(あるいは無効)にしたXSウェアハウスが、夜間のアイドル状態のまま起動し続けて想定外にクレジットを消費することを確認しました。そこで本番では、アイドルで確実に止まるよう短いAUTO_SUSPENDを標準化しています。一方で、短すぎるのも罠です。2〜3分おきにクエリが来るワークロードでAUTO_SUSPENDを1分にすると、起動と停止を往復し、そのたびに60秒の最低課金と、キャッシュを温め直すためのコールドスタートが積み上がります。検証段階でこの往復パターンの無駄を把握できたため、本番ではクエリのまとまり方に合わせてAUTO_SUSPENDを調整しました。

AUTO_SUSPENDの設計:課金は「起動ごとに60秒下限」 ① 適切:バーストをまとめて実行し、その後サスペンド 連続実行 = 1回分の課金 → アイドルで自動停止(課金なし) ② 落とし穴:起動⇄停止を往復する短すぎる設定 → 60秒下限が積み上がる 課金時間 60秒の最低課金(無駄) クエリ実行
検証環境で往復パターンの無駄を先に把握し、本番ではAUTO_SUSPENDとクエリのまとめ方を最適化した。

04Resource MonitorとBudgets:上限をハードに切る

Resource Monitorは、一定期間に消費するクレジットの上限を決め、閾値に達したらアクションを起こす安全弁です。トリガーは「ON n PERCENT DO …」の形で、NOTIFY(管理者へ通知)、SUSPEND(実行中クエリの完了を待って停止)、SUSPEND_IMMEDIATE(即時停止し実行中クエリもキャンセル)を組み合わせられます。モニターはアカウント全体にも個別ウェアハウスにも割り当てられます。運用では、アカウント単位のモニターを全体の非常ブレーキとして置きつつ、ウェアハウス単位のモニターでチームやワークロードごとに責任を持たせる二段構えが有効です。より細かい単位で消費の予兆を掴みたい場合は、オブジェクト単位で追えるBudgetsを併用します。

現場のコツ:NOTIFYを50%・75%・90%に、SUSPENDを100%付近に置く。止める前に必ず「気づける」段階を作っておく。

05クエリ効率:プルーニングとスピリングを潰す

クレジットを溶かす最大要因は、実は非効率なクエリです。Snowflakeのテーブルは50〜500MBのマイクロパーティションに自動分割され、フィルタ条件でスキャン対象を絞る「プルーニング」が効くほど読む量が減ります。Query Profileで各TableScanの「スキャンしたパーティション数」と「総数」を比べ、前者が十分に小さいかを確認します。効きが悪い大テーブルには、よく絞る列でのクラスタリングを検討します(ただし自動クラスタリング自体もサーバーレス課金なので掛けすぎない)。もう一つの落とし穴がスピリングです。メモリに載りきらない処理はローカルディスクへ、さらに溢れるとリモートストレージへ退避し、性能が大きく劣化します。Query Profileのbytes spilled to local/remote storageを確認し、ウェアハウスのサイズアップかバッチ分割で解消します。

06ストレージとクラウドサービス課金:見えにくいところ

ストレージはTBあたり定額と安価に見えますが、Time TravelとFail-safeが効いてきます。両者は継続的データ保護(CDP)の標準機能で追加ライセンス費用はかからないものの、変更されたぶんの履歴を保持するため保存量に上乗せされます。Fail-safeは変更不可の7日間、Time Travelは標準1日(Enterprise以上で最大90日)です。更新の激しい中間テーブルやETLの作業領域には、Fail-safeを持たないトランジェント/テンポラリーテーブルを使うと履歴コストを抑えられます。もう一つ見落としやすいのがクラウドサービス層です。ここは日次でウェアハウス消費の10%を超えたぶんだけが課金対象になります。検証で、極端に小さいクエリの高頻度実行やメタデータ操作の多いパターンがこの10%を押し上げうると分かったため、本番ではまとめ処理やクエリ設計でクラウドサービス比率が跳ねないようにしています。

現場のコツ:作業用の中間テーブルはトランジェントに。Fail-safeの7日ぶんの保存コストが素直に消える。

07AWS FinOpsとつなぐ:全社コスト管理の一部にする

SnowflakeはAWS上で動くため、コスト管理もAWSのFinOpsと地続きに設計できます。EMWでは、低コストの小規模導入から最大規模まで複数業種のAWS基盤を運用してきた知見を、そのままSnowflakeに持ち込みます。具体的には、SnowflakeのオブジェクトタグやクエリタグをAWSのコスト配分タグと同じ体系で切り、部門・案件単位で横断的に費用を可視化します。データ転送では、SnowflakeとS3を同一リージョンに揃えてegressを避け、PrivateLlink経由でAWS内部の閉域通信にすることで、セキュリティとネットワーク経路の両方を整理します。暗号化はKMS、周辺処理はLambdaやAPI Gateway、生成AI連携はCortexやAmazon Bedrockといったサービスと組み合わせられます。AWS Well-Architectedのコスト最適化の柱が説くとおり、コスト最適化は一度きりの作業ではなく、可視化・上限設定・見直しを回し続ける運用そのものです。Snowflake単体で閉じず、AWS全体のFinOpsサイクルに組み込むことが、クレジットを溶かさない最短ルートになります。

参考情報(一次情報)

EMWはAWS基盤とSnowflakeを横断したFinOps設計・コスト最適化を、設計から運用まで一貫してご支援します。まずはお気軽にご相談ください。

相談する
← ブログ一覧へ戻る