はじめに
AWSの利用料金は、気づかないうちに想定を超えることがあります。特に複数のサービスを利用している場合、どのサービスでコストが発生しているかを把握することは困難です。
本記事では、AWS CDK(TypeScript)を使用して、前日のAWS利用料金をサービス毎に集計し、毎日定時にメール通知するシステムの構築方法を解説します。
システム概要
解決する課題
- AWS Cost Explorerの手動確認の手間
- サービス毎のコスト内訳の可視化不足
- 不要なリソースの消し忘れによる無駄なコスト
システムの特徴
- 毎日18時(JST)に前日の請求額を自動通知
- サービス毎の詳細な利用料金を表示
- 月額約0.30ドルの低コストで運用可能
- CDKによるインフラのコード管理
アーキテクチャ
システム構成図
データフロー図
コンポーネント詳細
実装アーキテクチャ
プロジェクト構造
aws-cost-alert/
├── bin/
│ └── alert-cdk.ts # CDKアプリケーションエントリポイント
├── lib/
│ └── alert-cdk-stack.ts # スタック定義
├── lambda/
│ ├── cost-tracker/
│ │ └── index.ts # Lambda関数
│ └── layers/
│ └── aws-sdk/ # AWS SDK Layer
├── cdk.json
├── package.json
└── tsconfig.json
CDKスタック構成
主要なリソースとその役割:
- SNS Topic: メール配信の管理
- Lambda Function: Cost Explorer APIからデータ取得と整形
- EventBridge Rule: 定時実行のスケジューリング
- IAM Role: 必要最小限の権限管理
Lambda関数の処理フロー
通知メールの形式
メール件名
AWS Daily Cost Report - $12.34 USD (2024-12-14)
メール本文の構成
AWS Cost Report for 2024-12-14
==================================================
Total Cost: $12.34 USD
Service Breakdown:
--------------------------------------------------
Amazon EC2:
$8.5678 USD (69.4%)
Amazon RDS:
$2.3456 USD (19.0%)
Amazon S3:
$0.9876 USD (8.0%)
AWS Lambda:
$0.4390 USD (3.6%)
--------------------------------------------------
Tips:
• Review unused resources in high-cost services
• Consider using Reserved Instances or Savings Plans
• Enable auto-shutdown for development environments
デプロイ手順
前提条件
- AWS CLIの設定完了
- Node.js 18以上のインストール
- AWS CDK CLIのインストール
セットアップコマンド
# 依存関係のインストール
npm install
# CDKブートストラップ(初回のみ)
npx cdk bootstrap
# スタックのデプロイ
npm run deploy
SNSサブスクリプションの確認
デプロイ完了後、登録したメールアドレスにAWS SNSから確認メールが送信されます。メール内のリンクをクリックしてサブスクリプションを有効化する必要があります。
カスタマイズ方法
通知時間の変更
EventBridgeのcron式を修正することで通知時間を変更できます。
希望時間(JST) | cron式 (UTC) |
---|---|
朝9時 | 0 0 * * ? * |
昼12時 | 0 3 * * ? * |
夕方18時 | 0 9 * * ? * |
夜21時 | 0 12 * * ? * |
集計期間の変更
デフォルトでは前日のデータを集計しますが、週次や月次の集計に変更することも可能です。
フィルタリング条件
0.01ドル未満のサービスは除外していますが、この閾値は調整可能です。また、特定のサービスのみを対象にすることもできます。
トラブルシューティング
よくある問題と対処法
問題 | 原因 | 対処法 |
---|---|---|
メールが届かない | SNSサブスクリプション未確認 | 確認メールのリンクをクリック |
Cost Explorer APIエラー | APIが無効 | AWSコンソールでCost Explorer APIを有効化 |
Lambda タイムアウト | API応答遅延 | タイムアウト時間を延長 |
権限エラー | IAMポリシー不足 | Cost Explorer読み取り権限を追加 |
ログの確認方法
CloudWatch Logsで以下のロググループを確認:
/aws/lambda/alert-cost-tracker
ベストプラクティス
セキュリティ
- IAMロールは最小権限の原則に従う
- SNSトピックへのアクセスを制限
- 機密情報をログに出力しない
運用
- 定期的にコスト傾向を分析
- 異常値検知のロジックを追加
- 複数の通知先を設定してリダンダンシーを確保
拡張性
- タグベースのコスト配分を活用
- 部門やプロジェクト毎の集計機能を追加
- コスト予測機能の実装
AWS Well-Architectedフレームワークとの整合性
コスト最適化
- 使用量に応じた課金モデル(サーバーレス)
- 不要なリソースの早期発見と削除
運用上の優秀性
- インフラのコード化(CDK)
- 自動化による運用負荷の削減
信頼性
- マネージドサービスの活用
- リトライ機能の実装
まとめ
本システムにより、AWSのコスト管理を自動化し、日々のコスト変動を可視化できます。低コストで運用でき、不要なリソースの早期発見により大幅なコスト削減が期待できます。
CDKを使用することで、インフラをコードとして管理し、バージョン管理や環境の再現が容易になります。また、TypeScriptによる型安全な実装により、保守性の高いシステムを構築できます。