はじめに
削除し忘れた AWS リソースが放置されて思わぬ課金が発生した経験から、手軽にコストを把握したいと思い、Slack に自動通知するツールを作成しました。
AWS の利用料金を Slack に通知するツールはすでに多く紹介されていますが、前日 / 前週比・サービス別積み上げグラフ・円換算をまとめて確認できるものが欲しかったため自作することにしました。
本記事では、システム概要・アーキテクチャ・実装のポイントを紹介します。
本記事の情報は 2026 年 5 月時点のものです。最新情報については公式ドキュメントをご確認ください。
この記事でわかること
- AWS 利用料金を Slack に通知するツールの全体像がわかる
- AWS CDK で同等のサーバーレス通知基盤を構築できるようになる
- Cost Explorer API・QuickChart.io・Slack Incoming Webhook を組み合わせた実装の工夫がわかる
ターゲット
- AWS Lambda・CDK を使ったことがある方
- AWS の利用料金を可視化・通知したい方
- Slack App や Incoming Webhook を活用した自動化に興味がある方
1. ツール概要
本ツールは、AWS の前日コストをサービス別に集計し、毎朝 JST 9:00 に Slack へ自動通知するサーバーレスアプリケーションです。
主な機能は以下のとおりです。
- サービス別内訳:Top N(デフォルト 5)+ Others に集計して表示
- 比較指標:前日比・前週同曜日比を日本語で自動計算
- 可視化:過去 7 日間のサービス別コストを積み上げ棒グラフで表示
- 通貨:USD と JPY を併記(為替レートは外部 API から取得、失敗時は 150 円でフォールバック)
- 月累計(MTD):当月分の累計コストもあわせて通知
既存の通知ツールとの差別化ポイントは、前日比 / 前週比・グラフ・円換算を 1 メッセージにまとめている点です。コストの変化と内訳を一目で把握できるため、無駄なリソースの早期発見に役立ちます。
以下のような通知が毎朝Slackの特定のチャンネルに届きます。
2. 用語解説:Cost Explorer・Incoming Webhook・QuickChart とは
AWS Cost Explorer
AWS Cost Explorer は、AWS の利用料金を可視化・分析するためのサービスです。Cost Explorer API(GetCostAndUsage など)を使うと、サービス別・日次・月次など任意の粒度でコストデータを取得できます。
- API エンドポイントは
us-east-1のみで提供される - API コール 1 回あたり
0.01USD の料金が発生するため、呼び出し回数の最適化が重要
Slack Incoming Webhook
Slack Incoming Webhook は、外部システムから Slack チャンネルにメッセージを投稿するための仕組みです。Webhook URL に対して JSON を POST するだけで投稿できます。
- メッセージは Slack の Block Kit で構造化できる
- 画像・テキスト・区切り線などのブロックを組み合わせてリッチな通知を作成できる
QuickChart.io
QuickChart.io は、Chart.js の設定を URL パラメータとして渡すことで、PNG 画像を返してくれる無料のチャート画像生成サービスです。Slack のメッセージ内に画像 URL を埋め込むだけでグラフを表示できます。
SSM Parameter Store(SecureString)
AWS Systems Manager の Parameter Store は、設定値や認証情報を一元管理できるサービスです。SecureString タイプを使うと、KMS で暗号化した状態で値を保存できます。本ツールでは Slack Webhook URL の保管に利用します。
3. システム構成図
以下は、本記事で紹介するシステムの全体像です。
3.1 システムの流れ
- EventBridge が cron スケジュールで Lambda を起動
- Lambda が SSM Parameter Store から Slack Webhook URLを取得
- Lambda が Cost Explorer API(GetCostAndUsage)を呼び出し、月初〜前日の日次コストデータを一括取得
- Lambda が外部為替 API から USD/JPYレートを取得(取得失敗時は 150 円でフォールバック)
- Lambdaが取得データをもとに、前日比・前週同曜日比・MTD・サービス別 TopNを計算・整形
- Lambda が QuickChart.io に Chart.js 設定を渡し、過去 7日間の積み上げ棒グラフ URL を生成
- Lambda が整形済みの Block Kit メッセージを Slack Incoming Webhook に POST
4. 構築方法
前提条件
- AWS アカウントが作成済みであること
- AWS CLI が設定済みであること
- Node.js
24.xがインストール済みであること - Slack ワークスペースの管理者権限を持っていること
手順
1. Slack App の作成と Incoming Webhook URL の取得
Slack App ディレクトリにアクセスし、新規 App を作成します。
-
Create New App→From scratchを選択 - App 名(例:
AWSコスト日報)と通知先ワークスペースを指定 -
Incoming Webhooksを有効化し、通知先チャンネルを選んで Webhook URL を発行
発行された Webhook URL(https://hooks.slack.com/services/XXX/YYY/ZZZ)を控えておきます。
2. リポジトリのクローン
git clone https://github.com/4suke-sun/aws-daily-cost-slack-notifier.git
cd aws-daily-cost-slack-notifier
npm install
3. SSM Parameter Store に Webhook URL を登録
aws ssm put-parameter \
--name /daily-cost-notifier/slack-webhook-url \
--type SecureString \
--value "https://hooks.slack.com/services/XXX/YYY/ZZZ" \
主な設定値は以下のとおりです。
- パラメータ名:
/daily-cost-notifier/slack-webhook-url - タイプ:
SecureString(KMS で暗号化)
注意: Webhook URL が漏洩すると、第三者があなたのSlackワークスペースの特定のチャンネルに対して、自由にメッセージを投稿できる状態になりますので管理にはご注意ください。
4. CDK Bootstrap(初回のみ)
npx cdk bootstrap aws://${アカウントID}/ap-northeast-1
5. デプロイ
npm run cdk:deploy
CDK Context でパラメータを上書きすることもできます。
# Top 10 サービス・実行時刻を JST 10:00 (UTC 1) に変更する例
npm run cdk:deploy -- -c topN=10 -c scheduleUtcHour=1
設定可能な主な Context パラメータは以下のとおりです。
| パラメータ | 説明 | デフォルト |
|---|---|---|
ssmParameterPath |
Webhook URL の SSM パス | /daily-cost-notifier/slack-webhook-url |
topN |
通知するサービスの上位件数 | 5 |
scheduleUtcHour |
実行時刻(UTC) |
0(JST 9:00) |
enableWeekOverWeek |
月初 1〜7 日も前週比を取得 | false |
CDK スタックでは、以下の AWS リソースが作成されます。
- Lambda 関数:
Node.js 24.x/ メモリ256MB / タイムアウト30秒 - EventBridge Rule:cron スケジュール(毎日
scheduleUtcHour時 0 分 UTC) - IAM Policy:
-
ssm:GetParameter(対象パスのみに限定) -
ce:GetCostAndUsage(Cost Explorer はリソースレベル制御不可のためワイルドカード)
-
- CloudWatch Logs:ロググループ(無期限保持)
補足: Cost Explorer はリソースレベルでのアクセス制御に対応していないため、CDK スタックでは cdk-nag の警告(AwsSolutions-IAM5)を明示的に抑制しています。
5. 動作確認
デプロイ後、EventBridge の Test schedule 機能や、Lambda コンソールから手動でテスト実行できます。
①のように AWS マネジメントコンソールから対象 Lambda 関数を開き、Test ボタンで実行します。イベントペイロードは空 {} で問題ありません。
②のように設定したチャンネルに通知が届いていることを確認します。
③のように QuickChart.io によって生成された積み上げ棒グラフが、過去 7 日間のサービス別コスト推移として表示されていることを確認します。
6. 実装のポイント
Cost Explorer API の呼び出し回数最適化
Cost Explorer API は 1 コールあたり 0.01 USD の料金が発生します。日別・週別などを個別に取得すると、その取得回数分料金が発生してしまい本末転倒なため、本ツールでは、1 回のクエリで月初〜前日の日次データをまとめて取得し、以下すべての計算に流用しています。
- 前日コスト
- 前日比(前日 vs 前々日)
- 前週同曜日比
- 月累計(MTD)
- 過去 7 日間のグラフデータ
これにより、通常は 1 日 1 回の API コール で完結します。enableWeekOverWeek=true を有効にした場合のみ、月初 1〜7 日に前月末データを追加取得するため 2 回 / 日 となります。
為替レート取得失敗時のフォールバック
為替レートの取得には、OSS である fawazahmed0/exchange-apiを使用しています。
jsDelivr CDN 経由のエンドポイントをプライマリとし、障害時に備えて公式ミラー(currency-api.pages.dev)へ自動フォールバックする二段構えの実装をしています。それでも両方の取得に失敗した場合は 150円固定でフォールバックします。これにより、為替APIの障害で通知自体が止まることを防いでいます。
QuickChart.io によるグラフ画像生成
Lambda 内で画像を生成すると chart.js や canvas などの重いライブラリが必要になりますが、QuickChart.io を使うことで Chart.js の設定 JSON を URL パラメータとして渡すだけで PNG 画像が生成できます。Slack の image ブロックにこの URL を指定するだけでグラフが表示されます。
7. まとめ
AWS の利用料金を毎朝 Slack に自動通知するツールを CDK で構築しました。Cost Explorer API・QuickChart・Slack Incoming Webhook を組み合わせることで、前日比・前週比・グラフ・円換算を 1 メッセージで把握できる運用が実現できました。
毎朝の確認が習慣化することで、削除し忘れリソースの早期発見にも役立っています。今後は閾値超過時のアラート通知や、複数アカウント対応も試してみたいと思います。





