DataFusionでリソース使いすぎて10万溶かした話

shohei
·

はじめに

ご機嫌に仕事してたら、突然slackが飛んできた。

「Google Cloudの費用が10万円以上かかっていることが判明しました。。」

完全に寝耳に水だった。心の中で「ウソだろ?」「やばい...」「やっちまった.....」と何度も繰り返しました。

学んだことを次に活かすべく恥を忍んで記事にします。 少し前の自分に言いたいのは、クラウドで何かを構築する前にちゃんと公式の見積ツールを使ってコスト試算しようぜ です。

何が起きたか

GCPで想定外にリソースを使用し、1月で12万円越えのコストを計上しました。原因を調べると、Cloud Data FusionというGCPのETLツールが想定外の費用を発生させていました。

DataFusionは何に使っていたかというと、Salesforceからデータを抜いてBigQueryに移送するために使っていました。

DataFusionのインスタンスを起動しっぱなしにしており、リソースを食い散らかしていたようです。「インスタンス起動しっぱなし」と聞くとクラウドサービスではよくある失敗のように思いますがそこに至るまでにいくつか落とし穴がありました。

落とし穴①:直感的ではないインスタンス構成

図解すると以下の図のようになインスタンス構成になっています。

ETLツールなので、データをExtract(抽出)/ Transform(変換)/ Road(格納)するために使います。 なので「処理内容を定義」→「実行」という流れで使うのが普通ですが、 DataFusionの場合は、「処理内容を定義」するためにインスタンスを立ち上げる必要があるのです。

以下の図のようにPiplineという単位で処理内容を定義をしておくのですが、Piplineを保存しているあいだずっとインスタンスが立ち上がっているので 実行していなくても$1.8/hのお金が発生し続ける仕組みになっていました。

いや、サーバレスじゃないんかい!!??

この構成のせいでインスタンスを起動している感覚を持てず、「インスタンス起動しっぱなし」にしてしまった要因でした。ちなみに実行する時にも別でインスタンスが立ち上がるのですが、こちらは実行開始時にインスタンスが起動し、処理終了時にインスタンスが停止されます。

落とし穴②:親切な無料枠

DataFusionをおためしで使い始めた当初は、いくらかかっているか一応気にしていました。 データ転送処理を何回か実行してから請求ページを見ても、BigQueryやComputeEngine(GCP版EC2的なヤツで、実行中のみ建てられるインスタンス)に数十円お金はかかっているものの、それ以外には特に金額が発生している様子はありませんでした。 なのでその時点で「めっちゃ安く使えるやん!」と勘違いを起こしました。

しかし、よくよくDataFusionの料金詳細を確認すると、以下のように書かれていました。

Basic エディションでは、アカウントごとに毎月最初の 120 時間が無料です。

DataFusionインスタンスを立ち上げて丸5日分は無料枠として費用が発生しないのです。。。この無料枠によって、見事に私はお花畑な勘違いを起こし、落とし穴にはまってしまいました。(まじでちゃんと料金表見ろ!)

落とし穴③:コストアラートの設定が不十分だった

プロジェクトでGCPを使うとなった際に、他チームで管理しているOrganizationにProjectを切り出す形で相乗りさせていただきました。 私は心のどこかで、「リソース使いすぎたらアラート飛ぶっしょ!」と思っていました。もちろん裏どりはしていないです。 実際、コストアラートの設定はされていました。 が、アラートの通知方法が、こく少人数に対してメールが飛ぶような設定になっており、検知が遅れてしまいました。

私としては、その辺よしなにやってくれるっしょ!と淡い期待を持っていました。 あとから聞くと、相手のチームからもよしなにやってくれてるだろうという淡い期待を持っていたようです。 コストモニタリングの設定が不十分だったことは見直すべきですが、憶測で進めてしまったこともきちんと裏どりすべきだったと反省しています。

今後に向けた再発防止策

インシデントとして捉えて再発防止のMTGを関係者で実施しました。いくつか原因はあるものの、課題感として大きいのは下記でした。

  • コスト管理のモニタリングの仕組みが不十分だった

  • サービスを使う前にコスト試算をしていなかった

1利用者として、それぞれが注意すべき観点としては特に下だと思います。 GCPにはこういったコストを試算して見積れる便利なサイトがあるので、新しくサービスを使って何かをする前にざっくりでもコスト試算をするようなルールにしたいと思います。(ちなみにAWSAzureなど大体のクラウドサービスに用意されている)

ガチガチにやるなら、必ず設計書を作るようにしてFMT化しちゃう案も出たが、スピード感が損なわれてしまうので。

さいごに

こういった事故が起きた時に、なんとなくその場しのぎで終わらせるのではなく、都度仕組みに落としていく強い意志が大事だなと思いました。

もちろん、事故を起こさないのが一番ですが。

@mj_yakkyk
もちろんできるけど、やり方は分からない! 𝕏:@mj_yakkyk