> We reached out to some contacts at AWS to find out why the Aurora team built this. Did I/O Optimized do some clever engineering with sharding and storing data in S3? Were they just feeling generous?
No surprises here. Come what may, Amazon has always strived to lower costs (the low costs, more customers, more volume fly-wheel?). This is but one example.
AWS adopted cost-follow pricing for S3 (very different from value-based pricing) after apparently a lengthy debate: As they get more efficient, they want to pass down those savings to customers (as price reductions):
S3 would be a tiered monthly subscription service based on average storage use, with a free tier. Customers would choose a monthly subscription rate based on how much data they typically needed to store. Simple ... The engineering team was ready to move on to the next question.
Except that day we never got to the next question. We kept discussing this question. We really did not know how developers would use S3 when it launched. Would they store mostly large objects with low retrieval rates? Small objects with high retrieval rates? How often would updates happen versus reads? ... All those factors were unknown yet could meaningfully impact our costs ... was there a way to structure our pricing [to] ensure that it would be affordable to our customers and to Amazon?
... the discussion moved away from a tiered subscription pricing strategy and toward a cost-following strategy. "Cost following" means that your pricing model is driven primarily by your costs, which are then passed on to your customer. This is what construction companies use, because building your customer's gazebo out of redwood will cost you a lot more than building it out of pine.
If we were to use a cost-following strategy, we'd be sacrificing the simplicity of subscription pricing, but both our customers and Amazon would benefit. With cost following, whatever the developer did with S3, they would use it in a way that would meet their requirements, and they would strive to minimise their cost and, therefore, our cost too. There would be no gaming of the system, and we wouldn't have to estimate how the mythical average customer would use S3 to set our prices.
> I wonder what explains AWS' high egress costs, though.
Vendor lock-in. It prevents people from otherwise picking the best provider for the task at hand - for example using some managed AWS services, but keeping the bulk of your compute on-prem or at a (much cheaper) bare-metal host.
It makes sense, but I wish there was an option to opt-out, as to allow high-bandwidth applications that are fully on AWS (at the moment AWS is a non-starter for many of those even if you have no intention of using AWS competitors like in the scenario above).
Maybe they should just price end-user egress vs competitor egress differently (datacenter and business provider IPs are priced like now, but consumer-grade provider IPs are much cheaper/free)? That would discourage provider-hopping, while making AWS a viable provider even for high-bandwidth applications such as serving or proxying media.
Unpopular opinion: There are a lot of free networking products, and it probably makes sense to hide all that in the margins of a few products (egress, NAT gateways) rather than penny pinch every API.
I've migrated stuff away from AWS. It's not hard, and AWS doesn't make it hard to do.
Egress costs are where AWS makes money. You can get around that by negotiating lower cloudfront costs then basically exfiltrating your data via cloudfront. We were getting < .01/gb pricing (.0071?) for only like a $2k/mo commitment.
DirectConnect pricing might be cheaper, if a company is really trying to get stuff out, but I haven't run the numbers to determine if the connection charge plus DTO (data transfer out) would save money over regular S3 egress charges. see https://aws.amazon.com/directconnect/pricing/
> No surprises here. Come what may, Amazon has always strived to lower costs
Maybe it's just a goal to reduce costs, but it seems likely that this is a response to Google's introduction of AlloyDB, a Postgres-compatible database competing with Aurora that is advertised as having "no...opaque I/O charges". I doubt Amazon was feeling generous.
More than anything else, I'm bothered by Cloudwatch's pricing. $3/dashboard/month when it's essentially just a JSON config? $0.30/metric/month, with the risk of a junior engineer easily being able to add one line of code that 1000X or more multiplies your AWS bill?
And then tie in how some AWS services only a binary choice between logging ridiculous volumes of data or nothing at all (looking at you, AppSync) to make the log ingestion fees high too.
> No surprises here. Come what may, Amazon has always strived to lower costs
I have a hard time reading "amazon" and "lower costs" in the same sentence.
The cloud is consistently an order of magnitude more expensive than self hosting, even when including people cost, unless you need every single bit of load balancing/high availability/normalization they provide.
I work for a large insurance company. We had moved from on-prem to Aurora, but our design strategy did not get updated in the process, and our IO costs were about 80% of our total AWS bill. We just switched to this new IO optimised pricing and we’re seeing huge discounts. I can sleep a bit easier now :) (we still are going to change our DB design to reduce IO anyway)
We have a 10TB database we switched from Aurora to Postgres and it cut out bill by 80%. However, there are some differences in our schema such as now using native partitions so it's hard to tell how much $ is due to the switch and how much due to our table and query design.
Curious what you mean by switching from Aurora to Postgres? AWS offers Postgres on Aurora, and Postgres on regular RDS. Do you mean you switched to RDS, or off of AWS altogether, or something else?
Probably means Aurora MySQL. In CloudFormation and other AWS artifacts, "Aurora" is a keyword that regularly comes up meaning MySQL, since that was the original target for Aurora years before the Postgres flavor was released. There are AWS old-timers at my shop that call it Aurora, and it shows up in their YAML.
FWIW, I'm actively exploring native partitions on Aurora with Postgres and I'm seeing very little benefit. Two identical tables, each with 500M+ rows, and I'm not seeing any meaningful performance/IO changes. A composite index with the partition key as the first entry has been as effective for reducing IO and query time as partition pruning. I'm sure there are workloads where partitioning makes more sense, but I've been surprised by how little difference there was in this case.
wild part is that there's been zero observable difference in performance for this config change, I think it's just a difference in billing calculation.
> I think it's just a difference in billing calculation
Agree. It feels like an actuary ran some numbers and found that high I/O customers spend more on other AWS services and are more profitable than low I/0 tenants, so they changed the formula to reduce churning those high I/0 tenants.
Maybe good to review the technical details around the feature. You might want to have a look at the blog in the last reference, and the sanity check Lambda script, before switching. Or also this specific timestamp in the presentation linked below: https://youtu.be/FBZmxLm0Bhw?t=355
I didn't know about Aurora IO Optimized until just now. That solves my biggest fear of Aurora which is an optimized query wreaking havoc on our IO and racking up a bill. Very cool offering to see.
No surprises here. Come what may, Amazon has always strived to lower costs (the low costs, more customers, more volume fly-wheel?). This is but one example.
AWS adopted cost-follow pricing for S3 (very different from value-based pricing) after apparently a lengthy debate: As they get more efficient, they want to pass down those savings to customers (as price reductions):
From: https://archive.is/lT5zTI wonder what explains AWS' high egress costs, though.
Vendor lock-in. It prevents people from otherwise picking the best provider for the task at hand - for example using some managed AWS services, but keeping the bulk of your compute on-prem or at a (much cheaper) bare-metal host.
It makes sense, but I wish there was an option to opt-out, as to allow high-bandwidth applications that are fully on AWS (at the moment AWS is a non-starter for many of those even if you have no intention of using AWS competitors like in the scenario above).
Maybe they should just price end-user egress vs competitor egress differently (datacenter and business provider IPs are priced like now, but consumer-grade provider IPs are much cheaper/free)? That would discourage provider-hopping, while making AWS a viable provider even for high-bandwidth applications such as serving or proxying media.
Egress costs are where AWS makes money. You can get around that by negotiating lower cloudfront costs then basically exfiltrating your data via cloudfront. We were getting < .01/gb pricing (.0071?) for only like a $2k/mo commitment.
Maybe it's just a goal to reduce costs, but it seems likely that this is a response to Google's introduction of AlloyDB, a Postgres-compatible database competing with Aurora that is advertised as having "no...opaque I/O charges". I doubt Amazon was feeling generous.
Agreed.
Azure on the other hand is notoriously expensive and do everything possible to raise prices.
And then tie in how some AWS services only a binary choice between logging ridiculous volumes of data or nothing at all (looking at you, AppSync) to make the log ingestion fees high too.
I have a hard time reading "amazon" and "lower costs" in the same sentence.
The cloud is consistently an order of magnitude more expensive than self hosting, even when including people cost, unless you need every single bit of load balancing/high availability/normalization they provide.
The vast majority of projects don't.
We have a similar story with DynamoDB too.
FWIW, I'm actively exploring native partitions on Aurora with Postgres and I'm seeing very little benefit. Two identical tables, each with 500M+ rows, and I'm not seeing any meaningful performance/IO changes. A composite index with the partition key as the first entry has been as effective for reducing IO and query time as partition pruning. I'm sure there are workloads where partitioning makes more sense, but I've been surprised by how little difference there was in this case.
Sounds like good material for a technical blog post.
Agree. It feels like an actuary ran some numbers and found that high I/O customers spend more on other AWS services and are more profitable than low I/0 tenants, so they changed the formula to reduce churning those high I/0 tenants.
Mine have always been helpful and have kept us up to date on releases like this, sometimes we even get them before they are GA.
"AWS announces Amazon Aurora I/O-Optimized" - https://aws.amazon.com/about-aws/whats-new/2023/05/amazon-au...
"New – Amazon Aurora I/O-Optimized Cluster Configuration with Up to 40% Cost Savings for I/O-Intensive Applications" - https://aws.amazon.com/blogs/aws/new-amazon-aurora-i-o-optim...
"Getting Started with Amazon Aurora I/O-Optimized" - https://youtu.be/OlFeaVd6Ll4
"AWS On Air ft. Introducing Amazon Aurora I/O Optimized" - https://youtu.be/FBZmxLm0Bhw
"AWS Aurora IO Optimized Storage — Is it worth it?" - https://towardsaws.com/aws-aurora-io-optimized-storage-is-it...