Snowflake におけるコスト管理のベストプラクティスについて考えてみた

# 概要
従量課金型のクラウドサービスを使う上で、コストガバナンスを効かせることは重要である．特に，利用者が多い場合，組織的に利用する場合，ガバナンスを効かせるうえで，コストを管理する仕組みは必要不可欠である．今回は，Snowflakeを中心とした従量課金型のクラウドサービスのコスト管理のベストプラクティスについて考えてみる．

# 既存文献
## 各クラウドサービスのコスト管理に関するベストプラクティス

### AWS のコスト管理に関するベストプラクティス
https://wa.aws.amazon.com/wellarchitected/2020-07-02T19-33-23/wat.pillar.costOptimization.ja.html
>AWS では、AWS Organizations または AWS Control Tower を使用してアカウント構造を作成します。これにより、分離が可能になり、コストおよび使用量の配分に役立ちます。リソースにタグ付けして、ビジネスや組織の情報を使用量とコストに適用することもできます。AWS Cost Explorer を使用してコストと使用状況を可視化するか、Amazon Athena と Amazon QuickSight でカスタマイズされたダッシュボードと分析を作成します。コストと使用量の制御は、AWS Budgets による通知、AWS Identity and Access Management (IAM) や Service Quotas を使用した制御によって行われます。

### Azure ののコスト管理に関するベストプラクティス
https://learn.microsoft.com/ja-jp/azure/cloud-adoption-framework/ready/azure-best-practices/resource-naming-and-tagging-decision-guide

>コストの管理と最適化: ビジネス グループがクラウド リソースの使用を認識するように、各チームが使用するリソースとワークロードを IT 部門が確実に把握するようにします。 コスト関連のタグでは、次の種類の情報がサポートされています。


### Google Cloud のコスト管理に関するベストプラクティス
https://cloud.google.com/resource-manager/docs/best-practices-labels?hl=ja
>ラベルは必須ではありませんが、Google Cloud リソースの整理と管理に役立ちます。ラベルは、費用の追跡とリソースの識別に使用できます。リソースにラベルを使用する場合は、厳格なラベル付けガイドラインに従ってください。組織の主要な関係者と一致する正式なラベル付けポリシーを作成することをおすすめします。サンプル表は、組織全体のラベル付けポリシーを示しています。

### Snowflake のコスト管理に関するベストプラクティス
https://docs.snowflake.com/ja/user-guide/cost-attributing
>コストを部門、環境、プロジェクトなどのさまざまなグループに帰属させる最も直接的で強力な方法は、 オブジェクトのタグ付け 機能を使用して特定のリソースにタグを付けることです。この戦略では、管理者はタグ（例: cost_center）を作成し、タグの可能な値のリスト（例: sales、 finance）を定義します。この例では、各コストセンターが一意なタグ値を取得します。次に、タグと値の組み合わせが、コストセンターにより使用されるリソースに割り当てられます。これらのリソースはクレジットを消費するため、タグ値でグループ化されたレポートを実行できます。このタグ値は組織内の特定のグループに直接対応するため、コストを正確に特定できます。

* これを踏まえると，Snowflake の場合，ウェアハウス，データベースは管理組織単位で分離する必要がある．裏を返すと，1つのウェアハウス，データベースに対して，複数のタグを付与すると，組織単位での分計ができなくなる．各リソースに対して正しくタグ付けを行えば，組織単位でのコスト管理は実現可能である．
* また，Budgets を用いれば，アカウント内のリソース単位の使用クレジット状況の全容がモニタリングできる．
https://docs.snowflake.com/ja/user-guide/budgets

## 総論
どのクラウドサービスにおいても，共有するのが，各リソースに対して，タグ（ラベル）をつけることである．ただし，これはあくまでも同一アカウント内におけるコスト管理のベストプラクティスになり，そもそも，アカウントごとに分けて管理することが推奨されている．
>AWS では、AWS Organizations または AWS Control Tower を使用してアカウント構造を作成します。これにより、分離が可能になり、コストおよび使用量の配分に役立ちます。

## 考察
各クラウドサービスにより呼称は様々であるが，オーガニゼーション，アカウント，リソース…，と細かくなっていくに従い，コスト管理は煩雑になる傾向がある．一方で，細かい単位で管理することで，**共用できる箇所が増えることで，コスト効率は上がる**傾向がある．（e.g. 2つのシステムA，Bのサーバリソースの料金を管理するとき，アカウントを分離するほうがシステムごとのコスト管理が楽で，同一アカウントで管理しようとすると各サーバリソースに対してシステムAのサーバなのか，システムBのサーバなのかの判別が必要（タグで実装）となる．）

# これらを踏まえた，私の考えるSnowflake におけるコスト管理のベストプラクティス
### 前提
* それなりに利用ユーザが多い（目安1,000人以上）
* それなりに組織が多い（目安10組織以上）
* 同一のアカウント内のリソースを使っている
* 利用組織に対して利用料を分計したい

### ストレージコストについて
管理組織ごとでデータベースを作成することをお勧めする．これはコスト以外の理由となるが，各データベースの管理権限を組織代表者に渡すことで，データベースのリソースの管理自体を委譲できるためである．また，コスト的な観点でいうと，Snowflake のストレージコストは，同一アカウントの総計のデータ量に対する請求となるため，データベースを分けたことによる分割損がでないためである．
また，table単位の容量は以下で把握でき，これをデータベース単位に集計すれば，組織ごとのストレージコストの分計が可能となる．
```
SHOW TABLES ;
```
ただ，Snowflake のストレージコストは非常に安価で，全体の数%程度になることが多いと思われるため，組織単位に請求しなくてもよいかもしれない．

### コンピューティングコストについて
管理組織ごとではなく，用途ごとにウェアハウスを作成することをお勧めする．理由は2つある．
* [Snowflakeでユーザ個別の利用状況を可視化する方法](https://qiita.com/mshdtksk/items/417f9e63c38845a80188)，[Snowflakeでユーザ個別の利用状況を可視化する方法　の続き](https://qiita.com/mshdtksk/items/63b2fb591c448f3a8f64)に記載した内容を応用することで，組織ごとのコンピューティングコストの分計が可能である
* コンピューティングコストはウェアハウス単位で課金され，分割損が生じるためである．例えば，2つの軽い処理（1秒未満）を動作させたとき，1つのウェアハウスであれば，60秒分のクレジットで済むのに対して，2つのウェアハウスであると，120秒分のクレジットが消費される（この現象は，処理に対してウェアハウスがオーバースペックなほど発生する）．
https://docs.snowflake.com/ja/user-guide/cost-understanding-compute
>上記で表示されるクレジットの数は、1時間の使用量です。ただし、クレジットは最低60秒（つまり、1分）で、秒ごとに請求されます。

# まとめ
Snowflake の場合，従量課金型のクラウド利用料について，リソースのタグよりさらに細かな処理単位の課金を分計でき，かつその分計することによりコスト効果も得られる．