AWS Budget + AWS Chatbotで使用料金のアラートをSlackに飛ばす

以前EKS上のClusterを一月以上に渡って止め忘れ、大変な請求が来てしまったことがある。

二度とこのような悲劇を起こさないよう、AWSの料金が高くなってきたらSlackに通知が来る仕組みを作ることにした。

AWS Chatbotについて

aws.amazon.com

AWS Chatbotは、7月にβ版が公開されたばかりの新しいサービス。これを使うと、SlackにAWSリソースについての情報を飛ばすことができる。今まではSlackに情報を送るためには自前でLambda関数を作ってCloudWatchと連携させるしかなかったので、とても期待が持てる。
上のページにもあるが、AWS Chatbotにメッセージを届けるには、メッセージを発信するサービスとAWS Chatbotとの間にAmazon SNSを介する必要がある。Amazon SNSはメッセージのpub/subサービスで、メッセージ送受信のインターフェイスを担ってくれる。

Amazon SNSの設定

まずSNSトピックを作成しておく必要がある。

docs.aws.amazon.com

トピックを作成したら、AWS Chatbotの設定に進む。画像ではサブスクリプションとして https://global.sns-api.chatbot.amazonaws.com が指定されているが、これはAWS Chatbot側でこのトピックを指定すれば自動で入るので、ここで設定する必要はない。

f:id:Udomomo:20191014203555p:plain

注意として、Amazon SNSのアクセスポリシーには、 Id に一意の識別子、 Resource にそのトピックのARNを指定しておく必要がある。自分はこれを忘れて通知が飛ばず詰まってしまった。
また、現時点でAWS ChatbotはAmazon SNSのコンソールからのメッセージ送信には対応していない。送信をテストしようと思っても飛ばないので注意。

AWS Chatbotの設定

次にAWS ChatbotとSlackを連携させる。 Configure new client を押すと、Amazon ChimeかSlackを選択できる。Slackを選択すると、今ログインしているSlackのワークスペースと自動で連携する設定ができる。(当然だが、自分がそのワークスペースのadminユーザである必要がある)
その後、どのチャンネルに飛ばすか、どのSNSを購読するかを選択する。

f:id:Udomomo:20191014201433p:plain

AWS Budgetの設定

最後にAWS Budgetでアラートを設定する。アラートの飛び先として、先程作成したSNSトピックのARNを指定すれば良い。SNSトピックが正しく設定できていないと、ARNを指定しても無効である旨のエラーが出てしまう。
なお、飛び先としてメールアドレスも指定しないと先に進めないようだ。

f:id:Udomomo:20191014203349p:plain

試しにアラートの基準を予算の5%到達に設定したところ、無事にSlack(とメール)に通知が届いた。通知はリアルタイムではなく、今回の場合数時間後になって届いた。

f:id:Udomomo:20191014204058p:plain

今回の作業を通じて、SNSやChatbotだけでなく、ポリシーについての理解も深めることができた。今後はアラートを予算の80%くらいにして運用していくつもり。