こんにちは。
AWSマルチアカウント環境を管理している者です。
マルチアカウント環境を運用する上で発生する課題の1つは、各AWSアカウントで発生するコストを把握して、組織全体の予算をオーバーしないように管理することだと思います。
AWSは、「AWS Budgets」という予算を管理する機能を提供しています。
この記事では、AWS Budgets機能をカスタマイズしてAWS SNSを通じMicrosoft Teamsへ通知する仕組みを紹介します。
実際のアーキテクチャと実装したコードも載せておりますのでご参考になればと思います。
アーキテクチャ
-
通常時(予算のしきい値を超えてない時)は、AWSコンソールよりアカウント別の予算とコスト状況が確認できます。また、CSVダウンロードやレポートのメール送信も可能です。
-
予測コストが予算の90%を超過した時、指定先のTeamsチャネルへ通知を送ります。超過時のアクションについては、Teamsチャネルメッセージとメール送信どちらも選択可能ですが、今回は素早く確認が可能なTeamsにしました。
AWS Budgets 設定項目
-
アラートのトリガー:以下のように、「予測」および「実際」コストの何パーセント(閾値)を超えたらアラートするか設定できます。
-
アラートの通知先:選択できる通知先は複数あり、以下のように、Eメール・SNSトピック・Amazon Chatbotがあります。今回の場合は、SNSトピックを選択し、SNSトピックからTeamsへ通知するようにしました。
-
対象アカウントを絞ってコストを把握したい場合:予算の範囲の範囲オプションで「特定のAWSコストディメンションをフィルタリング」を選択し、リンクされたアカウントから対象アカウントを絞ることができます。
実装したLambdaコード
import urllib3
import json
http = urllib3.PoolManager()
def lambda_handler(event, context):
url = "TeamsチャネルのWebhookアドレス"
msg = {
"text": event['Records'][0]['Sns']['Message']
}
encoded_msg = json.dumps(msg).encode('utf-8')
response = http.request('POST',url, body=encoded_msg)
# ...
今回の場合は、特にメッセージを加工せずAmazon SNSからのメッセージをそのまま送るようにしています。
メッセージの加工が必要な場合は、event['Records'][0]['Sns']['Message'] の値を用いて加工するようにすればいいでしょう。
実装中に気づいた注意事項
-
アラートはしきい値を超えた最初の1回のみ発生します。
しかし、実際コストベースではない予測コストアラートは複数回アラートが発生する場合もあります。 → 詳しくはこちら - 複数回アラートを発生させたい場合は、以下のように複数のしきい値条件を追加することで実現できます。もちろん予測コストと実際コストのアラートを組み合わせることも可能です。