はじめに
AWSのコスト管理はクラウド環境を運用する上で非常に重要です。特に、コストの増加をリアルタイムで把握することは予算オーバーを防ぐための鍵です。本記事では、AWS LambdaとEventBridgeを使って、毎日決まった時間にAWSの利用料金をSlackに通知する仕組みを構築する手順を詳しく解説します。
この設定により、毎日のAWSコスト情報をSlackで簡単に確認でき、予算管理が容易になります。以下の手順を進めるだけで、複雑なサーバー構築やSNSの利用なしで簡単に通知機能を設定できます。
前提条件
- AWSアカウントを持っていること。
- SlackでIncoming Webhook URLが作成済みであること(Slackの通知を設定するために必要です)。
- AWS Cost Explorerが有効化されていること(AWS Billing Management Consoleから有効化できます)。
ステップ 1: Slack Webhookの取得
まず、通知を送信したいSlackチャンネルにIncoming Webhookを設定し、Webhook URLを取得します。
- Slack APIページにアクセス。
- 通知を受信したいチャンネルを選択し、Incoming Webhookを有効にします。
- Webhook URLが生成されるので、これをメモしておきます(例:
https://hooks.slack.com/services/XXXX/XXXX/XXXX
)。
ステップ 2: IAMロールとポリシーの設定
AWS Lambda関数がAWS Cost Explorer APIにアクセスするための権限を持つIAMロールを作成します。
-
AWS Management Consoleで「IAM」に移動。
-
ロールを選択し、「ロールの作成」をクリック。
-
「AWSサービス」を選択し、「Lambda」を選択して「次のステップ: アタッチするポリシー」をクリックします。
-
「ポリシーの作成」をクリックし、以下のJSONを使ってカスタムポリシーを作成します:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ce:GetCostAndUsage" ], "Resource": "*" } ] }
-
このポリシーに名前を付け(例:
CostExplorerAccessPolicy
)、ロールにアタッチします。 -
「ロールの作成」をクリックして、Lambda関数で使用するIAMロールを完成させます。
ステップ 3: Lambda関数の作成
-
AWS Lambdaコンソールに移動し、「関数の作成」を選択します。
- ランタイム: Python 3.8以上
-
実行ロール: 先ほど作成したIAMロール(例:
CostExplorerLambdaRole
)
-
以下のコードをLambda関数に貼り付けます。このコードは、AWS Cost Explorerからデータを取得し、SlackのWebhookに利用料金を通知します。
Lambda関数のコード
import json
import boto3
import os
import http.client
from datetime import datetime, timezone
# 環境変数からSlack Webhook URLと予算額を取得
SLACK_WEBHOOK_URL = os.environ['SLACK_WEBHOOK_URL']
BUDGET_AMOUNT = float(os.environ.get('BUDGET_AMOUNT', 50000.0))
def lambda_handler(event, context):
# AWS Cost Explorerクライアントの初期化
client = boto3.client('ce', region_name='us-east-1')
# 本日の日付
today = datetime.now(timezone.utc).strftime('%Y-%m-%d')
start_date = today[:8] + "01" # 月の初日
# 月初から本日までの合計利用料金を取得
response = client.get_cost_and_usage(
TimePeriod={'Start': start_date, 'End': today},
Granularity='DAILY',
Metrics=['UnblendedCost']
)
# 利用料金の取得
today_cost = float(response['ResultsByTime'][-1]['Total']['UnblendedCost']['Amount'])
month_to_date_cost = sum(float(day['Total']['UnblendedCost']['Amount']) for day in response['ResultsByTime'])
# 通知メッセージ
message = f"""
予算額: {BUDGET_AMOUNT:.2f} USD
利用料金(本日): {today_cost:.2f} USD
利用開始日時: 2024-11-06T07:00:00Z
今月の利用料金: {month_to_date_cost:.2f} USD
"""
# Slack WebhookのURLからホストとパスを分割
url_parts = SLACK_WEBHOOK_URL.replace("https://", "").split("/", 1)
host = url_parts[0]
path = "/" + url_parts[1]
# Slackに通知を送信
conn = http.client.HTTPSConnection(host)
payload = json.dumps({"text": message})
headers = {'Content-Type': 'application/json'}
conn.request("POST", path, body=payload, headers=headers)
response = conn.getresponse()
conn.close()
return {
'statusCode': response.status,
'body': response.read().decode()
}
Lambda関数の環境変数設定
ステップ 4: タイムアウトとメモリの設定
このLambda関数が適切に動作するためには、以下の設定も変更します。
ステップ 5: EventBridgeでスケジュールを設定
次に、毎日19時にこのLambda関数を実行するために、EventBridgeでスケジュールを設定します。
- EventBridgeのコンソールに移動。
- 「ルール」をクリックし、「ルールの作成」を選択。
- ルールの名前を入力(例:
DailyAWSCostNotification
)。 - スケジュールパターンで「Cron式」を選び、以下の式を入力します:
毎日19時の月曜日から金曜日
- ターゲットでLambda関数を選択し、「ルールの作成」をクリック。
完成したスケジュール
ステップ 6: 動作確認
設定が完了したら、Lambda関数を手動でテストして動作を確認します。
トラブルシューティング
- 「リクエストのタイムアウト」エラー: タイムアウト時間が足りない場合は、「タイムアウト」設定を増やします。
- Slackに通知が届かない: Webhook URLが正しいか確認してください。また、環境変数が設定されていることを確認してください。
まとめ
以上の設定で、毎日決まった時間にAWSの利用料金をSlackに通知する仕組みが完成しました。この設定により、予算を超えないようにコストをリアルタイムで管理し、不要な出費を防ぐことが可能です。AWSのコスト管理は、プロジェクトの健全な運営に不可欠です。定期的な通知を活用し、コストが計画通りに推移しているかを確認しましょう。