なんとなく Vertex AI を触って放置してたら 10万円 課金された話

# 何が起こったか
１２月１日 Google から突然メールが届きました

「あぁ、毎月恒例の０円の請求書か」

そう油断していた私に驚愕の数字が飛び込んできました

![スクリーンショット 2023-12-02 18.37.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176789/0815df05-4164-3bb1-91b9-ae6716e06352.png)

**99,028** 円！！！！！！！！！！

嘘だろ・・・そう思った私はすぐに Google Cloud Console の支払い画面を開きました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176789/8eba533b-c078-d6e2-d233-e5bc107c37f9.png)

どうやらこれは夢ではなかったようです

なんと、11月7日から毎日コンスタントに 3,379円課金され続けていたのです

# 何が起こっていたのか

具体的にプロジェクトの内訳を見ると課金対象のプロジェクトが２つあって、うち一つ（図の青色のプロジェクト）が課金額の８割以上を占めていました（83,354円）

プロジェクトの中に入って詳しく見てみると課金されていたのは Vertex AI でそのうちの **Feature Store online serving node** というのが課金額の大部分（83,352円）を占めています

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176789/1dbbe3a5-3dc5-52a9-d9ac-ff3c4cdd5af9.png)

そこで Vertex AI のコンソールを調べてみたところ「特徴量」のセクションに以下の node がデプロイされていました

![スクリーンショット 2023-12-02 18.49.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176789/e3a9c9a6-dfd2-7973-a00d-9a2b31ed90fd.png)

**「オンラインサービング」** 

**「固定ノード」**

聞き慣れない言葉に私は大きな不安を覚えました

これは一体なんなんだろう？と思って Google のドキュメントを調べたところ以下のような記述が見つかりました

オンラインサービングについての説明

> オンライン処理を使用すると、少量のエンティティの特徴値を低レイテンシで処理できます。リクエストごとに、単一のエンティティ タイプからの特徴値のみを処理できます。Vertex AI Feature Store（レガシー）は、各特徴の最新の値（null 以外）のみを返します。

https://cloud.google.com/vertex-ai/docs/featurestore/serving-online?hl=ja

固定ノードについての説明

> 固定ノード数を割り当てると、Vertex AI Feature Store（従来版）はトラフィック パターンに関係なく一貫したノード数を維持します。ノード数は固定されるため、コストは予測可能です。トラフィックの処理に十分なノード数があれば適切に機能します。トラフィック パターンの変化に対応するため、ノード数を手動で変更できます。

https://cloud.google.com/vertex-ai/docs/featurestore/managing-featurestores?hl=ja

どうやら**オンラインサービング**とはリクエスト１個単位で機械学習モデルによる予測を動かせる機能で、**固定ノード**の設定は、オンラインサービングを有効にした際にトラフィック量に関係なくリソースを割り当てる設定のようです。

通常機械学習モデルの予測はある程度のデータをひとまとめにしてバッチ処理的に行うことが多いですが、この機能を使えば、ユーザーからの操作に対してリアルタイムで機械学習による予測結果を提供できるということですね、便利便利

しかしVertex AIをちょっと試したいだけだった私にとっては悪魔のような機能だったみたいで、誰も使わない機械学習モデルに毎日一定のリソースを割り当てた上で、オンライン上で常に待機状態にしてしまったことになります

# 仮説の検証

ちなみに feature store の料金設定は以下のようになっています

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176789/3b5679cc-0979-4b69-9a90-5b34725aa822.png)


https://cloud.google.com/vertex-ai/pricing?hl=ja#featurestore

これによると私が使っていた `us-central1` というリージョンでオンラインサービングを固定ノード1で１ヶ月弱動かすと以下のようになります

```py
% python
Python 3.10.13 (main, Sep  9 2023, 17:49:45) [Clang 14.0.0 (clang-1400.0.29.202)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 0.94*24*25
564.0
>>> 564*146
82344
```

時間単価 \\$0.94 なので 24時間 * 25日で \\$564

\\$1 = 146円で計算すると日本円で 82,344 円になります

**「これじゃん！！！！！！！！！」**

この計算結果は先月の私の課金額とほぼ一致しました

どうやら今回のトラブルはこの Feature Store の設定ミスによるものだということが仮説から確信に変わった瞬間です

# どうすればよかったか

では、このようなトラブルを防ぐために私は何をするべきだったのか

仮説ベースで対策を３つ挙げてみます

### 1. Feature Store のオンラインサービングの設定を OFF にする

先ほどの料金表を見ても分かるとおり、Feature Store はオンラインサービングを OFF にするだけで使わなければ基本課金額は 0 になります

他のオペレーションの課金は処理するデータ量単位で、オンラインサービングのみが時間単位（かつノード単位）だからです

今回の事件は図のようにオンラインサービングトグルを少し左にずらしておけば完全に防げた問題でした

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176789/8ff33bf0-0c72-b232-9096-9ad1d173a858.png)

ただこのトグルボタン、デフォルトの状態だとおそらく ON になっていて、Google Cloud 初心者がこの設定に気づくのは難しいかもしれません

### 2. Google Cloud に予算を設定する

Google Cloud の支払画面には「予算とアラート」という項目があり、これを設定しておけば課金額が一定の金額を超えたときにユーザーにメールでアラートが届くようになります

例えば以下のように予算を毎月10,000円に設定しておけば課金額5,000円の時、9,000円の時、10,000円の時の３回ユーザーにアラートのメールを送ってくれるようになります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176789/dde81941-d01d-1f8b-6ef6-6551afdc312e.png)

いきなり月末にメールが来るのではなく、一定の課金額に達したときにお知らせメールをもらう設定をしていれば、被害が最初限に抑えられた可能性は高いです

### 3. 使わないリソース・プロジェクトはすぐに削除する

これまでの話で分かる通り、Google Cloud の提供するサービスの中には全く使わなくても時間単位で課金されてしまうサービスがあります

これを防ぐには使わないリソースは即座に削除しておくことが最も根本的な対策です

最近別件で私が使っていた Vertex AI の quickstart にも以下のような一文が書いてあったのでした

> # IMPORTANT: Cleaning Up
> In case you are using your own Cloud project, not a temporary project on Qwiklab, please make sure to delete all the Indexes, Index Endpoints and Cloud Storage buckets after finishing this tutorial. Otherwise the remaining objects would **incur unexpected costs**.

https://cloud.google.com/vertex-ai/docs/vector-search/quickstart?hl=ja

これを読んでいた時は、「ほーんリソース消し忘れて課金される哀れな人がいるんだなぁ」くらいに思っていたのですが、まさか自分がその筆頭になるとは思いもしませんでした orz

# まとめと反省
今までこういったクラウドサービスで万単位の課金をされたことがなかったので完全に油断していました

これまでの請求額が０円でも、ちょっとした操作ミスで簡単に10万円課金されてしまうという意味でクラウドコンピューティングサービスの怖さを身をもって叩き込まれた気がします

今回消えてしまった10万円は高い高い勉強代ということで今後の人生に活かしたいと思います