In this business climate, everyone is looking to reduce costs. CFOs are reevaluating their software and infrastructure spend, and naturally, companies are looking for ways to optimize their AWS costs. In fact, we are now leveraging a major reason cloud is so compelling in the first place: you have more flexibility to control costs based on business needs.
How Do You Reduce Costs While Maintaining Performance?
A good starting point is to determine where most of the AWS spend is coming from. Once you know that, you can focus on factors that are causing the most charges and determine those services that can be scaled down and those that need the most resources. Depending on the service, there are many options, such as Amazon EC2 Reserved Instances (RI), Amazon EC2 Spot instances and resource rightsizing. In this blog post, I’ll cover rightsizing.
There are some great AWS and third-party tools (I’m partial to nOps) to help you learn and analyze current usage patterns and make recommendations for rightsizing RI and Spot instances. In my experience, Amazon Elastic Compute Cloud (Amazon EC2), Amazon Relational Database Service (Amazon RDS) and Amazon Simple Storage Service (Amazon S3) show up consistently in the top five items on the AWS bill. So, in this article, I’ll focus on rightsizing strategies with these three services.
Rightsizing doesn’t just mean migrating from the old instance to the new generation instance. You’re probably not going to save lots of money with that approach. Rightsizing can help to identify resources that are clearly over-provisioned. Furthermore, many of the resources are provisioned using HashiCorp Terraform, AWS CloudFormation or an Auto Scaling group on AWS, so finding the rightsizing opportunities for ephemeral resources, and updating the automation not only reduces cost now but can also lower your future cost on AWS.
Optimizing Amazon EC2 and Amazon RDS Instances
Hands down, Amazon EC2 spend is most-often the most expensive item on your AWS bill. Amazon EC2 comes with a robust set of options for CPU, memory and network I/O, ranging from 0.5GB of memory to 1TB. Having so many options can be a double-edged sword—how do you choose?
You can choose the appropriate instance type based on your use case: Compute Optimized (for CPU-intensive workloads), Memory Optimized (for memory-intensive workloads) or Network Optimized (for enhanced network throughput).
Some parameters need to be considered when choosing the optimal instances for your workload. Whether it is an HPC workload, or a simple Python Flask application or a Data Pipeline project, there is an Amazon EC2 instance type best suited for each of those workloads.
To select instances wisely, apply the most cost-effective Amazon EC2 instance type based on the network I/O and CPU utilization of the currently running instance. For example, if a t3.xlarge is configured for a Python Flask application and less than half of the memory is in use, the instance type has been over-provisioned for that workload. In such a case, a smaller instance size, such as a t3.small, is probably more appropriate.
It’s also worth noting that, while most EC2 instances are provisioned with performance in mind, over time the utilization of the program can decrease, resulting in instances that are over-provisioned based on the current CPU/memory usage. I normally look at Amazon CloudWatch for instances that are not consuming all the resources that are currently available to each instance and, based on the historical usage, provide a recommendation to rightsize them. And, I can see the cost savings associated with the suggested changes.
This approach can also be applied to Amazon RDS. The underlying architecture of Amazon RDS instances is very similar to that of Amazon EC2 instances. Both require an Amazon Virtual Private Cloud (Amazon VPC), security groups and a disk to run the managed database instance.
Optimizing Amazon S3 Storage Classes
Amazon S3 offers a range of storage classes designed for different use cases:
- S3 Standard for general-purpose storage of frequently accessed data.
- S3 Intelligent-Tiering for data with unknown or changing access patterns.
- S3 Standard-Infrequent Access (S3 Standard-IA) and S3 One Zone-Infrequent Access (S3 One Zone-IA) for long-lived, but less frequently accessed data.
- Amazon S3 Glacier (S3 Glacier) and Amazon S3 Glacier Deep Archive (S3 Glacier Deep Archive) for long-term archive and digital preservation.
You can determine the most appropriate storage class based on the usage of the objects in that bucket. As a result, you can cut the cost of storage of objects in the bucket and the cost of GET requests needed to download or transfer files from Amazon S3 to any other location.
Getting Results Fast
Uber, like many rapid-growth companies, was looking for ways to optimize AWS costs without slowing its high-velocity teams. They were able to save 15% of AWS costs in just 30 days using some of the strategies described above, as well as others. One of the keys for Uber is they are monitoring and optimizing costs continuously–not a one-and-done approach–because they have such high velocity with continuous changes to their AWS environment. They use nOps cloud management for this.
Nick Cobb, senior engineering manager, Infrastructure Platform, Advanced Technologies Group at Uber, reports he’s able to “operationalize costs and get them in front of the engineers directly, saving 15% in the first month of implementation. In addition to providing reports for leadership and budget processes, our efficiency team can enact behavioral changes for R&D engineers typically used to throwing money at challenging problems.”
If you’re interested in more details on the strategies that Uber has used, plus other cost-optimization strategies your organization can use right now, Nick will be joining me and AWS for a DevOps.com webinar on continuous cost optimization on April 21. It’s a hot topic for so many organizations right now, so please join us.