Multi-Region Replication & Disaster Recovery for Spatial Archives

A spatial archive that exists in one region is one control-plane incident, one mistaken lifecycle rule, or one compromised credential away from being unavailable — and for geospatial holdings the recovery is rarely as simple as copying bytes back. Point-cloud tiles run to hundreds of thousands of objects, imagery collections carry catalogues that must be rebuilt in step with the data, and retention-locked objects cannot be re-created at all if their lock configuration is lost. This topic is for the cloud architects and archive operators who have a working hot/warm/cold tier design and now need to state, defensibly, what happens when the region holding it stops answering.

The Failure Mode: A Copy That Is Not a Recovery

The common failing is not the absence of a second copy but the absence of a rehearsed path back from it. Cross-region replication is easy to enable and produces a reassuring object count in another region; what it does not produce is a working archive. The catalogue still points at the primary region’s URLs. The lifecycle rules that governed transitions were never applied to the destination, so every replicated object sits in whatever class the replication configuration specified — often Standard, quietly costing several times the primary. Retention locks may or may not have been replicated depending on how the rule was written. And the restore automation, the credentials it uses, and the network paths it assumes all name the region that is now unavailable.

The result is a second copy that satisfies an auditor’s checkbox and fails the first real test. A recovery is a sequence of steps that ends with a user able to answer the question they were asking before the incident, and every step in that sequence has to work in the region that survived.

What replication gives you, and what a recovery still needs Six requirements for a working recovery, with only the first — object bytes and versions — satisfied by cross-region replication alone. The remaining five, covering catalogue, lifecycle, locks, automation and the cutover decision, must be provisioned separately. recovery requirementreplication provides it?who provides it object bytes and versions in region B yesreplication rule catalogue resolving to region B URLs nocatalogue build job lifecycle rules on the destination bucket noinfrastructure as code retention locks carried to the replica only if configuredreplication rule options restore automation and credentials in region B nodeployment pipeline a decision procedure for cutover noan on-call runbook

Prerequisite Context

Three things should be in place before replication is designed. The archive needs a stable object layout, because replication configuration is expressed in prefixes and tags and re-keying afterwards means re-replicating. It needs versioning enabled, since replication depends on it and since versioning is the control that protects against the deletion failures replication does not. And it needs the catalogue to be generated from the objects rather than maintained alongside them, because a catalogue built by a job can be rebuilt in the surviving region while one maintained by hand cannot.

Where the archive already applies retention locks, the destination bucket must be created with Object Lock enabled before any replication begins. That flag cannot be added later, so a destination created without it forces a second migration at exactly the moment nobody wants one.

Concept & Design Decisions

The design reduces to four choices, and each has a defensible answer that depends on what the archive is protecting against rather than on a general notion of resilience.

Scope. Replicate everything, or only what cannot be regenerated? Derived products — the delivery copies, the tile pyramids, the warm analytical extracts — can be rebuilt from the archive of record, and paying to replicate them doubles the storage cost of material that a rebuild job could restore in hours. Replicating only the authoritative copies typically covers 30–60% of a spatial archive’s volume and all of its irreplaceable content.

Destination class. The replica’s storage class is set by the replication rule and does not inherit the source’s lifecycle. Setting it to match the source’s eventual class — Glacier for material that will end there — avoids paying Standard prices for a copy that will never be read until an incident. The cost is restore latency during a recovery, which is a recovery-objective decision rather than a storage one.

Isolation. A replica in a second region under the same account protects against regional failure and nothing else. A replica in a separate account, with a role that permits writes from replication and nothing else, additionally protects against credential compromise and against a mistaken policy change in the primary account. The second arrangement costs no more in storage and is materially harder to destroy.

Direction. One-way replication with a documented promotion procedure is simpler to reason about than bidirectional synchronisation, and for an archive — where writes are append-only and infrequent — it gives up almost nothing. Bidirectional configurations introduce conflict semantics that an archive has no natural way to resolve.

Replication topology with account isolation and selective scope Region A holds an account containing the archive of record and derived products. Only the archive of record replicates, into a separate account in region B, landing directly in an archive storage class. Derived products in region B are rebuilt from the replica rather than replicated. Region A · primary account archive of record · 240 TB GeoParquet, COG, COPC · retention-locked derived products · 310 TB delivery copies, tiles, extracts — not replicated Region B · separate account replica · 240 TB written straight to GLACIER · locks carried rebuilt on demand derived products regenerated from the replica replicate Replicating 240 TB rather than 550 TB, into an archive class rather than Standard, cuts the standing cost of resilience by roughly 85%. The dashed boundary is the account separation: replication writes in, and nothing in the primary account can delete what it wrote.

Implementation

The replication rule itself is a small piece of infrastructure-as-code, and its important parts are the ones that are easy to omit: the storage class on the destination, the explicit inclusion of delete markers (or, deliberately, their exclusion), and replica modification sync so that later changes to the source object’s metadata reach the copy.

# Terraform: selective cross-region, cross-account replication for the archive of record
resource "aws_s3_bucket_replication_configuration" "archive_of_record" {
  bucket = aws_s3_bucket.spatial_archive.id
  role   = aws_iam_role.replication.arn

  rule {
    id       = "archive-of-record-to-eu-west-1"
    status   = "Enabled"
    priority = 10

    filter {
      and {
        prefix = "archive/"
        tags = {
          copy_class = "authoritative" # derived products are tagged differently and never match
        }
      }
    }

    # Delete markers are NOT replicated: a delete in the primary must not
    # propagate to the isolated copy. This is the whole point of the isolation.
    delete_marker_replication { status = "Disabled" }

    destination {
      bucket        = "arn:aws:s3:::spatial-archive-dr-euw1"
      account       = "210987654321" # separate account
      storage_class = "GLACIER"      # do not pay STANDARD for a copy nobody reads

      access_control_translation { owner = "Destination" }

      metrics {
        status = "Enabled"
        event_threshold { minutes = 15 } # alert if replication lags beyond RPO
      }
      replication_time {
        status = "Enabled"
        time { minutes = 15 } # S3 Replication Time Control — a contractual RPO
      }
    }

    source_selection_criteria {
      sse_kms_encrypted_objects { status = "Enabled" }
      replica_modifications     { status = "Enabled" }
    }
  }
}

Two clauses carry most of the design. Disabling delete-marker replication is what makes the replica a protection against accidental deletion rather than a faithful mirror of one; it means a delete in the primary leaves the replica intact and a genuine deletion must be performed in both places deliberately. Enabling replication time control converts replication lag from a hope into a measurable objective with an alarm attached.

Validation Gate

Replication is verified by counting, not by observing that it is enabled. The check that matters compares object inventories on both sides, because a rule that silently matches nothing looks identical to one that has nothing to replicate.

# Compare source and replica inventories for the authoritative prefix.
# Both inventory reports are generated daily by the storage platform — no LIST calls.
aws s3api list-objects-v2 --bucket spatial-archive --prefix archive/ \
  --query 'length(Contents)' --output text          # 412037

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

# Spot-check replication status on a recently written object
aws s3api head-object --bucket spatial-archive \
  --key archive/imagery/2024/scene_0417.tif \
  --query '{status:ReplicationStatus,class:StorageClass}'

Expected output is {"status": "COMPLETED", "class": "GLACIER"} on the source side and matching counts on both. A status of PENDING on objects older than the replication-time objective is the signal that the rule is failing rather than lagging — most often because the replication role lost permission on a new prefix, which produces no error anywhere except in this field.

Cost & Performance Trade-offs

Replication has three cost components and one of them is frequently forgotten. Storage in the destination is the obvious one and is minimised by class selection and selective scope. Replication requests and the cross-region transfer of each object are charged once per object and scale with object count, so an archive of many small objects pays disproportionately — the same argument that governs partition sizing applies here. The forgotten component is replication time control, which carries a per-gigabyte premium in exchange for a contractual objective; it is worth it for the material whose recovery objective is measured in minutes and wasteful for the rest.

Configuration Standing cost, 240 TB Recovery time Protects against
No replica unbounded nothing
Same-account, same-region backup ~$980/mo minutes accidental deletion, if versioned
Cross-region replica, STANDARD ~$5,520/mo minutes regional outage
Cross-region replica, GLACIER ~$960/mo 3–5 h restore regional outage
Cross-account, cross-region, GLACIER ~$960/mo 3–5 h restore outage + credential compromise

The last row is the recommendation for most institutional archives: the same price as the row above it, materially stronger isolation, and a recovery time that is acceptable precisely because the archive it protects is already cold.

Failure Modes & Edge Cases

Replication configured before Object Lock. A destination bucket created without Object Lock cannot hold retention-locked replicas, and the failure is silent — objects replicate, locks do not. The only fix is a new destination bucket and a full re-replication.

Existing objects are not replicated. Replication applies to objects written after the rule is enabled. Backfilling requires a batch operation over the existing inventory, which is an explicit job with its own cost and duration; assuming the rule covers history is the single most common gap found in a first audit.

KMS keys are regional. An object encrypted with a customer-managed key in region A cannot be decrypted in region B without a key there and a replication configuration that re-encrypts. A replica that cannot be decrypted during an incident is not a recovery.

Catalogue drift between regions. The replica’s objects are identical; their URLs are not. A catalogue rebuilt in region B must rewrite every asset href, and a catalogue that stores absolute URLs rather than deriving them from a base is much harder to move.

Operational Execution Checklist

Deciding When to Fail Over

The hardest part of a disaster-recovery design is not the replication and not the runbook — it is the decision to invoke it. Failing over too early to what turns out to be a fifteen-minute regional blip means promoting a replica, accepting the write loss, and later reconciling two divergent copies for no benefit. Failing over too late means an outage measured in hours where the archive was recoverable in one.

The decision should be written down before it is needed, as a small set of conditions with an owner attached to each. Two signals are worth waiting on: whether the provider has acknowledged the incident and given an estimated duration, and whether the archive’s own health checks against the primary region have failed consistently rather than intermittently. Two are worth acting on immediately: any indication that data has been lost rather than merely made unavailable, and any confirmation that the outage exceeds the recovery-time objective the archive has published.

When to wait and when to promote the replica Four incident signatures with the action each calls for: wait and communicate, promote, promote immediately, or investigate locally first. signatureactionwhy acknowledged outage, ETA inside the RTO wait, communicatefailover costs more than the wait beyond the RTO, no restoration estimate promotethe objective is the trigger any indication of data loss promote immediatelythe replica is now the archive intermittent errors, no acknowledgement investigate locallymost often a credential or network fault

Name the person who can make the call and the deputy who can make it at three in the morning. A technically flawless replication design that waits four hours for someone with authority to wake up has an RTO of four hours, whatever the runbook says.

Frequently Asked Questions

Does replication protect against ransomware or a malicious insider?

Only in the cross-account configuration, and only with delete-marker replication disabled. Same-account replication shares its blast radius with the primary: credentials that can delete the source can usually reach the replica, and a mass deletion propagates within minutes. The controls that actually answer this threat are account separation, a write-only replication role, versioning, and compliance-mode Object Lock on the replica — replication is the transport, not the protection.

What recovery objectives are realistic for a cold spatial archive?

An RPO of fifteen minutes is achievable with replication time control and is usually more than sufficient for an archive whose write rate is a nightly batch. RTO is the harder number: if the replica lives in an archive class, the floor is the restore latency of that class, which means three to five hours before the first byte. Stating that plainly — and sizing it against what the organisation actually needs — is more useful than an aspirational figure nobody has tested. The measurement procedure is covered in Measuring RPO and RTO for Geospatial Archives.

Should the replica be in a different continent or just a different region?

Different region is nearly always enough for availability; different jurisdiction is a separate question with legal rather than technical drivers. Spatial data frequently carries residency constraints — national mapping data, defence-adjacent imagery, personal data attached to addresses — and a replica placed outside the permitted jurisdiction is a compliance breach regardless of how resilient it makes the archive. Check the residency constraints before the region list.

How is the replica verified without restoring it?

By comparing inventories and checksums rather than bytes. Both sides publish inventory reports containing per-object ETags and sizes; comparing those covers the whole archive at negligible cost. A deeper check — restoring a sample and verifying it opens — belongs in the annual drill rather than in the continuous audit, because it costs a retrieval each time.

How is the replication design reviewed as the archive grows?

Annually, against three questions: is the replicated scope still the material that cannot be regenerated, is the destination class still appropriate for the recovery objective, and does the measured drill time still meet the published one. Growth changes all three quietly — a new collection lands outside the scope tag, an objective tightens, a catalogue rebuild slows — and none of them announce themselves.

Does replication remove the need for versioning?

No, and the two protect against different things. Versioning protects against an overwrite or delete within one bucket; replication protects against losing the bucket. An archive with replication and no versioning loses data to a mistaken overwrite in both regions simultaneously, which is the single most common way archives actually lose material.

Should the replica be readable by ordinary users?

Not routinely. A replica that serves reads acquires its own access patterns, its own cost profile and its own expectations, and it stops being a clean recovery target. Keep it write-only from replication and read-only for verification, and promote it deliberately if it is ever needed.

How often should the replication scope itself be audited?

Quarterly, as a count comparison between what the scope tag matches and what the archive holds. Scope drift is silent and one-directional: new collections miss the tag far more often than old ones lose it.

Up one level: Spatial Archival Architecture & Tiering Strategy.