こんにちは。
AWSマルチアカウント環境を管理している者です。
マルチアカウント環境を運用しながら出てくる課題の1つは、各アカウントで発生するコストを把握して予算をオーバーしないように管理することです。
AWSは、「AWS Budgets」という予算を管理する機能を提供しています。今回、このAWS Budgets機能をカスタマイズしてAWS SNSを通じMicrosoft Teamsに通知を送る仕組みを作ってみましたので共有します。
アーキテクチャ
-
通常時(予算のしきい値を超えてない時)は、AWSコンソールよりアカウント別の予算とコスト状況が確認できます。また、CSVダウンロードやレポートのメール送信も可能です。
-
予測コストが予算の90%を超過した時、指定先のTeamsチャネルにてアラートします。超過時のアクションについては、Teamsチャネルメッセージとメール送信どちらも選択可能ですが確認が早いTeamsにしました。
AWS Budgets 設定項目
通知する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回のみ発生します。
しかし、実際コストベースではない予測コストアラートは複数回アラートが発生する場合もあります。 → 詳しくはこちら - 複数回アラートを発生させたい場合は、以下のように複数のしきい値条件を追加することで実現できます。もちろん予測コストと実際コストのアラートを組み合わせることも可能です。