AWSコスト異常検知を導入したら、『人にお願いする』トイルが発生したのでSlackBotを作って解消した

SREチームの池田(@mashiike)です。SRE連載の5月号になります。

AWSのコストについては、多くの方がすごく気にしていると思います。 カヤックでもAWSのコストの変動に関しては敏感に気にしています。

そんな方々の心のお供になる機能が、 AWSコスト異常検知(AWS Cost Anomaly Detection) です。 今回は、このコスト異常検知にまつわるトイル削減の取り組みを紹介します。

背景

AWSコスト異常検知は、AWS マネジメントコンソールの中では『Billing and Cost Management』配下にある機能になります。 この機能を使うことでAWSで発生したコストに関して、通常とは異なるコストの発生を検知することができます。

コスト異常検知自体については、CureApp テックブログ様のZennの記事がわかりやすくまとまっているので、そちらを参照いただければ幸いです。

zenn.dev

aws.amazon.com

さて、ここからはカヤック特有かもしれない背景があります。 カヤックには、ゲーム事業を担当する事業部やクライアントワークを担当する事業部など、多種多様にあります。 請求や権限分離の都合上、事業や案件ごとにAWSアカウントを開設しているため、その数は 100近く に及びます。 そして、それらのAWSアカウントはAWS Organizationsでまとめて管理されており、一つのPayerアカウントに紐づけられています。  

そんな状況で、100近くあるアカウントそれぞれにコスト異常検知を設定・管理するのは大変です。 そのため、カヤックではPayerアカウントに対してコスト異常検知を設定し、Organization全体でまとめてコスト異常検知を行っています。

以下のスクリーンショットは、導入当時に発生したとあるアカウントでのRedshiftのRI切れのコスト異常を検知した際のものです。  

このようにPayerアカウント1つにコスト異常検知を設定するだけで、それに紐づく連結アカウントのコスト異常を素早く検知することができました。

ここまでは良いのですが、ここから次の2つのことをする必要があります。

  1. PayerアカウントのCostExplorerを閲覧し、コストの変化状況を確認する。
  2. Payerアカウントで、検出されたコスト以上に対して『正常な異常』『誤検知』『問題ではありません』のフィードバックをする。

そして、このときに発生する問題が、『限られた人しかアクセスができない Payerアカウント』で上記の2つを行う必要が有るという点です。 コスト異常が発生するたびに『Payerアカウントにアクセス権を持つ人』に上記の2つを依頼するというトイルが生まれてしまったのです。

人に頼めばトイル、SlackBotに頼めばトイルじゃない!

上記のトイルを削減するために生まれたSlackBotが aws-cost-anomaly-slack-reactor になります。

github.com

このSlackBotがやることは単純です。

  1. SNS Topic経由でコスト異常が通知されたら、BotのLambdaが起動され、『正常な異常』『誤検知』『問題ではありません』の3つのアクションボタンがついた通知をSlackに投稿する。
  2. その通知メッセージの返信に、関連するコストの変化状況のグラフを投稿する。
  3. アクションボタンが押されたら、Lambda Function URL経由でLambdaが起動され、対応するコスト異常にフィードバックを与える。  

『Payerアカウントにアクセス権を持つ人』に頼んでいた内容をSlackBotが肩代わりしてくれます。 もちろんLambda Function URLはパブリックにアクセス可能なよう設定できるので、『Payerアカウントにアクセス権を持つ人』でない人のアクションも受け付けられるというわけです。  

動作の様子は次のスクリーンショットのようになっています。

(これは、開発用アカウントでBedrockのTaitan Image Generator G1 モデルを検証目的で初めて使ってみたときのものです。今まで使ったこと無いものを初めて使ったのでもちろんコスト異常です)

このSlackBotを導入したことで、コスト異常が発生するたびに起きていた『Payerアカウントにアクセス権を持つ人』に依頼するというトイルを削減することができました。

まとめ

AWSコスト異常検知は、AWSのコストに関して通常とは異なるコストの発生を検知することができる機能です。 カヤックでは、Payerアカウントに対してコスト異常検知を設定し、Organization全体でのコスト異常検知を行っています。  

しかし、Payerアカウントという性質上、限られた人しかアクセスできず、コスト異常が発生するたびに『Payerアカウントにアクセス権を持つ人』に操作を依頼するというトイルが生まれてしまいました。 そこで、SlackBotを導入することで、人ではなくSlackBotに依頼するという形で、コスト異常が発生するたびに起きていたトイルを削減することができました。  

このように日々の運用でも、ちょっとした依頼を人にするということを繰り返していないでしょうか?それ、多分トイルです。

カヤックでは、日々発生するちょっとしたトイルを削減していくエンジニアも募集しています。