実践で学ぶDevOpsツールの使いこなし術 24

「AWS Budgets」のアラートをSlackに通知する仕組みを構築してみよう

第24回の今回は、「AWS Budgets」のアラートをSNSと「Amazon Q Developer」を経由してSlackに通知する仕組みを構築する方法を解説します。

田中 智明

6:30

はじめに

前回では「AWS Cost Explorer」でAWSインフラのコストを可視化し、「AWS Budgets」で予算アラートを設定する方法を学びました。予算の50%・80%・100%それぞれのしきい値を超えたときにメールで通知が届くよう設定しました。

メール通知は手軽に設定できる一方、実際の運用ではいくつかの課題があります。

  • 大量のメールに埋もれて見落としてしまう
  • チームメンバー全員がリアルタイムに把握しにくい
  • メールクライアントを開かないと気づけない

また、コストアラートはサービス障害のような緊急対応が必要な通知ではありません。気づいたメンバーが確認し、チームで対応を検討できれば十分です。Slackはこうした「すぐに対応が必要ではないが、チームで共有したい情報」に適しています。通知をチャンネルに流すことで、担当者だけでなくチーム全体が同じタイミングで状況を把握できます。

本記事では、第20回で解説した「Amazon SNS」と「Amazon Q Developer」(旧AWS Chatbot)を活用して、AWS BudgetsのアラートをSlackチャンネルへ通知する方法を解説します。

全体の構成

今回構築する通知の流れは以下のとおりです。

AWS Budgets → Amazon SNS → Amazon Q Developer → Slack

各コンポーネントの役割は次のとおりです。

  • AWS Budgets: 予算のしきい値を監視し、超過時にSNSトピックへメッセージを送信
  • Amazon SNS: メッセージのハブとして機能し、複数の通知先に配信
  • Amazon Q Developer: SNSトピックを購読し、Slackチャンネルへ転送
  • Slack: チームへの最終的な通知先

第20回では「CloudWatch」アラームをSNS経由でSlackに通知する構成を解説しました。今回はコスト通知専用のSNSトピックを作成し、同様の仕組みをAWS Budgetsに適用します。

コスト通知用SNSトピックの作成

SNSトピックの作成

コスト通知専用のSNSトピックを作成します。第20回で作成したeks-dev-alertsはインフラ監視用のため、コスト通知は別トピックとして分けておくと管理しやすくなります。

Terraformで管理している場合は、以下のコードを追加します。

# terraform/environments/dev/main.tf

resource "aws_sns_topic" "cost_alerts" {
  name = "cost-alerts"
}

BudgetsからのPublishを許可するポリシーの設定

AWS BudgetsがSNSトピックにメッセージを送信するには、明示的にPublish権限を付与する必要があります。この設定を忘れると、予算のしきい値を超えてもSNSに通知が届きません。

resource "aws_sns_topic_policy" "cost_alerts" {
  arn = aws_sns_topic.cost_alerts.arn

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Sid    = "AllowBudgetsPublish"
        Effect = "Allow"
        Principal = {
          Service = "budgets.amazonaws.com"
        }
        Action   = "SNS:Publish"
        Resource = aws_sns_topic.cost_alerts.arn
      }
    ]
  })
}

terraform applyを実行してリソースを作成したら、SNSコンソールでトピックのARNを確認しておきます。後でAmazon Q DeveloperとAWS Budgetsの設定に使います。

SNSトピックの作成とARNの確認

Amazon Q DeveloperにSNSトピックを追加

第20回でAmazon Q Developerのコンソールを開き、Slackワークスペースとチャンネルを設定しました。今回はコスト通知専用のチャンネル設定を新たに作成し、cost-alertsトピックを連携させます。

  1. Amazon Q Developerコンソールを開いて「クライアントを設定」をクリックするとSlackのOAuth画面に遷移します。ワークスペースにサインインして「許可する」をクリックするとAmazon Q DeveloperアプリがSlackワークスペースにインストールされ、認証が完了します。この手順はコンソールでのみ実施できます。
    Amazon Q Developerコンソール
    Amazon Q DeveloperでSlackワークスペースを認証
  2. ワークスペースの認証が完了したら、Terraformでチャンネル設定を管理します。コスト通知は#cost-alertsのような専用チャンネルに送ることで、インフラ監視の通知と混在させずに管理できます。
    # terraform/environments/dev/main.tf
    
    # Amazon Q DeveloperがSNS通知をSlackに転送するためのIAMロール
    resource "aws_iam_role" "q_developer" {
      name = "amazon-q-developer-role"
    
      assume_role_policy = jsonencode({
        Version = "2012-10-17"
        Statement = [{
          Effect    = "Allow"
          Principal = { Service = "chatbot.amazonaws.com" }
          Action    = "sts:AssumeRole"
        }]
      })
    }
    
    resource "aws_iam_role_policy_attachment" "q_developer" {
      role       = aws_iam_role.q_developer.name
      policy_arn = "arn:aws:iam::aws:policy/ReadOnlyAccess"
    }
    
    # Slackチャンネル設定
    resource "aws_chatbot_slack_channel_configuration" "cost_alerts" {
      configuration_name = "cost-alerts-channel"
      iam_role_arn       = aws_iam_role.q_developer.arn
      slack_team_id      = "TXXXXXXXX"  # SlackワークスペースID
      slack_channel_id   = "CXXXXXXXX"  # SlackチャンネルID(#cost-alerts)
    
      sns_topic_arns       = [aws_sns_topic.cost_alerts.arn]
      guardrail_policy_arns = ["arn:aws:iam::aws:policy/ReadOnlyAccess"]
    }
    slack_team_idはSlackワークスペースのID、slack_channel_idはチャンネルのIDです。確認方法はSlackのヘルプページのURL・IDを確認するを参照してください。
  3. terraform applyを実行すると、cost-alertsトピックへのメッセージがSlackチャンネルへ転送されるようになります。
  4. 最後に、通知先のSlackチャンネルにAmazon Q Developerアプリを招待します。Slackで対象チャンネルを開き、以下のコマンドを送信します。
    /invite @Amazon Q
    この手順を忘れると、SNSからメッセージが届いてもSlackチャンネルに投稿されません。

AWS BudgetsにSNS通知を追加

既存の予算を編集する

前回で作成したmonthly-budgetにSNS通知を追加します。

  1. 「請求とコスト管理」ダッシュボードの左側メニューから「予算」を選択し、monthly-budgetの行の「編集」をクリックします。
  2. アラートの設定画面で、各アラートに「Amazon SNSアラート」を追加します。「Amazon SNS ARNを選択」にcost-alertsトピックのARNを入力します。
    予算のアラート設定にSNSトピックを追加
    50%・80%・100%の各アラートすべてにSNSトピックを設定しておくと、段階的にSlack通知を受け取れます。

TerraformでBudgetsを管理している場合

Terraformで予算を管理している場合は、aws_budgets_budgetリソースのnotificationブロックにsubscriber_sns_topic_arnsを追加します。

resource "aws_budgets_budget" "monthly" {
  name         = "monthly-budget"
  budget_type  = "COST"
  limit_amount = "100"
  limit_unit   = "USD"
  time_unit    = "MONTHLY"

  notification {
    comparison_operator        = "GREATER_THAN"
    threshold                  = 50
    threshold_type             = "PERCENTAGE"
    notification_type          = "ACTUAL"
    subscriber_email_addresses = ["your-email@example.com"]
    subscriber_sns_topic_arns  = [aws_sns_topic.cost_alerts.arn]
  }

  notification {
    comparison_operator        = "GREATER_THAN"
    threshold                  = 80
    threshold_type             = "PERCENTAGE"
    notification_type          = "ACTUAL"
    subscriber_email_addresses = ["your-email@example.com"]
    subscriber_sns_topic_arns  = [aws_sns_topic.cost_alerts.arn]
  }

  notification {
    comparison_operator        = "GREATER_THAN"
    threshold                  = 100
    threshold_type             = "PERCENTAGE"
    notification_type          = "ACTUAL"
    subscriber_email_addresses = ["your-email@example.com"]
    subscriber_sns_topic_arns  = [aws_sns_topic.cost_alerts.arn]
  }
}

動作確認

設定が完了したら、テスト通知を送信して動作を確認してみましょう。

  1. Amazon Q Developerコンソールでcost-alerts-channelの設定画面を開き、「テストメッセージを送信」をクリックします。
    Amazon Q Developerのテストメッセージ送信
  2. Slackチャンネルに通知が届いたことを確認します。
    Slackに届いたテストメッセージを確認
  3. ここまで設定ができたら、予算オーバーした時にアラートがSlackに飛ぶはずです。実際に確認するにはアラートのしきい値を極端に小さくしてみるなどして、アラートを発生させてみてください。
    アラートのしきい値を10% 20% 30%にしてテスト

おわりに

本記事では、AWS BudgetsのアラートをSNSとAmazon Q Developerを経由してSlackに通知する仕組みを構築しました。メール通知に加えてSlack通知を設定することで、以下が実現できます。

  • 見落としの防止: チームが常に使うSlackに通知が届くため、見落としが減る
  • チームでの情報共有: チャンネルに投稿されることで、担当者不在でもチーム全体が状況を把握できる
  • 即時対応: しきい値超過をリアルタイムに検知し、早期にコスト最適化の対策を取れる

今回はSNSのメッセージをそのままSlackに転送しましたが、通知メッセージをカスタマイズしたい場合は、SNSとSlackの間にLambda関数を挟んでSlack Webhook APIを呼び出す方法もあります。

次回(第25回)は、AWS CloudTrailを使ってAWSアカウント上の操作履歴を記録・監視する方法を解説します。

この記事をシェアしてください

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored