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は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と連携するため、トピックタイプはスタンダードを選択します。

入力後、「トピックの作成」を選択します。
2.SNSトピックのARNを確認する
トピック作成後、作成したSNSトピックの詳細画面でARNを確認します。
このARNは、後ほどAWS Budgetsの通知先として指定するため、メモしておきます。

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>"
}
]
}
編集後、「変更の保存」を選択します。

注意 Resourceには、自分のSNSトピックARNを指定してください。ARNが間違っていると、AWS BudgetsからSNSトピックへ通知を送信できません。
4.AWS Budgetsのゼロ支出予算にSNS通知先を追加する
次に、既存のゼロ支出予算を編集し、通知先として先ほど作成した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を選択し、「クライアントを設定」をクリックします。

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

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チャンネル設定を作成します。
「新しいチャンネルを設定」を選択します。

設定名を入力し、通知先の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
設定内容を確認し、「設定」を選択します。

設定が完了すると、Slackチャンネルが正常に設定されたことを示すメッセージが表示されます。
8.テストメッセージで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を使ったハンズオン記事を発信していく予定ですので、ぜひ参考にしてみてください。

コメント