Tagbangers Blog

Cost Anomaly Detection で検知した異常コストを Slack へ通知するよう設定してみた

Cost Anomaly Detection は、いくつか簡単な設定をするだけで異常なコストが発生していないか監視することができ、任意のしきい値でアラート通知を受け取ることができる機能のようです。
今回は Cost Anomaly Detection を使用し、コストモニターが異常を検出したときにAmazon SNS によって指定した Slack チャンネルへ通知するように設定したところまでを紹介します。
運用した結果については別途ご紹介したいと思っています。

設定してみた

全体の流れは以下の通りです。

  • Slack API を作成
  • Lambda 関数を作成
  • SNS トピックを作成
  • コストモニターを作成

Slack API を作成

https://api.slack.com/ で適当に App を作成し、Activate Incoming Webhooks を有効にしました。

Lambda 関数を作成

Amazon Lambda コンソール (https://console.aws.amazon.com/lambda/home) で、先程用意した Webhooks URL に POST リクエストを送信する関数を作成しデプロイしました。

import boto3
import json
import logging
import os

from base64 import b64decode
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError

SLACK_CHANNEL = os.environ['slackChannel']
HOOK_URL = os.environ['hookUrl']

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    slack_message = {
        'channel': SLACK_CHANNEL,
        'username': 'sample-monitor',
        "text": event['Records'][0]['Sns']['Message']
    }
    req = Request(HOOK_URL, json.dumps(slack_message).encode('utf-8'))
    try:
        response = urlopen(req)
        response.read()
        logger.info("Message posted to %s", slack_message['channel'])
    except HTTPError as e:
        logger.error("Request failed: %d %s", e.code, e.reason)
    except URLError as e:
        logger.error("Server connection failed: %s", e.reason)

SNS トピックを作成

Amazon SNS コンソール ( https://console.aws.amazon.com/sns/v3/home) を開き、Access  policy を以下のように編集した SNS トピックを作成し、Subscriptions に先程作成した Lambda を設定しました。

{
  "Version": "2008-10-17",
  "Id": "__default_policy_ID",
  "Statement": [
    {
      "Sid": "AWSAnomalyDetectionSNSPublishingPermissions",
      "Effect": "Allow",
      "Principal": {
        "Service": "costalerts.amazonaws.com"
      },
      "Action": "SNS:Publish",
      "Resource": ""
    },
    {
      "Sid": "__default_statement_ID",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": [
        "SNS:Publish",
        "SNS:RemovePermission",
        "SNS:SetTopicAttributes",
        "SNS:DeleteTopic",
        "SNS:ListSubscriptionsByTopic",
        "SNS:GetTopicAttributes",
        "SNS:Receive",
        "SNS:AddPermission",
        "SNS:Subscribe"
      ],
      "Resource": "",
      "Condition": {
        "StringEquals": {
          "AWS:SourceOwner": "1234567890"
        }
      }
    }
  ]
}

コストモニターを作成

AWS Cost Management コンソールのナビゲーションペインから、[Cost Anomaly Detection] を選択します。
Cost monitors タブから [Create monitor] を選択します。

今回は、全ての AWS サービスのコストを監視するように設定しました。
この設定にしておくことで、新しく使用を開始したサービスも自動で監視対象にしてくれます。

アラートサブスクリプションを設定します。
今回は、異常だと検知されたコストが 100USD 以上のとき、すぐに通知が送信されるように設定しました。

他にも希望の通知頻度を設定すれば、日次、または週次でアラート通知をまとめて受け取ることも可能です。
日次、週次で受け取る場合は任意のメールアドレスが必要です。

  • Threshold
    • アラート通知を受け取りたい異常コストのしきい値
  • Alerting frequency
    • アラート通知を受け取りたい頻度
  • SNS ARN
    • 先に用意した、SNS トピックの ARN

これだけで異常を検知してくれるコストモニターを追加できました。
Cost monitors に追加したモニターが表示されています。
検知された異常コストの一覧は Detection history  でも確認できるようです。

まとめ

次回は、運用を継続していく中で、アラートによって発生したアクションなどをご紹介できればと思います。