Sometimes, I forgot to stop the AWS instance, and I’m lazy to check the running instance for a while. Then it suddenly comes clear when I receives the email from AWS for the billing of the previous month.
To avoid this surprise, I created Lambda function to post the estimated cost of the period every morning to the slack.
Output Example:
Here is the (main handler) code:
import datetime import logging import os import boto3 import requests import slack SLACK_CHANNEL = os.environ['SLACK_CHANNEL'] logger = logging.getLogger() logger.setLevel(logging.INFO) def estimated_cost(): response = boto3.client('cloudwatch', region_name='us-east-1') get_metric_statistics = response.get_metric_statistics( Namespace='AWS/Billing', MetricName='EstimatedCharges', Dimensions=[ { 'Name': 'Currency', 'Value': 'USD' } ], StartTime=datetime.datetime.today() - datetime.timedelta(days=1), EndTime=datetime.datetime.today(), Period=86400, Statistics=['Maximum'] ) return get_metric_statistics['Datapoints'][0]['Maximum'] def lambda_handler(event, context): date = get_metric_statistics['Datapoints'][0]['Timestamp'].strftime('%Y-%m-%d') cost = estimated_cost() content = "Estimated cost is %s as of %s" % (cost, date) try: slack.post(content, SLACK_CHANNEL, context.function_name) logger.info("Message posted to %s, %s" % (SLACK_CHANNEL, content)) except requests.exceptions.RequestException as e: logger.error("Request failed: %s", e)