AWS BudgetsのアラートをSlackに通知する方法
~SNS+Amazon Q Developer~

ハンズオン

AWSを学習・検証していると、想定外の課金が発生しないか不安になることがあります。
AWS Budgetsのゼロ支出予算を設定しておけば、少しでもAWS利用料金が発生した際にメールで通知を受け取ることができます。

ただし、普段からSlackを利用している場合は、メールだけでなくSlackにも通知できると、より早く課金発生に気づきやすくなります。

そこで本記事では、AWS Budgetsのゼロ支出アラートを
Amazon SNSとAmazon Q Developer in chat applicationsを使ってSlackへ通知する手順
を解説します。

なお、Amazon Q Developer in chat applicationsは、以前はAWS Chatbotと呼ばれていたサービスです。

今回作成する構成

今回作成する構成は以下の通りです。

AWS BudgetsからSNSとAmazon Q Developerを経由してSlackへ通知する構成図

AWS BudgetsはSlackへ直接通知するのではなく、まずAmazon SNSトピックへ通知を送信します。

そのSNSトピックに届いた通知を、Amazon Q Developer in chat applicationsがSlackチャンネルへ転送する仕組みです。

つまり、今回のポイントは以下の2つです。

  • AWS Budgetsの通知先としてAmazon SNSトピックを設定する
  • Amazon Q Developerで、そのSNSトピックをSlackチャンネルへ連携する

前提条件

本ハンズオンを進める上での前提条件は以下です。

  • AWSアカウントを保有していること
  • AWS Budgetsでゼロ支出予算を作成済みであること
  • Slackワークスペースを利用できること
  • SlackへAmazon Q Developerアプリを追加できる権限があること

今回は、通知先Slackチャンネルとして #aws-alert を使用しています。(チャンネル名は任意)

注意 会社や組織のSlackワークスペースを利用している場合、Amazon Q Developerアプリの追加に管理者承認が必要になる場合があります。

1.Amazon SNSトピックを作成する

まず、AWS Budgetsから通知を受け取るためのAmazon SNSトピックを作成します。

AWSマネジメントコンソールで「SNS」と検索し、Amazon SNSの画面を開きます。

「トピック」⇒「トピックの作成」を選択し、以下の内容で作成します。

タイプ:スタンダード
名前:budget-alert-topic(任意ですが、本記事ではこちらの名前で説明)
表示名:任意

今回はAmazon Q Developerと連携するため、トピックタイプはスタンダードを選択します。

Amazon SNSでbudget-alert-topicを作成する画面

入力後、「トピックの作成」を選択します。

2.SNSトピックのARNを確認する

トピック作成後、作成したSNSトピックの詳細画面でARNを確認します。

このARNは、後ほどAWS Budgetsの通知先として指定するため、メモしておきます。

Amazon SNSトピックのARNを確認する画面

3.SNSトピックのアクセスポリシーを編集する

次に、AWS BudgetsがこのSNSトピックへ通知を送信できるように、SNSトピックのアクセスポリシーを編集します。

作成したSNSトピックの画面で「編集」を選択します。

アクセスポリシーのJSONエディタで、既存のデフォルトポリシーは削除せず、Statement配列の中に以下のStatementを追加します。

{
  "Sid": "AllowAWSBudgetsPublish",
  "Effect": "Allow",
  "Principal": {
    "Service": "budgets.amazonaws.com"
  },
  "Action": "SNS:Publish",
  "Resource": "<自身のSNSトピックARN>"
}

追加後のポリシー全体イメージは以下のようになります。

{
  "Version": "2008-10-17",
  "Id": "__default_policy_ID",
  "Statement": [
    {
      "Sid": "__default_statement_ID",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": [
        "SNS:GetTopicAttributes",
        "SNS:SetTopicAttributes",
        "SNS:AddPermission",
        "SNS:RemovePermission",
        "SNS:DeleteTopic",
        "SNS:Subscribe",
        "SNS:ListSubscriptionsByTopic",
        "SNS:Publish"
      ],
      "Resource": "<自身のSNSトピックARN>",
      "Condition": {
        "StringEquals": {
          "AWS:SourceOwner": "<AWSアカウントID>"
        }
      }
    },
    {
      "Sid": "AllowAWSBudgetsPublish",
      "Effect": "Allow",
      "Principal": {
        "Service": "budgets.amazonaws.com"
      },
      "Action": "SNS:Publish",
      "Resource": "<自身のSNSトピックARN>"
    }
  ]
}

編集後、「変更の保存」を選択します。

SNSトピックのアクセスポリシーにBudgetsのPublish権限を追加する画面

注意 Resourceには、自分のSNSトピックARNを指定してください。ARNが間違っていると、AWS BudgetsからSNSトピックへ通知を送信できません。

4.AWS Budgetsのゼロ支出予算にSNS通知先を追加する

次に、既存のゼロ支出予算を編集し、通知先として先ほど作成したSNSトピックARNを追加します。

AWSコンソール右上のアカウント名から「請求とコスト管理」を開き、左メニューから「Budgets」を選択します。

既存のゼロ支出予算を選択し、「編集」をクリックします。

AWS Budgetsのゼロ支出予算を編集する画面

アラート設定の通知先として、先ほどメモしたSNSトピックARNを入力します。

AWS BudgetsにSNSトピックARNを設定する画面

設定後、画面下部の保存ボタンを選択して、ゼロ支出予算の設定を保存します。

5.Amazon Q DeveloperとSlackを連携する

続いて、Amazon Q Developer in chat applicationsとSlackを連携します。

AWSマネジメントコンソールで「Amazon Q Developer in chat applications」と検索して画面を開きます。

チャットクライアントにSlackを選択し、「クライアントを設定」をクリックします。

Amazon Q DeveloperでSlackクライアントを設定する画面

Slackの認証画面に遷移するため、利用するSlackワークスペースのURLを入力して続行します。

SlackのワークスペースURLを入力する画面

Slack側でAmazon Q Developerアプリのアクセス許可画面が表示されるため、内容を確認して「許可する」をクリックします。

SlackでAmazon Q Developerアプリを許可する画面

許可が完了すると、AWSコンソール側でSlackワークスペースが連携された状態になります。

6.SlackチャンネルにAmazon Qを招待する

Slack側では、通知を受け取りたいチャンネルにAmazon Qを招待しておきます。

今回は通知先として、 #aws-alert チャンネルを使用します。
既存のチャンネルがある場合には、そちらでも問題ありません。

対象チャンネルで以下を入力します。

/invite @Amazon Q

7.Amazon Q DeveloperでSlackチャンネル設定を作成する

AWSコンソールに戻り、Amazon Q Developer in chat applicationsの画面からSlackチャンネル設定を作成します。

「新しいチャンネルを設定」を選択します。

Amazon Q Developer in chat applicationsの画面からSlackチャンネル設定を作成する画面

設定名を入力し、通知先のSlackチャンネルを指定します。
今回は以下のように設定しました。

設定名:aws-budget-alert-slack
チャンネルタイプ:パブリック
パブリックチャンネル名:aws-alert

次に、Amazon Q Developerが通知を処理するためのIAMロールを設定します。
今回はチャンネルロールを選択し、テンプレートを使用してIAMロールを作成します。
設定例は以下です。

ロール設定:チャンネルロール
チャンネルロール:テンプレートを使用してIAMロールを作成する
ロール名:QDeveloperSlackBudgetAlertRole
ポリシーテンプレート:通知のアクセス許可、Amazon Q Developerのアクセス許可
ガードレールポリシー:ReadOnlyAccess

ロール名は任意ですが、後から見たときに用途が分かるように、Slack通知用・Budget通知用と分かる名前にしておくと管理しやすいです。

続いて、通知オプションでSNSトピックを選択します。
ここでは、AWS Budgets側で通知先に指定したSNSトピックと同じものにします。

リージョン:SNSトピックを作成したリージョン
SNSトピック:budget-alert-topic

設定内容を確認し、「設定」を選択します。

Amazon Q DeveloperでSlackチャンネル設定が完了した画面

設定が完了すると、Slackチャンネルが正常に設定されたことを示すメッセージが表示されます。

8.テストメッセージでSlack通知を確認する

設定後、Amazon Q Developerの画面からテストメッセージを送信します。
作成したチャンネル設定にチェックを入れ、「テストメッセージを送信」をクリックします。

Amazon Q DeveloperからSlackへテストメッセージを送信する画面

Slackチャンネルに以下のようなテストメッセージが届けば、Amazon Q DeveloperからSlackへの通知設定は正常に動作しています。

Amazon Q DeveloperからSlackへテスト通知が届いた画面

これによりAmazon Q DeveloperからSlackへの通知が正しく動作していることを確認できます。

(参考)SNSからSlackまでの通知経路を確認する

Amazon Q Developerのテストメッセージでは、Amazon Q DeveloperからSlackまでの通知を確認できます。

さらに、SNSトピックからAmazon Q Developer経由でSlackへ通知できるか確認したい場合は、SNSからカスタム通知JSONを発行します。

{
  "version": "1.0",
  "source": "custom",
  "content": {
    "textType": "client-markdown",
    "title": "AWS Budgets Slack通知テスト",
    "description": ":white_check_mark: SNSトピックからAmazon Q Developer経由でSlackへ通知するテストです。"
  }
}

SNSトピックの「メッセージの発行」から上記JSONを送信し、Slackに通知が届けば、以下の経路を確認できます。

Amazon SNS
   ↓
Amazon Q Developer in chat applications
   ↓
Slack

注意 Amazon SNSから単純なテキストを送信しても、Amazon Q Developer経由でSlackに表示されない場合があります。
SNS経由のテストでは、Amazon Q Developerのカスタム通知形式JSONを使用します。

9.課金発生時の実通知について

今回の確認では、Amazon Q Developerのテストメッセージと、SNSからのカスタム通知により、Slack通知経路を確認しました。

一方で、AWS Budgetsのゼロ支出アラートそのものは、実際にAWS利用料が発生したタイミングで送信されます。
そのため、課金を発生させずにBudgetアラート自体を完全に発火させることはできません。

ただし、BudgetsにSNSトピックARNを設定できており、SNSからSlackまでの通知経路も確認できていれば、実際にBudgetアラートが発生した際には同じ経路でSlackへ通知される構成になります。

今回確認できた範囲を整理すると以下の通りです。

  • Amazon Q Developer → Slack:テストメッセージで確認済み
  • Amazon SNS → Amazon Q Developer → Slack:SNSカスタム通知で確認済み
  • AWS Budgets → Amazon SNS:課金発生時にBudgetアラートとして実行

つまり、SNSトピックに通知が届けば、Slackチャンネルまで通知されることを確認できた状態です。

10.ハマりやすいポイント

SNSトピックはスタンダードを選ぶ

Amazon Q Developerと連携するSNSトピックは、スタンダードタイプを使用します。
トピック作成時にFIFOではなく、通常のスタンダードトピックを選択してください。

Budgets用のSNS Publish権限を忘れない

AWS BudgetsからSNSトピックへ通知を送信するには、SNSトピックのアクセスポリシーに budgets.amazonaws.com からの SNS:Publish を許可するStatementを追加する必要があります。

Budgets側とAmazon Q Developer側で同じSNSトピックを指定する

Budgets側で指定するSNSトピックと、Amazon Q Developer側で指定するSNSトピックが違うと、通知がSlackまで届きません。
どちらも同じ budget-alert-topic を指定しているか確認してください。

SlackチャンネルにAmazon Qを招待する

Slack側で /invite @Amazon Q を実行し、通知先チャンネルにAmazon Qを参加させておきます。
チャンネルにAmazon Qが参加していない場合、通知が届かない原因になります。

SNSから普通の文章を送っても届かない場合がある

SNSから手動テストする場合、単純なテキストメッセージではなく、Amazon Q Developerのカスタム通知形式JSONを使用します。

本記事で紹介したJSON形式で送信することで、SNS → Amazon Q Developer → Slack の経路確認ができます。

11.リソースの削除について

今回作成した構成を今後も課金監視に利用する場合は、リソースを削除する必要はありません。
不要になった場合のみ、以下の順番で削除します。

  • AWS Budgetsの通知先SNSトピック設定を削除
  • Amazon Q DeveloperのSlackチャンネル設定を削除
  • SNSトピックを削除
  • 必要に応じてIAMロールを削除

注意 SNSトピックを削除すると、BudgetsからSlackへ通知できなくなります。継続利用する場合は削除しないでください。

まとめ

今回は、AWS Budgetsのゼロ支出アラートをSlackへ通知するために、Amazon SNSとAmazon Q Developer in chat applicationsを連携する手順を解説しました。

今回の構成では、AWS BudgetsがSNSトピックへ通知を送信し、その通知をAmazon Q DeveloperがSlackチャンネルへ転送します。

AWSの学習や検証を行う際は、想定外の課金に早く気づけるよう、メール通知だけでなくSlack通知も設定しておくと安心です。

今後もAWSを使ったハンズオン記事を発信していく予定ですので、ぜひ参考にしてみてください。

コメント

タイトルとURLをコピーしました