AWS bills can spiral out of control if left unchecked, but you can drastically reduce costs with a structured approach. Here’s how I cut my AWS bill in half.

Step 1: Identify cost drivers

I started by reviewing the AWS billing breakdown and noticed key resource costs:

  • OpenSearch: $60
  • VPC: $50
  • RDS: $50
  • Load Balancing: $40
  • EC2: $35
  • ECS: $25

Step 2: Remove unused environments

The quickest win was identifying and removing unused environments. Each unused environment typically included:

  • VPC (public IPs)
  • RDS (shared DB instance)
  • Load Balancer
  • EC2 (various instances)
  • S3 (file storage and frontend)
  • CloudFront (content delivery)
  • CloudWatch (logging)

I eliminated non-shared resources by deleting unused environments and downsized the database instance, significantly reducing costs from non-computational resources like S3, CloudWatch, and Key Management Service (KMS).

Step 3: Implement scheduling for computational resources

After cleaning the account, I introduced a scheduling solution to optimize further. All computational resources (Elastic Beanstalk, RDS, ECS) now run only Monday through Friday from 8 AM to 10 PM, cutting costs dramatically for periods of inactivity.

Step 4: Transition to public-private EBS environments

In Feb 2024, AWS introduced a charge for all Public IPs used by an account (https://aws.amazon.com/blogs/aws/new-aws-public-ipv4-address-charge-public-ip-insights/). Most of the public IPs we use are utilised by Elastic Beanstalk Environments. This is caused by their default settings.

However, this is not the only way such env can be set up, and we plan to transition to Public-Private environments, which should not only slash the VPC costs but also make them inherently more secure (https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/vpc.html)

Results of cutting the AWS costs

By following these steps—removing unused environments, enabling scheduling, and refining the network architecture—I slashed AWS costs by over 50%.