Replicating Glacier-Class Spatial Objects Across Regions

Replication rules are written against buckets, but the objects in a mature spatial archive are not all in the same storage class — and the ones most worth protecting are usually the coldest. This walkthrough is for the archive operator who enabled replication after the lifecycle rules had already moved years of imagery and point clouds into Glacier and Deep Archive, and who now needs those objects in a second region without restoring the entire archive to get them there. Default behaviour will not do it: replication reads the source object, and an object in an archive class cannot be read until it is restored.

Why Cold Sources Behave Differently

A replication rule copies an object by reading it. For Standard, Standard-IA and Glacier Instant Retrieval that read is immediate. For Glacier Flexible Retrieval and Deep Archive it is not possible at all without a restore, so the platform simply does not replicate those objects — a batch replication job filtered on “eligible for replication” skips them silently, and the inventory reconciliation that follows shows a gap nobody caused.

Which source classes can be replicated directly Five storage classes with their replication eligibility: the three instant-access classes replicate directly, while Glacier Flexible Retrieval and Deep Archive must be restored to a temporary copy before replication can read them. source classreplicates directly?what it needs first STANDARDyesnothing STANDARD_IAyesnothing GLACIER_IRyesnothing — instant reads GLACIERnorestore to a temporary copy DEEP_ARCHIVEnorestore, up to 12 hours

Step-by-Step Procedure

Step 1 — Quantify the cold backlog from the inventory

Do not discover the size of this job by running it. The daily inventory report already carries a storage-class column, so the exact object count and volume per class is one query away.

# Athena over the S3 inventory table: how much of the archive is unreplicatable today?
aws athena start-query-execution --query-string "
  SELECT storage_class,
         COUNT(*)                     AS objects,
         ROUND(SUM(size)/1e12, 2)     AS tb
  FROM spatial_archive_inventory
  WHERE dt = '2026-08-01'
    AND key LIKE 'archive/%'
    AND replication_status IS NULL
  GROUP BY storage_class
  ORDER BY tb DESC" \
  --result-configuration OutputLocation=s3://spatial-archive-logs/athena/

A typical result for a mature archive shows the majority of objects in GLACIER and DEEP_ARCHIVE — the exact population that the replication rule quietly skipped.

Step 2 — Restore the backlog in controlled waves

Restoring the whole cold archive at once is both expensive and operationally hostile: restores expire, and an expired temporary copy that has not yet been replicated has to be restored again. Wave the job so that each batch’s restore window comfortably exceeds the time replication needs to drain it.

# Restore one wave: bulk tier, 10-day availability window
aws s3control create-job \
  --account-id 123456789012 \
  --operation '{"S3InitiateRestoreObject":{"ExpirationInDays":10,"GlacierJobTier":"BULK"}}' \
  --manifest-generator '{"S3JobManifestGenerator":{
      "SourceBucket":"arn:aws:s3:::spatial-archive",
      "Filter":{"KeyNameConstraint":{"MatchAnyPrefix":["archive/imagery/2019/"]},
                "ObjectSizeGreaterThanBytes":0}}}' \
  --report '{"Bucket":"arn:aws:s3:::spatial-archive-logs","Format":"Report_CSV_20180820",
             "Enabled":true,"Prefix":"restore-wave-2019","ReportScope":"AllTasks"}' \
  --priority 5 \
  --role-arn arn:aws:iam::123456789012:role/spatial-archive-batch \
  --region us-east-1

Ten days is deliberate. A bulk restore takes up to twelve hours, batch replication of a large wave takes hours more, and the margin absorbs a retry without a second restore charge.

Step 3 — Replicate the restored wave

Once the temporary copies exist, batch replication can read them. Filter on the same prefix as the restore wave so the two stay in step.

aws s3control create-job \
  --account-id 123456789012 \
  --operation '{"S3ReplicateObject":{}}' \
  --manifest-generator '{"S3JobManifestGenerator":{
      "SourceBucket":"arn:aws:s3:::spatial-archive",
      "Filter":{"EligibleForReplication":true,
                "ObjectReplicationStatuses":["NONE","FAILED"],
                "KeyNameConstraint":{"MatchAnyPrefix":["archive/imagery/2019/"]}}}}' \
  --report '{"Bucket":"arn:aws:s3:::spatial-archive-logs","Format":"Report_CSV_20180820",
             "Enabled":true,"Prefix":"replicate-wave-2019","ReportScope":"AllTasks"}' \
  --priority 5 \
  --role-arn arn:aws:iam::123456789012:role/spatial-archive-batch \
  --region us-east-1

Note that the destination class is still whatever the replication rule specifies, not the source’s class — a restored Deep Archive object replicates into the destination class you configured, which is exactly what you want. The source object returns to Deep Archive when the temporary copy expires, untouched.

Timing of one restore-and-replicate wave A wave timeline: bulk restore requested at hour zero completing by hour eleven, batch replication from hour twelve to twenty, inside a ten-day restore availability window, with the next wave starting on day two. bulk restore · 0–11 h batch replicate · 12–20 h restore availability window · 10 days wave 2 restore · day 2 h 0h 12day 2day 10 The margin between replication finishing and the window expiring is what makes a retry free rather than a second restore charge. Size each wave so its replication drains well inside the window — usually a few terabytes rather than a few hundred.

Validation & Verification

Reconcile per wave rather than at the end, so a failed wave is caught while its restore window is still open.

# Objects in this wave, and how many now report a completed replication
aws s3api list-objects-v2 --bucket spatial-archive \
  --prefix archive/imagery/2019/ --query 'length(Contents)' --output text

aws s3api list-objects-v2 --bucket spatial-archive-dr-euw1 \
  --prefix archive/imagery/2019/ --query 'length(Contents)' \
  --output text --profile dr-account

Both numbers should match before the wave is signed off. The batch job’s completion report also lists per-object outcomes, and a wave with a small number of FAILED rows is normally an encryption-key or permission problem on those specific keys rather than a systemic failure.

Troubleshooting

Symptom Root cause Fix
Batch replication job reports zero eligible objects Wave’s restores have not completed, or already expired Check Restore header on a sample; re-run the restore wave with a longer window
Some objects replicate, deep-archive ones do not Manifest filter caught only the restored prefix subset Align restore and replication filters on identical prefixes
Restore charges far above estimate Expedited tier selected by default in a script Set GlacierJobTier: BULK explicitly for backlog work
Replica objects land in STANDARD Rule’s destination class omitted Fix the rule and re-replicate the affected wave
Source objects now billed at Standard rates Restore was interpreted as a class change on another platform On S3 a restore is a temporary copy and does not change the class; verify with head-object

The last row matters when an archive spans providers: a restore on S3 leaves the object in its archive class, while a rehydration on some other platforms moves the blob to a hotter tier and leaves it there, which turns a backlog replication into an unintended and expensive re-tiering of the whole archive.

Cost of replicating a 60 TB cold backlog Four cost components for a one-off backlog replication: bulk restore retrieval, restore requests, cross-region transfer, and the ongoing destination storage, with transfer dominating the one-off total. 60 TB backlog · 84,000 objects · one-off bulk restore retrieval $150 restore requests $21 cross-region transfer $1,230 — the dominant one-off line destination storage $240 / month ongoing Restoring the backlog is cheap; moving it between regions is not. Replicate what is authoritative, not what is convenient.

Operational Execution Checklist

Frequently Asked Questions

Does replicating from a restored copy count as reading the archive?

Yes, and it is billed accordingly: the restore retrieval charge applies exactly as it would for any other read. That is the unavoidable cost of getting cold data into a second region, and it is one-off — once the replica exists, subsequent changes replicate normally because new objects are written to instant-access classes before any lifecycle rule moves them.

Should the backlog be replicated at all, or only new data?

Replicate the backlog if the archive’s value is in its history, which for spatial holdings it usually is: a decade of imagery is not reconstructable, whereas last month’s ingest often still exists upstream. The pragmatic order is to replicate new writes first, so protection starts immediately, then work the backlog in waves from the most irreplaceable material outward.

Can the destination be Deep Archive rather than Glacier?

Yes, and it lowers the standing cost further — at the price of a twelve-hour restore during a recovery. That is a defensible choice for material held purely to satisfy a retention statute and a poor one for anything a real incident would need quickly. Split the replication into two rules with different destination classes rather than accepting one compromise for everything.

Can the backlog be replicated without restoring, by copying from a different source?

Sometimes, and it is worth checking before paying for restores. If the archive retained its ingest sources — the delivered LAZ tiles, the original imagery — those are usually in a warmer location or on-premise, and populating the replica from them costs no retrieval at all. The catch is that the replica then holds objects produced by a second conversion run, which must be proven byte-identical to the primary’s, or the two copies diverge in ways an integrity audit will later flag.

How long should a backlog replication project take?

Plan in months rather than weeks, and treat that as normal rather than as slowness. The work is rate-limited by restore quotas and by the availability windows each wave needs, and rushing it means larger waves, longer windows and more temporary-copy storage. A quarter to replicate a few hundred terabytes of cold material is a reasonable pace.

What if the archive is too large to replicate in full?

Replicate by value rather than by volume. Rank collections by whether they could be reproduced from another source, by their acquisition cost, and by whether anything else depends on them, then replicate downward until the budget is exhausted. Publishing which collections are and are not protected is more useful than a replica that covers an unstated subset.

Up one level: Multi-Region Replication & Disaster Recovery.