Pump home

All blogs

How to Forecast Amazon RDS Costs as a Workload Scales

Jake

    Ready to start optimizing on your cloud spend?

    Start for Free

    TL;DR

    • Use a reusable monthly worksheet to project instance hours, storage, I/O, backups, and read replicas under base, faster-growth, and capacity-change scenarios.

    • Model capacity changes by date. Growing traffic may trigger a storage increase or a new replica without changing every cost line at the same rate.

    • Supply rates for your engine, Region, deployment, and pricing terms using AWS RDS pricing. Worksheet rates are inputs you verify, not AWS quotes.

    • Compare the forecast with actual AWS billing data each month, investigate differences, and update your assumptions. Pump’s RDS pricing explainer covers general pricing, while this guide covers forecasting mechanics.

    Why RDS costs are hard to forecast as workloads scale

    Amazon RDS charges can change at different rates as traffic grows. A database may serve more requests on the same instance for months, then need a larger instance class. You pay for the class and hours you run, while the rate depends on the engine, Region, deployment, and pricing terms. Check the matching rate rather than applying a traffic-growth percentage to last month’s bill. AWS RDS pricing lists those pricing choices.

    Storage follows allocated capacity rather than the amount of data you currently use. If you increase allocated storage halfway through a month, the forecast needs separate charges for the periods before and after the change. I/O needs its own assumption. For provisioned IOPS storage, AWS charges for the performance you provision, even if the database uses less of it. A standard PostgreSQL SSD forecast should not assume the same per-request I/O charges as Aurora. PostgreSQL pricing separates those cases.

    Backup growth can affect the bill without a matching change in instance size. AWS measures backup storage against an allowance shared across provisioned databases in the same account and Region, so a forecast needs account-level usage rather than a free allowance for each database. AWS backup documentation explains that treatment.

    Finally, distinguish a Multi-AZ standby from a read replica. The standby belongs to the selected Multi-AZ deployment and its matching price. A separately configured read replica adds its own instance hours and storage, which may begin partway through the forecast month.

    The forecast inputs to model

    Model each RDS charge separately because traffic growth does not change every line at the same rate. For instance charges, record the database engine, AWS Region, instance class, deployment, running hours, and pricing term. A Single-AZ PostgreSQL instance and a Multi-AZ deployment need different price inputs. Look up the matching rates and commitment terms in AWS RDS pricing rather than assuming a fixed Multi-AZ multiplier.

    Forecast storage from allocated capacity, not just the data your database holds. Record the storage type and allocated GiB for each part of the month. RDS storage autoscaling can start an increase when free space stays at or below 10% for five minutes, the previous storage optimization has finished, and fewer than four storage modifications occurred in the past 24 hours. RDS chooses the greatest of 10 GiB, 10% of current allocation, or projected growth beyond current allocation over the next seven hours. Estimate when that step might occur, then charge the old and new allocations for their respective portions of the month. Do not treat the configured autoscaling maximum as allocated storage.

    Check whether your storage configuration permits separately billed performance. For RDS PostgreSQL gp3 volumes below 400 GiB, AWS storage specifications do not allow additional provisioned IOPS or throughput. At 400 GiB and above, you can provision performance beyond the higher baseline and may incur additional charges. Provisioned IOPS SSD storage charges for the IOPS you allocate, even when the database uses fewer. Standard PostgreSQL gp3 does not have an Aurora-style per-request I/O charge. Aurora uses different storage and I/O pricing choices, so an Aurora forecast needs its own price inputs.

    Model backups at the AWS account and Region level. AWS backup documentation describes a shared free backup-storage amount equal to total provisioned database storage in that account and Region. Compare automated backups and manual snapshots against that allowance rather than granting each database its own quota.

    Give every read replica its own instance-hours and storage lines. AWS bills read replicas as separate DB instances, while a Multi-AZ standby belongs to its deployment configuration. Record each replica’s class, storage, and start date, and add transfer assumptions if you place it in another Region.

    Building the reusable monthly forecast worksheet

    Build one worksheet tab per billing month, with separate rows for each scenario and each period when a database configuration changes. Start with columns for billing month, scenario, resource, engine, Region, deployment, instance class, storage type, segment dates, and fraction of the month. Keep workload assumptions, such as an expected replica start date, separate from price inputs so you can revise one without changing the other.

    Add columns for primary instance-hours, compute rate, and their product. For storage, calculate each segment as allocated GiB × days in segment ÷ days in month × monthly storage rate. If a 30-day month starts with 100 GiB and rises to 120 GiB halfway through, the storage line becomes (100 × 15/30 + 120 × 15/30) × rate. AWS prorates provisioned storage when you scale it mid-month. Use actual billable hours when checking the forecast, since a change may occur partway through a day.

    Give each separately configured read replica its own row for instance-hours, class, storage, and start date. A replica added halfway through a 30-day month might have approximately 360 running hours, but its actual creation time determines the billed amount. Do not add a replica row for a Multi-AZ standby already covered by the selected deployment configuration. Add provisioned IOPS and throughput columns only where those charges apply, using the provisioned amount, matching rate, and applicable fraction of the month.

    For backups, enter account-and-Region backup GB-month, the applicable shared allowance, and a backup rate. Calculate max(0, backup GB-month − allowance) × rate rather than granting each database its own allowance. AWS bases the allowance on total provisioned storage in the account and Region. Include columns for applicable transfer or add-on charges, then sum the component charges for each scenario.

    Leave every rate as a fill-in input until you verify the matching engine, Region, deployment, class, storage configuration, and pricing terms against AWS RDS pricing or the AWS Pricing Calculator. The worksheet estimates usage and applies rates you confirm. It does not supply AWS price quotes.

    Worked example: a hypothetical PostgreSQL workload

    Assume a 30-day month with a PostgreSQL Single-AZ primary running for 720 hours. The primary starts with 100 GiB of gp3 storage, then storage autoscaling raises its allocation to 120 GiB at the start of day 16. You also add a same-Region read replica with 120 GiB of gp3 storage on day 16. The dates and sizes are workload assumptions, not predictions of when autoscaling will occur.

    Use symbolic worksheet rates of rI per instance-hour and rS per GiB-month. For the arithmetic below, every dollar rate and total is hypothetical, not an AWS quote. Set rI to a hypothetical $0.25 and rS to a hypothetical $0.12.

    • Primary instance earns a hypothetical charge of 720 × $0.25 = $180.00.

    • Primary storage earns a hypothetical charge of [(100 × 15/30) + (120 × 15/30)] × $0.12 = $13.20. AWS prorates provisioned storage when its allocation changes midmonth.

    • Replica instance earns a hypothetical charge of 360 × $0.25 = $90.00. AWS bills a read replica as a separate DB instance.

    • Replica storage earns a hypothetical charge of 120 × 15/30 × $0.12 = $7.20.

    The illustrative total is $290.40, all hypothetical. The example assumes gp3 baseline IOPS meet the workload’s needs, backup usage stays within the applicable account-and-Region allowance, and no other extras apply. Same-Region source-to-replica replication adds no data-transfer charge. In a real forecast, check those assumptions and replace the illustrative rates with prices for your configuration. When you compare the forecast with the bill, use the replica’s actual start time rather than assuming it ran for exactly 360 hours.

    Three growth scenarios to plan around

    Run three versions of the worksheet for the same three-month period. Keep workload assumptions in separate columns from AWS price inputs so you can change a traffic estimate without changing a confirmed rate. For example, start each run with 100 GiB of used data, 150 GiB of allocated storage, and one primary instance.

    • Base case. Assume traffic grows 10% per month and used data grows 5 GiB per month. Keep the instance class and allocated storage unchanged, with no read replica. Instance hours stay roughly constant in each full month even as traffic rises.

    • Faster-growth case. Assume traffic grows 30% per month and used data grows 20 GiB per month. Model a possible 15 GiB storage increase on day 24 of month two and a read replica starting on day one of month three. Treat those dates as planning assumptions, not predictions. RDS storage autoscaling depends on available space and other conditions, while you must add read replicas separately. Give the replica its own instance-hour and storage rows.

    • Capacity-change case. Use the base case’s traffic and data growth, but assume you resize the primary instance on day 16 of month two. Split that month’s instance hours between the old and new classes. If the planned change is a Multi-AZ conversion instead, enter its date and recalculate charges using the applicable deployment prices.

    Use the same engine, Region, and pricing terms across runs unless a scenario explicitly changes them. Check the applicable rates against AWS RDS pricing. A 30% traffic increase does not automatically raise every cost line by 30%. Storage charges change when allocated capacity changes, and replica charges begin when the replica starts running.

    Comparing the forecast to your actual AWS bill

    Compare each forecast component with charges for the same completed billing month, account, Region, and cost basis. In AWS Cost Explorer, filter Service to Amazon RDS and apply the account and Region filters used in your worksheet. Group the results by Usage type or Usage type group to find running hours, storage, provisioned IOPS, and I/O charges. Make a separate pass by Charge type so fees and adjustments do not get mistaken for database usage.

    Choose the cost basis before calculating a variance. Unblended cost reflects charges as billed, while amortized cost spreads eligible commitment fees across the billing period. An On-Demand worksheet can be compared with appropriately filtered unblended usage charges. If your forecast includes a Reserved Instance, compare it with an amortized view instead and review its fees separately. Keep any Savings Plan entries elsewhere on the AWS bill out of the RDS component totals.

    Enter actual cost beside each worksheet estimate, then calculate actual minus forecast for instance hours, storage, IOPS or I/O, backups, and replica charges. For instance-level questions, CUR 2.0 can provide detailed billing lines when its export includes resource IDs. Do not limit the backup check to the DB instance ID. AWS attributes snapshot storage costs to the snapshot ARN, including snapshots retained after a database is deleted.

    Reconcile the component totals with the invoice separately. Credits, refunds, fees, and taxes may change the billed total without indicating that the workload forecast was wrong. Use a completed month for the comparison, but check the issued invoice before calling the figures final. Cost Explorer’s current-period figures are estimates, and later billing adjustments can still affect reported costs.

    Investigating variance and updating next month's assumptions

    Investigate the largest component-level difference first. For instance charges, compare billed hours with the calendar-month hours in your forecast and check when any resize took effect. For storage, compare the assumed autoscaling date and size with the actual change. AWS prorates provisioned storage charges when capacity changes during a month, so a later trigger can explain a lower charge.

    For replica charges, check when the replica began running and whether its instance and storage usage match your assumptions. For backup charges, compare the account and Region’s snapshot inventory with the shared backup allowance. AWS attributes snapshot storage costs to the snapshot ARN, even after you delete the source DB, so a DB-instance lookup can miss those charges. If usage matches but cost differs, check the rate and whether your comparison treats reservation fees, discounts, and credits consistently.

    Use confirmed usage to set next month’s starting point. Carry forward the current instance class and allocated storage. Give a replica added midmonth a full month of hours if you expect it to keep running, but do not assume another storage increase without a growth estimate to support it. Record each revised assumption and the billing evidence behind it.

    Where Pump View fits in this workflow

    Pump View helps you check the spending data behind your RDS forecast. It draws on AWS Cost Explorer and Cost and Usage Reports, and its Playground lets you filter spend by service and break it down by usage type or region. Use those breakdowns to find charges that need a closer look in AWS billing data.

    Pump View also shows P50 and P90 end-of-month spend projections based on current trends. You can compare them with your worksheet scenarios during the month, but they do not predict workload behavior or tell you when storage will grow or a replica will start. Pump View does not generate AWS price quotes or change database capacity. Keep workload assumptions and verified RDS rates in the worksheet, then update them when actual usage differs.

    FAQ

    How does a Multi-AZ standby differ from a read replica in the forecast? For a Multi-AZ standby, use the rate for your deployment rather than adding a separate replica row. A read replica needs its own running-hours and storage estimates because it is a separately configured instance. Check the matching RDS for PostgreSQL pricing for your deployment and region.

    Does storage autoscaling ever reduce allocated storage? No. RDS storage autoscaling increases allocated storage when needed, but it does not shrink it later. Forecast the larger allocation for subsequent months unless you plan a separate change to the database. For the month of an increase, prorate storage at the allocation in effect during each part of the month. AWS documents this behavior in its storage autoscaling guide.

    How soon after month-end is the AWS bill final? Do not assume the first day of the next month provides a final figure. AWS says Cost Explorer data normally includes usage through the previous day, but later updates can change reported costs. Compare the completed month with your worksheet, then check again when the invoice is available and review any adjustments.

    Should I compare the forecast with unblended or amortized cost? Use the basis that matches your forecast. Unblended cost reflects charges when AWS records them, while amortized cost spreads commitment fees across the billing period. If your worksheet spreads a Reserved Instance payment across months, compare it with an amortized view. Review credits, refunds, and taxes separately so they do not appear as changes in database usage. Cost Explorer offers both views.

    Conclusion

    Forecast RDS costs each month, then compare the worksheet with actual AWS charges. Check differences by cost component before revising your assumptions. A replica added earlier than planned changes instance hours, while unexpected storage growth changes the storage line. Use what you find to set the next month’s baseline.

    The forecast does not need to predict one month’s bill exactly. The monthly cycle helps you keep workload assumptions current and makes future estimates more useful.

    Looking ahead

    As Usergems continues to scale, Pump remains part of the foundation that supports sustainable growth and operational clarity across teams.

    Looking ahead

    As Usergems continues to scale, Pump remains part of the foundation that supports sustainable growth and operational clarity across teams.

    Looking ahead

    As Usergems continues to scale, Pump remains part of the foundation that supports sustainable growth and operational clarity across teams.