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 here are the steps to set up automated billing alert emails.
Billing Alerts
Create an SNS topic where billing alert notifications will be sent.
snstopic=$(sns-create-topic BillingAlert)
echo snstopic=$snstopic
Subscribe your email address to the SNS topic so you receive email messages when your AWS billing estimates exceed each trigger point.
email=YOURNAME@YOURDOMAIN.com
sns-subscribe "$snstopic" --protocol email --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 at every $100 increment up to $1000, but you can change this to any values you’d like.
for amount in 100 200 300 400 500 600 700 800 900 1000
do
mon-put-metric-alarm "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 "Currency=USD" --threshold "$amount" --actions-enabled true --alarm-actions "$snstopic"
done
See the CloudWatch monitor alarms you have created:
mon-describe-alarms --headers
Now spend lots of money with AWS and monitor your inbox for email alerts.
Cleanup
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 the alarms you created (replace with your specific trigger values used above).
for amount in 100 200 300 400 500 600 700 800 900 1000
do
mon-delete-alarms "awsbilling-$amount" --force
done
Delete the SNS topic.
sns-delete-topic "$snstopic" --force
Notes
In order to follow these examples, you will need to install the AWS command line tools, at least for SNS and CloudWatch.
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 just tested this with a new account and found that this was not necessary, so the documentation may be a bit out of date.



Follow Eric Hammond on Twitter
There is a following question I request you could help me.
I can configure an email alert to let me know that my bill has gone over a certain price by CloudWatch. Is there any way for them to kill (stop) my instances automatically at the same time if my limit is reached?
Best
albert:
Amazon just released the ability to stop or terminate an instance if CloudWatch alarms are triggered for that specific instance: http://aws.typepad.com/aws/2013/01/amazon-cloudwatch-alarm-actions.html
However, this doesn't help for billing alarms as they are not related to any specific instance.
You would need to implement your own process to terminate instance(s) when the alarm is triggered.