Cloud backup cost optimization comes down to five practical techniques I use daily: data compression, lifecycle policies, incremental-forever backups, storage tiering, and retention pruning. If your monthly cloud backup invoice keeps climbing despite no real growth in production data, you are probably paying for redundant blocks, outdated retention windows, or hot-tier storage that should have moved to cold months ago. Here is how I bring those bills back under control.
Audit What Is Actually Stored Before Changing Anything
I never start optimizing blind. The first thing I do is pull a storage inventory from the backup platform — Veeam, Restic, Borg, whatever I am running — and look at what is consuming space. Most of the time, the culprit is not the active backups. It is orphaned restore points, old VM backups from decommissioned hosts, or test jobs someone spun up and forgot.
Here is a quick check I run on a Restic repository to see repo size and snapshot count:
restic stats --mode raw-size
restic snapshots | wc -l
If snapshot count is in the hundreds and growing weekly, your retention policy is either too generous or not enforced. I have seen repositories holding 18 months of daily backups for a system that only requires 30 days. That is pure waste.
Enable Compression and Deduplication at the Source
This is the lowest-effort, highest-impact change. Most modern backup tools support built-in compression and deduplication, but they are not always enabled by default.
For file-based backups, I use BorgBackup because its deduplication is chunk-based and genuinely effective across similar datasets:
borg create --compression=zstd,11 \
user@backupserver:/repo::myserver-{now:%Y-%m-%d} \
/path/to/data
The zstd,11 compression level gives me roughly 40-60% reduction on text-heavy workloads like logs and database dumps. For binary-heavy data like VM images, the gain is smaller but still meaningful.
For Veeam environments, I make sure "Storage optimization" is set correctly and deduplication is enabled on the repository. The key point: apply compression before data leaves the source. Compressing after upload to cloud storage means you already paid for the bandwidth.
Use Lifecycle Policies to Move Old Backups to Cold Storage
This is where I see the biggest unnecessary spending. Backups sit in hot SSD-class cloud storage (AWS S3 Standard, Azure Hot Blob) for their entire retention window. But restore probability drops sharply after the first week. Nobody is restoring a backup from day 45 when they have day 2 available.
I configure lifecycle rules that transition backups through storage tiers automatically:
- Days 0-7: Hot tier (fast restore access)
- Days 7-30: Warm tier (infrequent access)
- Day 30+: Cold/archive tier (cheapest storage)
On AWS S3, this looks like:
{
"Rules": [{
"ID": "BackupTiering",
"Status": "Enabled",
"Transitions": [
{"Days": 7, "StorageClass": "STANDARD_IA"},
{"Days": 30, "StorageClass": "GLACIER"}
]
}]
}
Warning: check retrieval fees on archive tiers before committing. Glacier Deep Archive is cheap to store but expensive and slow to restore. I only use it for compliance archives I hopefully never touch.
Switch to Incremental-Forever Backup Models
Full backups every week is a legacy habit that wastes storage. If your backup tool supports incremental-forever — meaning one initial full backup followed by incrementals only — enable it.
In Veeam, this is the default with reverse incremental or forward incremental with synthetic fulls. I prefer forward incremental with periodic synthetic fulls because it balances storage efficiency with restore speed.
For Restic, incremental is automatic. The tool only stores changed blocks, so daily backups of a 500GB dataset might only add a few hundred MB per run:
restic backup /data --tag daily
The trap to avoid: if your backup tool does not do true block-level deduplication across backups, you end up storing redundant data. Check the actual repository growth per backup run. If a daily backup of a mostly-idle server adds 50GB, something is wrong with deduplication settings.
Prune Retention Aggressively and Test Restores
Retention is not a set-and-forget setting. I review retention policies quarterly. Business requirements change, compliance windows shift, and storage costs evolve. A policy that made sense 18 months ago might be burning money today.
Here is my standard retention baseline for non-compliance workloads:
- Dailies: 14 days
- Weeklies: 4 weeks
- Monthlies: 3 months
- Yearlies: 1 per year (if required)
For Restic, I automate pruning with a scheduled job:
restic forget --keep-daily 14 --keep-weekly 4 \
--keep-monthly 3 --keep-yearly 1 --prune
As I mentioned in my earlier post about the [3-2-1 backup rule](https://furkanikkan.com/urun/3-2-1-yedekleme-kurali-sadece-yedek-almak-yetmez-49), having backups is only useful if you can actually restore from them. Cost optimization means nothing if you break restore capability in the process. Every time I change retention or storage tiers, I run a test restore to confirm the backup is still viable.
Monitor Storage Growth Continuously
Optimization is not a one-time project. I set up alerts on storage consumption trends. If a backup repository grows more than 15% month-over-month without a corresponding production data increase, I investigate immediately.
For monitoring, I use a simple script that logs repository size daily and feeds it into my Grafana dashboard. Sudden spikes usually indicate a failed deduplication job, a new large dataset someone started backing up without telling me, or a retention policy that stopped working.
The bottom line: cloud backup costs are controllable if you treat storage as a finite resource. Compress before upload, tier aggressively, deduplicate properly, and prune what you do not need. Your monthly bill will reflect the effort within one billing cycle.
Cover image: Unknown · CC0 (Openverse / kamu malı) · https://svgsilh.com/3f51b5/image/303333.html
