Budget Notifications for AWS Accounts

Photo by Fabian Blank on Unsplash

One of the fundamental characteristics of the cloud is metered billing: You only pay for what you actually use. In general, this a great concept because the costs scale according to your actual usage of the resources. This is especially useful when experimenting with new stuff or when your application only has a few users. On the other side, you might only know your spending at the end of the billing period. Of course you can regularly check the billing dashboard to have an eye on your spending. But you have better things to do, right?

Therefore, it would be great to be notified automatically once your spending exceeds certain thresholds. You might be able to do things once you budget is exceeded. At least you know that you might pay more than you initially expected.

Exceeding the budget might also indicate that something unintentional happens. For example, your developers are using services which they should not use because they are too expensive. Or maybe a bug in your infrastructure or application code causes a higher consumption than you initially estimated.

For this scenario AWS provides the Budget feature as part of the Cost Management service. Basically, you can create various budgets for all kinds of things going on in your accounts. Whenever the current spending crosses some predefined thresholds a message can be send. The message can either be send via email to a list of subscribers or as a notification to a SNS topic. Based on the SNS notification you can do all kinds of things. For example, you could stop any resources which are not essential, e.g. some EC2 instances which have a certain tag.

The most simple thing is to create a budget which sends an email once a threshold is exceeded. You can configure this manually based on the documentation provided by AWS. If you want to manage various accounts or want to create different kinds of budgets, it might make more sense to add little bit of automation by using CloudFormation. The following CloudFormation template sets up a very basic budget for the account it is created in:

AWSTemplateFormatVersion: 2010-09-09

Parameters:

  Limit:
    Type: Number
    Description: The amount of budget (in USD) per month
    MinValue: 0
    Default: 100
  Threshold:
    Type: Number
    Description: The threshold at which a notification is sent
    MinValue: 0
    MaxValue: 100
    Default: 80
  SubscriberAddress:
    Type: String
    Description: The email address to which notifications will be sent

Resources:

  MonthlyBudget:
    Type: AWS::Budgets::Budget
    Properties:
      Budget:
        BudgetLimit:
          Amount:
            Ref: Limit
          Unit: USD
        BudgetType: COST
        TimeUnit: MONTHLY
      NotificationsWithSubscribers:
        - Notification:
            Threshold:
              Ref: Threshold
            ThresholdType: PERCENTAGE
            NotificationType: ACTUAL
            ComparisonOperator: GREATER_THAN
          Subscribers:
            - SubscriptionType: EMAIL
              Address:
                Ref: SubscriberAddress

This budget sends an email to the configured SubscriberAddress once the Limit actually exceeds a Threshold. With the default values for Limit and Threshold the notification is sent once the monthly costs exceed $80 (80% or $100).

Budgets can be configured for all kinds of things. With the CostFilter attribute of the Budget property it can be applied to costs occurring in a linked account, a certain region, for a service or a tag. The available budget filters can be found in the documentation.

Budgets help you to keep an eye on your spending in AWS. Based on the settings of the budget you can get notified whenever your budget is about to be exceeded. This helps you to be prepared for the monthly bill or take corrective actions to lower the costs if necessary and feasible.