A cloud bill is visible every month. The work required to operate the system is usually scattered across incident records, maintenance tickets, deployment reviews, and the calendars of a few experienced engineers. Comparing infrastructure options requires bringing those two views together.
The practical question is which arrangement delivers the required service at an acceptable total cost. A managed database, a virtual machine, and a rented dedicated server can all be useful choices. They purchase different capabilities and leave different responsibilities with the team. A convincing proposal explains both the money saved and the work accepted.
An r/devops discussion about moving from Azure to Hetzner illustrates why this topic attracts attention. The author reported a substantial reduction in provider spending, while replies questioned operational tradeoffs. Those amounts are the author's account, not an independently audited comparison. They are a useful prompt to investigate your own requirements and costs.
This guide provides a decision process and a small, tested comparison calculator. Every monetary value in the example is a fictional planning input. The calculator performs arithmetic and checks declared requirements; it does not predict actual recovery performance, retrieve live prices, or establish that one provider is generally cheaper.
Download the complete runnable examples, including setup instructions and verification commands.
Write the operating contract before comparing invoices
Describe the application at a level that another engineer can price. Include normal and peak demand, working-set memory, storage growth, traffic direction, customer locations, and the data that must remain durable. State which requests can wait and which failures require a person immediately.
Then define recovery objectives. Recovery point objective expresses the acceptable data-loss window. Recovery time objective describes the intended time to restore service after the relevant disruption. A reporting service with a next-day recovery target should not automatically inherit the architecture of a customer transaction system with a much shorter target.
AWS's disaster-recovery guidance treats these objectives as business decisions and calls for testing the recovery implementation. That gives the comparison a concrete boundary: a proposal needs an architecture and evidence consistent with the same objectives. Buying a backup feature is an input to that discussion; a successful restoration exercise is evidence about the result.
Keep availability and recovery separate. A replica can help during a component failure, while a recoverable copy is needed when the data itself has been damaged. Specify the failure scenarios you intend to handle, including deletion, bad deployment, disk loss, and loss of a location. Two servers in one failure domain do not automatically satisfy a requirement for independent locations.
Hold the operating contract steady while comparing options. Any relaxed requirement should be an explicit business decision.
Start with waste you can explain and measure
Inventory resources with an owner, environment, purpose, and review date. A long-idle preview environment is a promising investigation target. An apparently idle database replica might be serving a recovery purpose. Ask the owner what the resource does before treating a low utilization graph as permission to remove it.
Schedule development capacity around actual working patterns where interruption is acceptable. Give temporary environments an expiry mechanism and a documented extension path. Preserve state that the team still needs, and include the cost of storage and retained backups after compute stops. Verify the next working session can recreate the environment reliably.
Rightsizing requires representative observations. Examine memory, saturation, request latency, queue age, storage latency, and the workload's busier periods together. A CPU average can hide a short bottleneck that customers experience every afternoon. Make one bounded change, compare against the same service objectives, and retain a clear rollback path.
Separate these improvements from long-term commitments. Reducing unused capacity changes the resource requirement. A commitment discount changes how that requirement is purchased. Apply discounts to a workload you understand, including likely architectural changes and growth, so an attractive rate does not leave the company paying for capacity it stopped using.
Compare responsibilities service by service
Create a responsibility ledger alongside the cost worksheet. For each component, name who handles updates, capacity planning, permissions, monitoring, backups, restoration, and the first response to a failure. Check the actual product tier and agreement; the label managed covers a range of services.
Microsoft's shared-responsibility model distinguishes IaaS, PaaS, and SaaS responsibilities and retains customer ownership of data and identities. The architecture can also mix these arrangements. A team can operate application compute while purchasing a managed database and external incident paging.
The AWS shared-responsibility explanation similarly makes the selected service relevant to the customer's work. With virtual machines, guest operating-system maintenance and application configuration remain important customer responsibilities. Replacing a platform service with those machines should therefore create entries in the operating backlog and the cost model.
| Component | Savings to investigate | Capability to preserve |
|---|---|---|
| Application compute | Idle environments and excessive allocations | Capacity, deployment and recovery behavior |
| Database | Measured sizing, storage and query efficiency | Data durability and tested restoration |
| Network | Unnecessary transfers and inefficient routing | Required isolation and availability |
| Observability | Unused telemetry and unsuitable retention | Evidence needed to diagnose incidents |
Use this ledger to identify a mixed architecture that fits the team. Moving every service because one category is expensive creates a much larger migration than the original problem requires. A focused change also makes it easier to determine whether the expected improvement actually happened.
Evaluate database savings against the recovery work
Database spending often attracts attention because it is a substantial, recognizable line item. Investigate query behavior and required memory before moving the database. A slow query or unsuitable index can consume additional resources in either operating model. Capture the relevant performance evidence and test a change against realistic data volumes.
When comparing managed and operated database designs, specify the deployment type precisely. Amazon RDS documentation distinguishes a Multi-AZ DB instance deployment with a failover standby from a Multi-AZ DB cluster whose standby instances can also serve reads. Those differences affect what the quoted architecture provides.
For an operated alternative, account for replication, backups, storage monitoring, upgrade practice, recovery tooling, and the people authorized to use it. Verify that a restoration can reach the application with the required configuration, credentials, and data. A restore that produces a database on an inaccessible host is an incomplete operational result.
This does not make a managed database the automatic choice. A team with the required capability may operate the database efficiently. The comparison should make that capability visible and price its recurring upkeep. A successful migration transfers responsibility as well as data.
Include network, observability, and growth in the quote
Read the cost dimensions of every service used by the proposed architecture. Network transfer, gateways, addresses, load balancers, storage operations, retained copies, and support can sit outside the advertised compute price. Record the region, currency, taxes, usage assumptions, quote date, and any introductory credits that expire.
Use current provider calculators and rate cards for an actual decision. Hetzner's Cloud product page distinguishes shared and dedicated resources and provides a calculator. Its Cloud FAQ also documents location and capacity restrictions that can affect new provisioning. A low-cost plan must still be available and suitable for the workload you intend to run.
Model expected and busier demand separately. Include what happens when traffic doubles, when retained data accumulates, and when a deployment temporarily runs two versions. A provider minimum can look attractive while usage-priced categories grow elsewhere. Keep those categories explicit instead of hiding them in a single unexplained contingency percentage.
Treat telemetry changes as an engineering experiment. Identify which logs, metrics, or traces are used by a real investigation or alert. Reduce unnecessary volume and evaluate the effect on diagnostic questions. Retaining less data can be appropriate, but it should follow an agreed operational and retention need rather than a blanket rule that all logs are waste.
Different savings decisions require different evidence. Price reductions and changes to the operating contract deserve separate review.
Make the comparison executable
The companion calculator takes a common set of requirements and multiple plans. Each plan supplies recurring provider costs, monthly operating hours, a loaded hourly cost, and a one-time migration estimate. All inputs use one currency. Additional recurring categories can be added explicitly without changing the calculation.
The sample requirements are fictional: two declared failure domains, a data-loss window of at most fifteen minutes, and a recovery time of at most sixty minutes. The inexpensive single-host fixture declares weaker capabilities, so the calculator marks it ineligible. This is a useful check against silently changing the contract to obtain a lower number.
{
"currency": "USD",
"minFailureDomains": 2,
"maxRpoMinutes": 15,
"maxRtoMinutes": 60
}The capability declarations are still assumptions. A field saying sixty minutes does not prove a sixty-minute recovery. Keep architecture review and recovery-test evidence with the real worksheet. The model's purpose is to expose an unequal proposal, not certify the qualifying ones.
import { readFile } from 'node:fs/promises';
import { comparePlans } from './cost-model.mjs';
const scenario = JSON.parse(await readFile('scenario.json', 'utf8'));
for (const result of comparePlans(scenario, 12)) {
console.log(result.name, result.averageMonthlyCost,
result.eligible ? 'declared fit' : result.reasons);
}Run the complete project without installing dependencies or connecting a cloud account:
node cost-model.mjs
node --test cost-model.test.mjsThe fictional managed fixture has a monthly provider total of USD 2,460 and six operating hours at USD 100 per hour. Its twelve-month average is USD 3,060. The fictional operated fixture has a provider total of USD 900, twenty operating hours at the same rate, and USD 6,000 of migration work. Its corresponding average is USD 3,400.
These amounts illustrate why the team should review its assumptions. Reducing the operated fixture to twelve hours per month changes its average to USD 2,600. Under the other unchanged inputs, the operating-hours crossover is 16.6 hours per month. That is a result of this scenario's arithmetic, not a forecast of what operating infrastructure usually requires.
The tests verify composition of the total, migration allocation, invalid numeric inputs, currency mismatch, declared contract failures, sensitivity to operating time, and preservation of the input data. They do not test provider performance or actual recovery. No infrastructure was provisioned for this exercise.
Price the migration and the capacity it consumes
Treat migration as a workstream with an acceptance decision. Include discovery, automation, validation, data movement, temporary duplication, changes to support processes, and rollback preparation. If the new arrangement needs unfamiliar skills, include training and time to build operational competence before it owns a critical service.
Distinguish cash spending from opportunity cost. Moving six hours of work into an already employed engineer's week might not increase payroll immediately. It still consumes capacity that could have been used elsewhere. Include both the provider invoice and a capacity view so finance and engineering can understand the consequences without assuming every hour creates an immediate cash charge.
Use a planning horizon that matches the decision. A twelve-month average can make a one-time migration visible, while a shorter horizon shows the initial cash requirement. Also examine the recurring position after migration. Avoid presenting amortization as an accounting conclusion; in this example it is simply an explicit way to distribute a planning estimate.
Do not invent an outage probability to make the preferred option win. Record important risks separately, identify controls, and define the evidence needed to accept them. If the business chooses a longer recovery window to reduce cost, document that change with its owner. Comparing equal requirements and approving different requirements are both useful decisions when they are stated clearly.
Use a reversible pilot and review the result
Choose a bounded workload for the first change. Establish its current cost and behavior, agree the expected result, and define how to return to the existing arrangement. Exercise deployment, restoration, access revocation, and the alerts that an operator would need during a failure. Include at least one person who did not build the migration in the handover exercise.
After the pilot, compare billed usage with the estimate and record operating work for several normal maintenance cycles. Explain differences by category. A favorable first invoice can reflect a credit, incomplete traffic migration, or unfinished operating tasks. The decision becomes stronger when the team can explain both a normal month and a more demanding one.
The AWS Cost Optimization Pillar frames cost optimization around meeting functional requirements and improving over time. Apply that discipline to the whole deployment. Remove measured waste, purchase the capabilities you need deliberately, and fund the responsibilities that remain with your team. The useful saving is the one the organization can sustain while continuing to deliver the service it promised.




