Modeling the Cost of a Full Archive Restore

Sooner or later somebody asks what it would cost to get everything back. The question comes from a migration plan, a disaster-recovery review, or a funder wanting to know the archive is not a one-way door — and answering it with a per-gigabyte multiplication understates it by a factor that depends entirely on how the archive is laid out. This walkthrough builds the full model for a real spatial archive, including the terms that only appear at scale.

The Six Terms of a Full Restore

Retrieval pricing is the term everyone models. The other five are what turn a plausible estimate into a wrong one.

Cost terms in a full restore of a 400 TB archive Six terms with their amounts: bulk retrieval, restore requests, temporary copy storage, egress, compute, and early deletion, showing that temporary storage and egress dominate rather than retrieval. 400 TB · 412,000 objects · Glacier Flexible Retrieval · bulk tier · 30-day availability bulk retrieval $1,024 restore requests $21 temporary copy, 30 days $3,318 egress out of region $34,816 — only if the bytes leave; zero if the work happens in-region read + validate compute $380 early deletion $0 if the restore does not re-tier anything

Step-by-Step Procedure

Step 1 — Model the terms explicitly

def full_restore_cost(tb, objects, days_available=30, egress=False, tier="bulk"):
    gb = tb * 1024
    retrieval_rate = {"bulk": 0.0025, "standard": 0.01, "expedited": 0.03}[tier]
    request_rate   = {"bulk": 0.025, "standard": 0.05, "expedited": 10.00}[tier] / 1000

    terms = {
        "retrieval":     gb * retrieval_rate,
        "requests":      objects * request_rate,
        "temp_storage":  gb * 0.023 * (days_available / 30),   # standard rate while available
        "egress":        gb * 0.085 if egress else 0.0,
        "compute":       tb * 0.95,                            # read + checksum, measured
    }
    terms["total"] = sum(terms.values())
    return terms

for tier in ("bulk", "standard", "expedited"):
    c = full_restore_cost(400, 412_000, tier=tier)
    print(f"{tier:>10}: ${c['total']:>12,.0f}   retrieval ${c['retrieval']:,.0f}  "
          f"temp ${c['temp_storage']:,.0f}  requests ${c['requests']:,.0f}")

Step 2 — Model time as well as money

A full restore is rate-limited, not just priced. Restore throughput per account, object count, and the availability window interact: a window too short forces re-restores, and a window too long multiplies the temporary-storage term.

Total restore cost against the availability window Cost rising with the length of the restore availability window because temporary-copy storage scales with it, while retrieval stays fixed. $8k$6k$4k$2k $2,198 $2,973 $4,743 $8,061 7 days14 days30 days60 days restore availability window Too short and an overrun costs a second full retrieval; the window should cover the processing time with a modest margin.

Step 3 — Test the model on a slice before quoting it

# Restore 1% of the archive and measure every term against the invoice
aws s3control create-job --account-id 123456789012 \
  --operation '{"S3InitiateRestoreObject":{"ExpirationInDays":14,"GlacierJobTier":"BULK"}}' \
  --manifest file://restore-slice-1pct.json \
  --report file://restore-slice-report.json \
  --priority 5 --role-arn arn:aws:iam::123456789012:role/archive-batch --region us-east-1

# Two weeks later, isolate the actual charges and compare with the model
aws ce get-cost-and-usage --time-period Start=2026-08-01,End=2026-08-31 \
  --granularity MONTHLY --metrics UnblendedCost --group-by Type=DIMENSION,Key=USAGE_TYPE \
  --filter '{"Tags":{"Key":"project","Values":["restore-drill"]}}'

Extrapolating a measured 1% is far more defensible than extrapolating a price list, and it captures the terms the model forgot.

Validation & Verification

python -m archive.cost restore-model --tb 400 --objects 412000 \
  --window-days 14 --tier bulk --compare-actuals restore-slice-actuals.json
# modelled (1% slice)  $29.73
# actual   (1% slice)  $31.40   (+5.6%)
# extrapolated full    $3,140   ± 6%
# MODEL ACCEPTED

Expected output is agreement within roughly ten percent. A larger gap usually means a term is missing entirely — most often the temporary-copy storage, which does not appear in any retrieval price list.

Troubleshooting

Symptom Root cause Fix
Estimate far below the invoice Temporary-copy storage omitted Add it; it often exceeds retrieval for long windows
Restore stalls partway Account-level restore rate limits Wave the job; lower its priority; expect days, not hours
Second retrieval charge appears Availability window expired mid-processing Size the window to the processing time plus margin
Egress dwarfs everything Processing runs outside the archive’s region Move the compute to the data; egress is avoidable, not inherent
Model right, timing wrong Throughput modelled as unlimited Measure restore throughput on the slice and extrapolate that too

Operational Execution Checklist

The Numbers Worth Quoting Alongside the Total

A single total answers the question and rarely settles it. Four derived figures turn the model into something a decision can be made from, and each is a division away once the model exists.

Four derived figures worth reporting Four figures derived from the restore model that make it usable for a decision. figure example why it matters cost per TB restored $9.85 comparable across archives time to first usable data 4 h what a user experiences avoidable share 89% — the egress line in-region work removes it working-set restore only $168 of $3,140 the realistic scenario The last row usually ends the conversation: almost nobody needs everything, and the working set costs five percent of the total.

Lead with the working-set figure and keep the full-restore total as the ceiling. The ceiling answers the governance question about whether the archive is retrievable at all; the working-set figure answers the operational one about what a real incident costs.

Restore Throughput Is a Constraint, Not a Cost

Money is only half the answer to “could we get everything back?”. The other half is elapsed time, and it is governed by limits that no budget removes: per-account restore rate, the number of objects the platform will process concurrently, and the availability window each wave occupies. A model that reports a dollar figure without a duration invites a plan that cannot be executed.

Restore throughput on a large archive is dominated by object count rather than by volume, because each restore is a request that enters a queue. In practice a well-parallelised job sustains a few thousand restore initiations per minute and completes waves at the tier’s latency, which puts a 400,000-object archive at somewhere between two and five days to fully restore even when nothing goes wrong. Adding workers does not compress that meaningfully — the limit is the service’s, not yours.

Two consequences follow for planning. First, a full restore is a project rather than an operation: it needs a schedule, a wave plan, and someone tracking completion against a manifest, exactly as the backlog replication described elsewhere in this section does. Second, the temporary-copy storage term scales with how long the whole project takes, not with how long one wave takes — objects restored on day one are still occupying paid temporary storage on day five unless their window was sized tightly, which pulls in the opposite direction from the safety margin each wave wants.

The practical resolution is to wave the restore by priority rather than by convenience: the working set first with a short window, then the remainder in waves sized so each is consumed before the next begins. That keeps the peak temporary-storage footprint to roughly one wave rather than the whole archive, which for a 400 TB restore is the difference between a few hundred dollars and several thousand.

Where the Model Meets the Retention Policy

A full-restore model quietly assumes that everything in the archive is restorable, and retention-locked material complicates that in one specific way: a compliance-mode object cannot be deleted, so the temporary copies produced by restoring it are additional storage on top of an object that cannot be removed to compensate. For archives where a large share of the holding is under lock, the temporary-storage term should be modelled at the full archive size rather than at the working set’s.

The second interaction is subtler and matters for migrations. Restoring an archive in order to move it elsewhere does not release the original until its minimum storage duration has elapsed, so the migration pays for both copies during the overlap. On a 180-day minimum that overlap can be most of a year, and a migration plan that models only the destination’s cost understates the total by roughly the source’s annual storage line.

Neither of these makes a full restore infeasible; both make the naive estimate wrong in the same direction. Modelling them explicitly — temporary storage against the full holding, and a stated overlap period for any migration — produces a figure that survives contact with the invoice, which is the only test a cost model has to pass.

Frequently Asked Questions

Would anyone ever restore an entire archive?

Rarely all at once, and the number still matters. It is the figure a migration plan needs, the ceiling a disaster-recovery review asks about, and the quantity that tells you whether the archive is genuinely retrievable or merely stored. Knowing it also tends to change layout decisions: an archive whose full restore is unaffordable is one whose partitioning is doing too little work.

Is expedited retrieval ever worth modelling?

For a full restore, no — the request charge alone makes it an order of magnitude more expensive, and no full-archive scenario needs minutes. It belongs in the model for targeted incident restores, where a handful of objects are needed immediately and the total is trivial.

How does this change for an archive in an instant-retrieval class?

The restore step disappears, which removes the request and temporary-storage terms entirely and leaves retrieval, compute and any egress. The retrieval rate is higher per gigabyte, so the full-restore total is often similar — the difference is that it can be done incrementally, on demand, with no window to manage.

Does the model change if the archive spans several storage classes?

Yes, and it becomes a sum rather than a single calculation. Each class has its own retrieval rate, request rate and restore latency, so a mixed archive is modelled per class and added — which usually reveals that one class dominates the total in a way the blended figure hid. The class holding the most objects, rather than the most bytes, is often the one driving the request term.

How should the compute term be estimated?

From a measured read of a representative sample rather than from an instance price. What the compute is doing — reading, checksumming, and often validating structure — runs at a rate you can measure in an hour, and multiplying that rate by the archive size is far more accurate than reasoning about instance types. In practice it is the smallest term in the model and rarely worth refining further.

Is a full restore ever the right response to an incident?

Almost never. Incidents affect a collection, a prefix or a time window, and the targeted restore that addresses them is orders of magnitude cheaper and faster. The full-restore figure exists to answer a governance question about retrievability and to price a migration — treating it as an incident-response plan is what leads to a recovery that takes days when it could have taken hours.

Two Scenarios Worth Modelling Alongside the Full Restore

The full-restore figure is the ceiling, and two scenarios below it are asked about far more often. Modelling all three from the same terms costs nothing extra and gives a much more useful answer than the ceiling alone.

The first is the collection restore: everything in one collection, typically a few percent of the archive, requested because a project needs the historical baseline or because a defect was found in a derived product and the source must be re-processed. Its cost is the full model applied to that collection’s volume and object count, and its duration is usually a single wave rather than a project. For most archives this lands between tens and a few hundred dollars, which is small enough that the answer to “can we do this?” is almost always yes and the useful part of the model is the elapsed time rather than the money.

The second is the audit restore: a stratified sample across the whole archive, requested to satisfy an integrity or compliance review. It touches many collections and few bytes, which inverts the usual cost shape — the request term dominates, and the retrieval term is negligible. That inversion is worth showing, because it is the case where consolidating small objects pays most obviously and where a naive per-gigabyte estimate is most badly wrong.

Both scenarios also stress different parts of the operational path. A collection restore exercises the wave mechanics and the availability window; an audit restore exercises per-object handling and the completion tracking that a manifest-driven job needs. Running each once a year, at small scale, keeps both paths warm and produces measured figures that make the full-restore extrapolation credible.

Report the three together, in ascending order, with the elapsed time beside each. A reader who sees that a collection comes back in six hours for forty dollars, an audit sample in a day for twelve, and the entire archive in four days for three thousand has enough to plan with — which the ceiling alone never gives them.

How does the model change for an archive that has never been fully read?

It becomes more important rather than less. An archive nobody has restored at scale has untested assumptions everywhere: restore quotas nobody has hit, credentials nobody has exercised, and an object-size distribution whose effect on request charges has never been observed. The one-percent slice test is where those assumptions meet reality, and running it on an untested archive frequently uncovers an operational problem — a missing permission, an unexpected rate limit — that matters far more than the cost figure it was run to produce.

Should the model be shown to whoever funds the archive?

Yes, with the working-set figure leading and the ceiling stated. Funders reasonably want to know that a preservation archive is retrievable, and a modelled figure supported by a measured slice is a far better answer than an assurance. It also reframes a conversation that otherwise focuses entirely on storage cost: retrievability is the thing being paid for, and pricing it makes that visible.

What does the model say about archives that are cheap to store and expensive to retrieve?

That the trade is real and should be chosen deliberately per collection rather than adopted as a default. Deep Archive is the right home for material whose retrieval would be an extraordinary event, and the wrong home for anything read even annually — and the model is what turns that judgement into an arithmetic comparison. The failure mode it prevents is an archive optimised entirely for storage cost that nobody can afford to read.

How does the model handle collections in different regions?

As separate models added together, with the egress term evaluated per region against where the processing will run. An archive spread across regions for residency reasons cannot process everything in one place, so the compute either moves or the bytes do — and the model is where that choice gets priced rather than assumed.

Should the restore model include the cost of validating what comes back?

Yes, as part of the compute term. A restore that is not validated has not established that the archive is intact, only that it is retrievable, and the structural check is a few percent of the read cost. Folding it in also means the model prices the thing the exercise is usually for: proving the archive is both there and usable.

Is the model worth building for a small archive?

Yes, and it takes an hour. The terms are the same at any scale, and a small archive gets the same benefit — a stated retrievability figure — for far less effort. What changes with scale is only whether the answer is comfortable.

How often should the model be re-run?

Annually, and after any change to the archive’s class mix or object-size distribution. Both inputs move slowly and both move the answer materially, so a figure quoted from three years ago is likely to be wrong in a direction nobody has checked.

Up one level: Spatial Archive Cost Modeling.