Email Alerts for AWS Billing Alarms

using CloudWatch and SNS to send yourself email messages when AWS costs accrue past limits you define

The Amazon documentation describes how to use the AWS console to monitor your estimated charges using Amazon CloudWatch and includes some pointers for folks using the command line. Unfortunately, that article leaves out the commands to set up the SNS (Simple Notification Service) topics and SNS subscriptions, so I present here the complete steps I use.

I like using the command line tools as they let me automate and repeat actions without having to do lots of pointing, clicking, and re-entering data. For example, I want to set up a number of billing alerts in each new account, sometimes at $10 increments, and sometimes at $100 or $1000 increments. The steps below let me do this in seconds with a simple copy and paste.

When I get one of these billing alert emails, I glance at the day of the month to see if that account’s charges are progressing on an appropriate pace or if they require further investigation.

This was the mechanism that recently alerted me to the extra charges involved in automating the transition of S3 objects to Glacier.

Once you’ve installed the [AWS command line tools][tools] here are the steps to set up automated billing alert emails.

Billing Alerts

Create an SNS topic where billing alert notifications will be sent.

sns_topic_arn=$(aws sns create-topic \
  --name "BillingAlert" \
  --output text \
  --query 'TopicArn'
echo sns_topic_arn=$sns_topic_arn

Subscribe your email address to the SNS topic so you receive email messages when your AWS billing estimates exceed each trigger point.
aws sns subscribe \
  --topic-arn "$sns_topic_arn" \
  --protocol email \
  --notification-endpoint "$email"

Check your mailbox for a confirmation email from Amazon and click on the link to complete your subscription to this SNS topic.

Create CloudWatch monitor alarms for the AWS billing estimated charges at each dollar figure where you want to be alerted. This example sets alarms from $100 to $1000 at increments of $100, but you can change this to any values you’d like.

for amount in {100..1000..100}
  echo amount=$amount
  aws cloudwatch put-metric-alarm \
    --alarm-name "awsbilling-$amount" \
    --alarm-description "AWS billing alarm: \$$amount" \
    --namespace AWS/Billing \
    --metric-name EstimatedCharges \
    --evaluation-periods 1 \
    --period 21600 \
    --statistic Maximum \
    --comparison-operator GreaterThanOrEqualToThreshold \
    --dimensions "Name=Currency,Value=USD" \
    --threshold "$amount"\
    --actions-enabled \
    --alarm-actions "$sns_topic_arn"

See the CloudWatch monitor alarms you have created:

aws cloudwatch describe-alarms

Now spend lots of money with AWS and monitor your inbox for email alerts.


The above sample commands may incur minimal charges in your account (SNS Pricing, CloudWatch Pricing). If you don’t want to keep these alerts in place, you will need to undo what was set up.

Delete all alarms with names starting with “awsbilling-”:

billing_alarms=$(aws cloudwatch describe-alarms \
  --output text \
  --query 'MetricAlarms[?starts_with(AlarmName,`awsbilling-`)==`true`].[AlarmName]')
echo billing_alarms='"'$billing_alarms'"'

aws cloudwatch delete-alarms \
  --alarm-names $billing_alarms

Delete the SNS topic.

aws sns delete-topic \
  --topic-arn "$sns_topic_arn"


  • In order to follow these examples, you will need to install the aws-cli.

  • It may take half a day or more for a billing alarm to be triggered based on how AWS collects billing data and how the alarms are set.

  • Make sure you confirm your subscription to the SNS topic by clicking on the link in the confirmation email AWS sends to you, or Amazon will send no email billing alerts.

  • Each alert email will have an unsubscribe link in it for your convenience. This will unsubscribe you from all of the alerts, not just the specific cost level in that particular email.

  • Amazon’s documentation states that you must first “enable the monitoring of estimated charges” in each account. I tested this with a new account and found that this was not necessary, so the documentation may be a bit out of date.

[Update 2015-11-05: Convert to newer aws-cli commands]