クラウド費用に目を光らせる

こちらは [Makuake Advent Calendar 2023](https://adventar.org/calendars/8992) の記事です。

# ごあいさつ

ふぅ…… 12 月 18 日、 427 時半か……ギリギリセーフだな…… (錯乱)

ご無沙汰しております、株式会社マクアケ SRE チームの dev.aoki です。
例によってアドベントカレンダーでもないと何も書かない不精者ですが、お付き合いくださいませ。

マクアケでは、2013 年からアタラシイものや体験の応援購入サービス「Makuake (マクアケ)」というオンラインプラットフォームを提供しています。
https://www.makuake.com/

自分の所属する SRE チームでは、 Makuake のサービス稼働基盤や監視基盤の面倒を見ることが多く、自然とそのインフラストラクチャにかかる費用に関わる諸作業を行うことが多くあります。 ~~というか毎月経理チームから問い合わせ来ますんで、えぇ、消耗するんですけど。~~
この辺りで意識しないと苦しくなる、コストアラートについて Tips 程度に知見共有させていただければと思います。半分以上はボヤキかもしれません。

# 前提: なんで SRE がコストを見てるんだっけ

この辺りはずーっと悩んでいて、歴代リーダーとも定期的に「これでいいんだっけ？」って話をするんですが、現状止むを得ないよなあ、という話で SRE チームが持っています。

僕ら SRE チームがコストに関して持っているのは以下。

- インフラ基盤の年間予算見積もり
- 予算消化の (随時・月次) トラッキング
    - ↑に関連して、コスト異常検知

やってないのは以下

- 積極的なコスト削減介入
- 経費精算処理 (事務作業)
- インフラ基盤以外のコスト管理
    - 主にアカウント数で料金が決定するタイプのサービス
    - たとえば GitHub のシート数だとか

意図としては、あくまで `サービス信頼性` の延長として、僕らがサービス基盤コストを見ているんだよ、というポリシーがあります。

ワーストケースにはなりますが、例えばコストが異常な跳ね上がり方をして、会社の支払い能力を超える金額の請求が来たら、事業はサービスどころの騒ぎではなくオシマイになります。また、決済が正常に行うことができず、 SaaS 側からサービスの強制停止などをされたら、こちらもインシデントに陥ることになります。絶対にあってはなない事態を防ぐために、SRE チームがコストを現状見ています。

~~会社がいくらでもジャブジャブ使っていいよって言ってくれればいいんですけどね。~~

# コストアラート

そんな中で結構重要なのが、コストの異常に早めに気づくこと。従量課金制のクラウド基盤の怖いところは、設定ミスひとつでとんでもない料金が請求されることがあるということです。このため、僕らはいくつかの通知を作ることでリスク緩和しています。

## AWS

### 日次コスト確認

[Cost Explorer](https://aws.amazon.com/jp/aws-cost-management/aws-cost-explorer/) の API をキックする Lambda を作成して、Slack に日次で通知させています。[GetCostAndUsage](https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_GetCostAndUsage.html) で日次のコストを取得し、毎日同じ Slack チャンネルに通知をすることで、普段と明らかに高いコストが記録された際に気づくことができます。実際にこの通知を見て Cost Explorer で分析したところ、意図しないリソースが作成されていることに気づく、なんてパターンもありました。

ただこれ、やりたいことは単純なのに、わざわざ Lambda を管理しなくちゃいけないところが若干めんどくさいなと思っているところ。ちょうどいい機能出てきてくれませんかねえ。

### 異常検出 (※未利用)

お恥ずかしい話ですが、今回の記事を書いてて初めて知ったのが [AWS コスト異常検出](https://aws.amazon.com/jp/aws-cost-management/aws-cost-anomaly-detection/)。前述の日次コスト確認と同等の役割で動かせそうな期待感があり、隙を見て設定していきたいと思いました。

### 予算消化アラート

[AWS Budgets](https://aws.amazon.com/jp/aws-cost-management/aws-budgets/) を利用しています。

AWS Budgets ではいくつかの設定方法があるのですが、僕らの場合は予算シミュレーションをした上で毎月の予算の見積もりを立てているので、その金額を月ごとに設定して細かく管理しています。

[イメージ ※当然ですが値はサンプルです]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192857/9f2e61c3-e487-6892-0026-9b504a388716.png)

Budgets の設定で、月ごとに 50%, 80%, 100% を超過するタイミングで Slack に通知させています。ここは SNS + Chatbot でシンプルに実装できています。

## GCP

### 日次コスト確認

こちらも AWS と同様、異常に気づくための仕組みです。GCP の利用が始まった初期から日次コスト通知は作られていたようで、Cloud Billing　からデータを取得する、GAS で動く通知ボットが僕の入社前から動いていました。歴史がある。

が、こちらも AWS と同じく、スクリプトの管理という辛さは感じているところ。元気に動いてはいるのですが、反面長らくメンテされておらず、ちょっとした対応するにも結構しんどそうなので、よりマネージドに寄せた仕組みに変えたいねえ、とは思っているところです。

### 予算消化アラート

GCP にも AWS Budgets と類似の [予算アラート](https://cloud.google.com/billing/docs/how-to/budgets?hl=ja) という機能があります。こちらも月ごとに 50%, 80%, 100% を超過するタイミングで通知させているのですが、実装当時にサボったまま放置しているため、残念ながらメールでの通知になっています。 Slack より見る頻度が低いので、担当者 (僕です) が意識しないとダメです。どうにかしたい〜。

## Datadog

サービス稼働基盤ではないですが、メトリクスや監視を一手に担っているので、こちらも重要度が高く、またかかっている費用規模としても大きい部類に入り、大事にされているものです。

### 異常検出

Datadog はいい感じにコストデータを日次で拾えなかったのですが、 `datadog.estimated_usage.*.*` 系の推定使用量メトリクスをトラッキングすることができました。
https://docs.datadoghq.com/ja/account_management/billing/usage_metrics/

コストそのものがいくらかが分かるのがベストではありつつ、僕らの目的はあくまで **普段と違うコストの跳ね上がり** を検出したいもののため、これらを使った [異常検知モニター](https://docs.datadoghq.com/ja/monitors/types/anomaly/) を使い、跳ね上がりを検出しています。異常検知モニターは異常とみなす方向 (`direction`) を使うことができるため、ガクンと下がった場合は無視、グッと上がったときだけアラートするような仕組みにしています。

ここ最近で Synthetics のブラウザテストの利用が流行ったため、急激に利用トレンドが変わってアラートが鳴りまくった、みたいなストレスはありましたが、少なくともそういった事情を僕らのチームとして無意識的にキャッチできる状況になってたのは、なかなかポジティブなことだったなと思っています。

# その他

上記のアラート以外に、チームの月次行事として管轄サービスの前月コストを確認する会を行なっています。自動で通知されるもの以外にも、過去の傾向を見ることでコスト変動のリスクを事前に察知できたり、年間予算に対してどれくらい余裕があるのかを把握できたりという意味で良い取り組みになっていると思います。とはいえまぁまぁ労力のかかる会でもあるので、よりスマートに実施できるようにしていきたいとは思っています。

# 将来への展望

色々と書いてきましたが、基本的にはコスト管理にはあまり労力をかけずにいたいものです。
いくつか将来に向けてやりたいことはあるのですが、それこそ費用対効果を見ながら考えるべきなんだろうなとは思います。

## Big Query へのコストデータ集約

GCP の Cloud Billing については [割と簡単にできる](https://cloud.google.com/billing/docs/how-to/export-data-bigquery?hl=ja) みたいなので、さっさと設定するのがいいのかなと思ったりはしています。一方、当然ですが AWS や Datadog は簡単にインテグレーションできるわけではないので、この辺りはデータプラットフォームチームに相談してみたいなあとぼんやり考えています。

## Datadog Cloud Cost Management ってどうなのかな

出てきた時にちょっと気になった [Datadog Cloud Cost Management](https://docs.datadoghq.com/ja/cloud_cost_management/?tab=aws) 、活用うまくできればコストアラートも Datadog に一本化できて良さそうだなと思ったりはしましたが、現状は対応クラウドが AWS/Azure の 2 つなので、僕らのユースケースにはちょっと合わず。また料金も、 `ホスト 1 台あたり、月額 $9.38 (年払いの場合)` ([link](https://www.datadoghq.com/ja/pricing/?product=%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%82%B3%E3%82%B9%E3%83%88%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88#products)) という、クラウド環境に存在するホスト数依存という仕様も気になり (EC2 がまだそこそこある僕ら的には不都合) 、手が出ない状況にあります。

でも、条件が改善されてきたら、使ってみたいなあ。

# おわりに

現状に関していえば、まだまだスマートじゃないなと思っています。クラウドベンダー側も様々新しい機能を提供してくれていますし、データ分析に関して言えば集約やレポートの自動化など、やれることはもっともっとあります。

コストは開発者からすれば、正直意識せず無尽蔵に使いたいと思いつつも、事業貢献の観点では確実に必要なものですし、この辺りを見るスキルはどこに行っても役に立つんじゃないかなと思いました。楽しいかどうかは別として。

健全なインフラは、健全なコスト管理なしには語れません。
華のある仕事ではないですが、今後も地道に貢献していきたいと思います。

~~もっと楽してェ！
楽にするスキルをお持ちの方は是非弊社の SRE チームへ！~~

(採用募集はホントです)
https://www.wantedly.com/projects/1402812