CloudFormationでCost Anomaly Detectionを設定する

記事タイトルとURLをコピーする

こんにちは、カスタマーサクセス課の下山です。 久しぶりのブログ投稿です。

CloudFormationでCost Anomaly Detectionを設定する機会があったので紹介します。

はじめに

Cost Anomaly Detection自体の機能については弊社の他メンバーのブログをご覧ください。

blog.serverworks.co.jp

今回設定する内容(概要)

  • モニタータイプは「AWS のサービス」です
  • アラート頻度は「個々のアラート」です
  • メール通知用にSNSも設定しています

テンプレート

{
  "Parameters": {
    "MonitorName": {
      "Type": "String",
      "Default": "MonitorTest"
    },
    "SubscriptionName": {
      "Type": "String",
      "Default": "AlertSubscriptionTest"
    },
    "Threshold": {
      "Type": "Number",
      "Default": "100"
    },
    "Endpoint": {
      "Type": "String",
      "Default": "xxx@yyy.co.jp"
    }
  },
  "Resources": {
    "SNSTopic": {
      "Type": "AWS::SNS::Topic",
      "Properties": {
        "TopicName": "cost-anomaly-detection-sns-topic"
      }
    },
    "SNSSubscription": {
      "Type": "AWS::SNS::Subscription",
      "Properties": {
        "Endpoint": {
          "Ref": "Endpoint"
        },
        "Protocol": "email",
        "TopicArn": {
          "Ref": "SNSTopic"
        }
      }
    },
    "SNSTopicPolicy": {
      "Type": "AWS::SNS::TopicPolicy",
      "Properties": {
        "PolicyDocument": {
          "Version": "2008-10-17",
          "Id": "__default_policy_ID",
          "Statement": [
            {
              "Sid": "__default_statement_ID",
              "Effect": "Allow",
              "Principal": {
                "AWS": "*"
              },
              "Action": [
                "SNS:Publish",
                "SNS:RemovePermission",
                "SNS:SetTopicAttributes",
                "SNS:DeleteTopic",
                "SNS:ListSubscriptionsByTopic",
                "SNS:GetTopicAttributes",
                "SNS:AddPermission",
                "SNS:Subscribe"
              ],
              "Resource": {
                "Ref": "SNSTopic"
              },
              "Condition": {
                "StringEquals": {
                  "AWS:SourceOwner": {
                    "Ref": "AWS::AccountId"
                  }
                }
              }
            },
            {
              "Sid": "AWSAnomalyDetectionSNSPublishingPermissions",
              "Effect": "Allow",
              "Principal": {
                "Service": "costalerts.amazonaws.com"
              },
              "Action": "SNS:Publish",
              "Resource": {
                "Ref": "SNSTopic"
              }
            }
          ]
        },
        "Topics": [
          {
            "Ref": "SNSTopic"
          }
        ]
      }
    },
    "AnomalyServiceMonitor": {
      "Type": "AWS::CE::AnomalyMonitor",
      "Properties": {
        "MonitorName": {
          "Ref": "MonitorName"
        },
        "MonitorType": "DIMENSIONAL",
        "MonitorDimension": "SERVICE"
      }
    },
    "AnomalySubscription": {
      "Type": "AWS::CE::AnomalySubscription",
      "Properties": {
        "SubscriptionName": {
          "Ref": "SubscriptionName"
        },
        "Threshold": {
          "Ref": "Threshold"
        },
        "Frequency": "IMMEDIATE",
        "MonitorArnList": [
          {
            "Ref": "AnomalyServiceMonitor"
          }
        ],
        "Subscribers": [
          {
            "Type": "SNS",
            "Address": {
              "Ref": "SNSTopic"
            }
          }
        ]
      }
    }
  }
}

※(2022/11/25修正)CostAnomalyDetectionでの検知をSNSトピックにフックする際にトピックポリシーが適切に設定されている必要がありますのでテンプレート内で定義するように修正しました。

注意事項等

  • Cost Anomaly Detectionはグローバルなサービスであるため、バージニアリージョンでテンプレートを流す必要があります。
    • 同一テンプレートでSNSを設定する場合はSNS設定はバージニアリージョンに属すことになります。

最後に

  • テンプレート化しておけばStackSetsで設定することもできるので、アカウント開設時の下処理の一つにも使えます。