Cloud Infrastructure & AWS Monthly Cost Estimate Markdown Table Template
Before an architecture proposal is approved, someone asks what it will cost per month. This table answers that line by line so reviewers can challenge each assumption instead of a single number. Engineering leads read it during RFC review, finance reads it when setting budgets, and whoever does FinOps reads it a month after launch to compare the estimate with the invoice.
Edit This Template
Edit cells, add rows, or sort — the Markdown updates livePaste cells from Excel or Google Sheets into the first header to replace the table · Tab / Enter / arrows move · Shift+F10 opens row & column actions
When to Use This Table
Its value lies in exposing assumptions. Every figure depends on region, pricing model (on-demand, Savings Plans, reserved or committed use), the number of hours in a month (the AWS Pricing Calculator uses 730), and the date the rates were checked. Cloud list prices change and vary by region, so an estimate without a date and a region cannot be reproduced. Treat every rate in a table like this as a snapshot, never as a current fact.
A weak estimate lists compute and the database and stops. Real invoices surprise people with the lines that are missing: internet egress, cross-AZ traffic, NAT gateway hourly and per-GB processing charges, storage requests and I/O, log ingestion, snapshots, and support plans. A good estimate has one row per billing dimension, links to a saved calculator estimate, and shows its arithmetic so anyone can recompute it.
Formatting This Table in Markdown
A cloud infrastructure & aws monthly cost estimate table puts a few things in cells that Markdown treats as syntax. These are the ones to watch so it renders correctly on GitHub, GitLab, Obsidian and docs sites.
Two dollar amounts in one cell can trigger math
The Unit Billing Rate cells hold two prices, such as
$0.04048 / vCPU-hr + $0.004445 / GB-hr. On GitHub$…$is math, so text between two dollar signs may render as a formula; escape each sign as\$, or put USD in the header and keep cells numeric.Move the unit out of the total cell
A total like
**$868.47 / mo**does not right-align with the digits above it. PutUSD / moin the header, keep every cost to two decimals, and let bold be the only difference in the total row; see column alignment.GFM has no total row: bold label plus placeholders
There is no footer row, formula or colspan, so the total is an ordinary last row: a bold label in the first cell,
—in unused cells, and a bold amount. Recompute it by hand or in a spreadsheet whenever a line changes, because nothing in Markdown sums a column.Write multiplication as × or in a code span
In capacity cells like
3 tasks × 730 h, the × is plain Unicode. Typing3*730*2instead italicizes the 730, because a pair of asterisks is emphasis; use × or a code span for formulas.
What Goes in Each Column
| Column | Alignment | What to put here |
|---|---|---|
| Cloud Service | left :--- | Provider and service name, grouped by category (compute, database, storage, network, edge). When a service bills on several dimensions, such as Fargate vCPU and memory or a NAT gateway’s hours and data processed, give each dimension its own row so none of them gets forgotten. |
| Resource Tier / Instance | left :--- | The exact SKU in backticks (db.r6g.large, cache.t4g.medium), plus the deployment option and pricing model: Multi-AZ, on-demand or committed. The g suffix on AWS instance families indicates Graviton (Arm), which is priced differently from the x86 equivalent, so copy the name exactly. |
| Provisioned Capacity | right ---: | Quantity with units and, for hourly resources, the hours assumed: 3 tasks × 730 h. For usage-based lines, write the forecast and its source, such as “1.2 TB/mo, 90-day average from CDN logs”. Right-aligned so quantities line up. |
| Unit Billing Rate | right ---: | The rate with its unit (/ vCPU-hr, / GB-mo, / million requests) as shown in the calculator on the date you checked. Note tiered pricing explicitly, because the first tier’s rate does not apply to the whole volume once usage crosses a tier boundary. |
| Est. Monthly Cost | right ---: | Capacity times rate, right-aligned, in one stated currency and excluding tax. Rounding to whole dollars is honest for an estimate; cents imply a precision you do not have. End with a bold total row so the figure people quote is visibly the sum of the lines above it. |
How to Fill It In
- 1Write the assumptions down before any numbers: region, currency, pricing model, hours per month, and the date. Put them in a short block above the table (see the first variation) so nobody has to guess later.
- 2Build the inventory from infrastructure code, not from the architecture diagram. A
terraform planor CDK synth output lists every billable resource, including the NAT gateways, load balancers, and log groups that diagrams leave out. For an existing system, use Cost Explorer (or your provider’s billing export) grouped by service and usage type for the last full month. - 3Price each line in the provider’s own calculator, save the estimate, and paste its shareable link under the table. The calculator handles tiers and regional rates that are easy to get wrong by hand.
- 4Estimate usage-driven lines from real metrics: egress from load balancer or CDN logs, request counts from access logs, storage growth from the last few months of bucket metrics. If there is no history yet, write down the traffic assumption and the headroom you added, so both can be challenged.
- 5After the first full billing month, add an Actual column and explain every line that moved by more than a threshold your team agrees on. Tag resources by project from day one, otherwise the comparison will not be possible.
Ready-to-Paste Variations
Assumptions block
Paste this directly above the cost table. It is what makes the estimate reproducible when someone reopens it months later.
| Assumption | Value |
| :--- | :--- |
| Region | `us-east-1` |
| Pricing model | On-demand list prices; no Savings Plans or reservations |
| Hours per month | 730 |
| Rates checked | YYYY-MM-DD in the provider’s pricing calculator (link) |
| Currency | USD, excluding tax and support plan |
| Traffic forecast | 1.2 TB/mo egress, 90-day average from CDN logs |One row per billing dimension
Quantities only, split by how the provider meters them. Fill in rates and costs from your saved calculator estimate; the split is what stops NAT and I/O charges from going missing.
| Service | Billing dimension | Unit | Monthly quantity |
| :--- | :--- | :--- | ---: |
| Fargate | vCPU | vCPU-hour | 4,380 (6 vCPU × 730 h) |
| Fargate | Memory | GB-hour | 8,760 (12 GB × 730 h) |
| NAT Gateway | Gateway hours | hour | 1,460 (2 gateways × 730 h) |
| NAT Gateway | Data processed | GB | 1,200 |
| Data transfer | Out to internet | GB | 1,200 |
| Aurora | Storage | GB-month | 200 |
| Aurora | I/O requests (Standard config only) | million requests | 150 |Monthly FinOps review: estimate vs actual
For the review after launch. The Driver column matters more than the numbers, because it says what to change.
| Category | Estimate | Actual | Variance | Driver |
| :--- | ---: | ---: | ---: | :--- |
| Compute | $216 | $231 | +$15 (+6.9%) | One extra task during the load test |
| Database | $380 | $380 | $0 (0.0%) | As planned |
| NAT and data transfer | $87 | $142 | +$55 (+63.2%) | Container image pulls routed through NAT |
| Storage | $59 | $61 | +$2 (+3.4%) | Log retention longer than assumed |
| **Total** | **$742** | **$814** | **+$72 (+9.7%)** | |Common Mistakes
Leaving out the NAT gateway hourly charge and internet egress.
A NAT gateway bills per hour per gateway and per GB processed, and traffic leaving for the internet is billed again as data transfer out. Give each of these its own row, and consider VPC endpoints for traffic to S3 or ECR that would otherwise go through NAT.
Multiplying hourly rates by 720 hours.
A 30-day month is 720 hours, but the AWS calculator averages to 730 (8,760 hours a year divided by 12). Use 730 so your figures match the calculator and the average invoice.
Presenting rates without a date, region, or pricing model.
Add the assumptions block and a link to the saved calculator estimate. When someone reuses the table a year later, they will know which rates to refresh instead of trusting stale numbers.
Costing only the primary database instance.
Count every replica or standby, storage and I/O (on Aurora Standard), backup storage beyond the free retention allowance, and manual snapshots. Managed databases bill on several dimensions besides instance hours.
Mixing list prices with committed-use discounts in one column.
Show on-demand cost first and put discounts in a separate column or row. Reviewers need to see what happens if the commitment lapses or the workload moves.
Related Markdown Table Templates
Browse all 50 templatesROI & Annual Cost Savings Matrix
Financial cost-benefit analysis comparing current vendor costs, manual engineering overhead, and projected tool savings.
Technical SEO Audit & Meta Tags Matrix
Technical SEO spreadsheet matrix recording URL routes, target search keywords, title tag lengths, meta descriptions, and indexation status.
Competitor & Product SWOT Analysis Matrix
Strategic SWOT analysis matrix mapping internal strengths, operational weaknesses, market opportunities, and competitive threats.
Cloud Infrastructure & AWS Monthly Cost Estimate: Frequently Asked Questions
Why does AWS assume 730 hours in a month?
It is the yearly average: 365 days × 24 hours = 8,760 hours, divided by 12 months = 730. Actual months range from 672 to 744 hours, so individual invoices for always-on resources vary slightly around the estimate.
How precise should a monthly cloud estimate be?
Precise in method, modest in claims. Compute and reserved capacity are predictable; egress, requests, and logs depend on traffic you are forecasting. State a range or a headroom percentage for usage-based lines rather than quoting a total to the cent.
Should the estimate include the free tier?
Not for production budgeting. Free-tier allowances are small, often expire after the first year, and apply per account, so they rarely survive contact with a real workload. Mention them in a note if they matter for a prototype.
How do I estimate data transfer without any traffic history?
Multiply expected monthly page views or API calls by the average response size, then add asset and media weight. Write the formula into the Provisioned Capacity cell so the forecast can be corrected once real logs exist.