repl.info

AWSの日々の利用料をLambda FunctionでSlackに通知する

この記事は株式会社リンケージ Advent Calendar 2023 23日目です。

こんにちは、 @r_takaishi です。リンケージで副業SREとして働いています。今回は少し前にやったことを紹介します。

WebエンジニアであればAWSなどのクラウドサービスについて日々の利用料金をウォッチしていると思いますが、毎日コストエクスプローラを開くのは少し面倒です。また、QuickSightやRedash、Metabaseを使うほどでもなく、どうやるかな〜と思うことはあるのではないでしょうか。そういうケースに対応するため、副業先のリンケージで https://github.com/takaishi/awscost という簡単なツールを作りました。

awscostはCLI上もしくはlambda functionで実行することを想定したツールです。awscostを使うことで、いくつかの観点でAWSの利用料金をSlackに通知することができます。

  1. 日次の料金
  2. 当月の料金予測
  3. AWSアカウント毎の料金(日次、当月の予測)
  4. 日次料金の上位5サービス
  5. AWSアカウント毎の日次料金のグラフ(過去90日分)

コマンドラインから r_takaishi 個人のアカウントに対して実行した例をお見せします。利用料金が少なすぎるからか、予測機能がうまく動かなかったので予測に関しては無効にしています。

% DISABLE_FORECAST=true AWS_PROFILE=XXXXX IS_LAMBA=false DRY_RUN=false ./dist/main

AWS Organizationで管理している4アカウントについて、2日前の料金を表示しています。2日前にしているのは料金がある程度確定してから見せたかったからです。

image-20231222093451251

アカウント別の日次料金を拡大するとこうなっています。

daily_costs

Cost ExplorerやBIツールに比べると表示できる情報は固定されていますが、Slack上で毎日数ヶ月分の傾向が見えるのは便利だと思います。見ていて気になったらその時Cost Explorerで詳しく見ればいいですね。

料金の計算には Billing and Cost Management API を、グラフのプロットには gonum/plotを使いました。awscostをlambdaで動かすには fujiwara/lambroll を使いました。手軽で便利。

この手の汎用的なツールをGitHubで公開し、いろいろな場所でLambda Functionとしてうまく動かす際の悩みとして、ツールをコンテナイメージとして公開している場合、ツールが設定ファイルを必要とすると各環境で再度イメージを作ってECR等PrivateRegistryにプッシュする必要があり手間がかかるというものがありました。

これをどう解決したらいいか数年間ぼんやり考えていたのですが、

  1. GitHubでバイナリをリリースしておく
  2. lambrollでバイナリをFunctionとしてデプロイする

という方法で手軽に使えることに気がつきました。例えば、以下のようなMakefileを用意しておくことで、バイナリファイルはGitHubから取得し、仮にツールが設定ファイルを必要とする場合は自分のレポジトリ内に置いておきそれを使うことができます。

binary:
	curl -L https://github.com/takaishi/awscost/releases/download/v0.0.1/awscost_Linux_x86_64.tar.gz -o /tmp/awscost.tar.gz \
    && tar -zxvf /tmp/awscost.tar.gz -C /tmp \
    && mv /tmp/awscost ./dist/bootstrap

deploy: binary
	lambroll deploy --function="function.json" --src="./dist"

これによりPrivateRepositoryを使わずに運用できそうです。おそらく、Terraformでも同じことができると思います。

今は表示する情報がほぼ固定されているのですが、今後は様々な場所で使えるようにカスタマイズできるようにしたいと考えています。AWSの料金チェックを簡単に始めたい人は是非お試しください。