2026-05-02·12 min read·

AWS QLDB EU Alternative 2026: Why an Immutable Ledger Is a GDPR Art.17 Compliance Nightmare

Post #780 in the sota.io EU Compliance Series

AWS QLDB (Quantum Ledger Database) is Amazon's managed ledger database service. It offers an append-only, cryptographically verifiable journal that makes every document change permanently auditable. The design goal is a database with an immutable history: once a record is written to the QLDB journal, that write is permanently preserved, and the entire chain of changes to every document can be independently verified using cryptographic digests.

This immutability is QLDB's defining feature and primary selling point. For financial audit trails, supply chain provenance, regulatory compliance logging, and medical record tracking, the ability to prove that data has never been tampered with is valuable.

It is also, for organisations processing EU personal data, one of the most direct structural conflicts with GDPR in the AWS service catalogue.

AWS operates QLDB in Frankfurt (eu-central-1) among other regions. It ships with the standard AWS GDPR Data Processing Addendum and Standard Contractual Clauses. And like every other AWS service, it is operated by Amazon Web Services, Inc., a Delaware-incorporated, wholly-owned subsidiary of Amazon.com, Inc. — fully subject to the CLOUD Act (18 U.S.C. § 2713), regardless of server location.

But QLDB's GDPR problem is not primarily about CLOUD Act jurisdiction. It is about what the service fundamentally does: it makes personal data undeletable by design.

This post analyses QLDB's GDPR exposure, explains why the immutable journal creates an Art.17 structural conflict, and maps the best EU-native alternatives for ledger and audit log use cases in 2026.


What QLDB Does — and Why Immutability Conflicts with GDPR

QLDB is built on three core components, each with distinct GDPR implications.

The journal: The journal is QLDB's core data store. It is a sequence of committed transactions, stored as immutable journal blocks, each containing the document changes made in that transaction. The journal is append-only: blocks are added but never modified or deleted. The journal's cryptographic integrity is maintained through a hash chain — each block includes a hash of the previous block's content, creating a Merkle-tree structure across the ledger's history.

This design means that once a document — including a document containing personal data — is written to a QLDB journal block, that write is permanent. The block cannot be removed without invalidating all subsequent blocks in the hash chain. AWS does not offer an API for deleting individual journal blocks. There is no DELETE FROM journal WHERE ... operation. The journal grows monotonically for the lifetime of the ledger.

Document tables (the "user-facing" layer): On top of the journal, QLDB exposes document tables queried via PartiQL. These tables present the current state of each document. Documents can be updated and deleted via PartiQL DML operations. When you delete a document from a QLDB table, the document's current state is removed from the active table view — it no longer appears in SELECT queries against the current state.

However, the deletion is recorded as a new journal entry. The deleted document's previous revisions remain permanently in the journal. The history() function — a built-in QLDB PartiQL extension — allows querying all historical revisions of any document:

SELECT * FROM history(my_table, `2025-01-01T`, `2026-12-31T`)
WHERE metadata.id = 'document-id-12345'

This query returns every version of the document that ever existed, including versions that were "deleted" from the table view. The personal data in those deleted revisions is permanently retrievable from the QLDB journal.

Cryptographic digests: QLDB exposes a GetDigest API that returns a SHA-256 hash representing the current state of the entire ledger's journal. This digest can be used to cryptographically prove that the ledger has not been tampered with. The digest mechanism depends on the journal being fully intact — if any historical block were removed, the digest would change, and the proof would fail.

The digest mechanism is useful for regulatory audit scenarios where an external party needs to verify ledger integrity. But it also makes it structurally impossible for AWS (or any operator) to delete historical journal blocks without breaking the entire integrity guarantee of the service.


GDPR Art.17: The Right to Erasure vs. Immutable History

GDPR Art.17 grants data subjects the right to obtain erasure of personal data "without undue delay" when certain conditions apply — including when the data subject withdraws consent (Art.17(1)(b)), when the data is no longer necessary for its original purpose (Art.17(1)(a)), or when the data was unlawfully processed (Art.17(1)(d)).

For a QLDB deployment storing personal data, a valid Art.17 erasure request creates a situation that cannot be fully resolved:

  1. Table-level deletion is possible but incomplete: You can delete a document from the QLDB table view. This removes the current state. But the previous revisions of that document — including the original INSERT that created it and all intermediate UPDATE revisions — remain permanently in the journal.

  2. The history() function exposes all historical revisions: Any user or application with QLDB read access and knowledge of the document ID can retrieve every historical version of a deleted document using the history() function. The personal data in those revisions is accessible until the ledger itself is deleted.

  3. Ledger deletion is the only complete erasure path: The only way to permanently erase personal data from QLDB is to delete the entire ledger. This is not a practical response to an individual data subject's Art.17 request, as the ledger typically contains data for thousands or millions of users.

  4. The digest chain prohibits selective erasure: Even if AWS were willing to implement selective journal block deletion, doing so would invalidate all subsequent digests and break the cryptographic integrity guarantee that is the service's primary value proposition. Selective erasure is architecturally incompatible with QLDB's design.

The result is that QLDB, when used to store personal data, creates a structural conflict with GDPR Art.17: the data subject's right to erasure cannot be fulfilled for historical journal revisions.

GDPR Art.17(3) lists legitimate grounds for refusing erasure — including legal obligations (Art.17(3)(b)) and tasks in the public interest (Art.17(3)(c)). For an audit trail required by law (e.g., financial transaction logs required by DSGVO-adjacent financial regulation, or medical records governed by national health law), these exceptions may apply. But the exception is narrow: it applies to specific legal obligations, not to all data in a general-purpose ledger. User profile data, session history, behavioural records, and other personal data stored in QLDB for application-level auditing purposes do not typically qualify for the Art.17(3) exceptions.


GDPR Art.5(1)(e): Storage Limitation and the Perpetual Ledger

GDPR Art.5(1)(e) requires personal data to be "kept in a form which permits identification of data subjects for no longer than is necessary for the purposes for which the personal data are processed."

QLDB's journal retains every revision indefinitely. There is no built-in retention policy for individual journal entries. The ledger grows for the lifetime of the service deployment — there is no automated age-out of historical blocks.

If your QLDB ledger records user activities, order history, or account changes, the journal accumulates every action by every user for as long as the ledger exists. A user who created an account three years ago, made ten purchases, and then closed their account has all ten purchase records and all account changes permanently preserved in the journal's history, even after table-level deletion.

The only retention control available in QLDB is the export function: you can export journal blocks to S3 and then delete the QLDB ledger. But "delete the ledger and recreate it without the historical data" is not a retention policy — it is a destructive operation that breaks audit trail continuity for all other users' data.

For organisations with GDPR storage limitation obligations, QLDB's indefinite journal retention creates a systematic violation: data that should be erased after a specified retention period (e.g., order history older than 3 years) cannot be selectively purged from the journal.


GDPR Art.5(1)(b): Purpose Limitation and the Audit Function Tension

The tension between GDPR's purpose limitation principle and audit/ledger systems is a known compliance challenge that predates QLDB. The question is: what is the legitimate purpose of retaining a complete, immutable history of personal data?

For financial institutions subject to anti-money-laundering (AML) regulation, the purpose is clear: transaction history must be retained for regulatory audit. For medical records under Article 9 special category data, national health law may require retention. These are specific, legally grounded purposes.

But QLDB is often deployed for general-purpose audit logging — tracking who changed what in an application, providing accountability for administrative actions, or recording business events for operational analytics. For these use cases, the purpose for retaining personal data in the immutable journal beyond its primary processing purpose (e.g., completing a transaction) is weaker.

GDPR Art.5(1)(b) permits further retention for "archiving purposes in the public interest, scientific or historical research purposes or statistical purposes" with appropriate safeguards. Application-level audit logging does not typically qualify. The result is that general-purpose QLDB deployments storing personal data in the journal may lack a valid legal basis for the indefinite retention that the journal architecture enforces.


QLDB Streams and the Secondary Copy Problem

QLDB Streams allow you to subscribe to real-time journal changes and deliver them to an Amazon Kinesis Data Streams endpoint. Applications use QLDB Streams for real-time event processing, downstream data pipelines, and cache invalidation.

From a GDPR perspective, QLDB Streams create a secondary copy of all personal data changes outside the QLDB journal itself. When a QLDB Stream delivers journal records to Kinesis, those records contain the full document content — including every personal data field — at the time of each revision.

Kinesis Data Streams retains records for 24 hours by default (extendable to 365 days). The Kinesis shard is not subject to QLDB's immutability — Kinesis records do age out according to the configured retention period. However, during the retention window, the Kinesis stream contains a complete copy of every QLDB document revision for all users' personal data.

Art.17 erasure requests thus need to address three locations:

  1. The QLDB table view (deletable via PartiQL)
  2. The QLDB journal history (not deletable without destroying the ledger)
  3. The Kinesis Stream records (age out automatically, but may contain the data during the retention window)

And if the Kinesis stream feeds a downstream data store — an S3 data lake, a Redshift warehouse, or an OpenSearch index — those downstream copies create additional erasure obligations.

The QLDB + Kinesis Streams architecture, in a typical data engineering pattern, creates four or more copies of personal data, each with different retention characteristics and different erasure procedures. Managing Art.17 erasure across all of them requires a structured data lineage map and automated erasure workflow — not a standard capability in most organisations' tooling.


The CLOUD Act Problem with QLDB

QLDB inherits the same CLOUD Act jurisdiction exposure as every other AWS service. Amazon Web Services, Inc. is a US corporation. A valid CLOUD Act order can compel AWS to disclose the contents of your QLDB journal — including the complete revision history of every document — without a European court order, without advance notice, and potentially under a gag order.

For QLDB specifically, the CLOUD Act exposure is amplified by the immutable history. If you are a financial services organisation using QLDB to record transaction history, a CLOUD Act order directed at AWS reaches not just current balances but the complete, cryptographically verified history of every transaction ever recorded. The immutability that protects your audit trail from internal tampering also means that the disclosed data is maximally comprehensive and tamper-evident.

The combination of CLOUD Act jurisdiction + QLDB immutability means that, for EU personal data stored in QLDB, both the current state and the complete historical record are permanently reachable by US law enforcement — with no mechanism to selectively purge historical journal blocks even if a court order required it.


Pseudonymisation as a Partial Mitigation

One mitigation approach for storing personal data in immutable ledgers is pseudonymisation under GDPR Art.4(5): replacing direct identifiers with reversible pseudonyms so that the journal contains only pseudonymous identifiers rather than directly identifiable personal data.

If your QLDB journal stores a user identifier like user_uuid_8a3f2c91 instead of name: "Alice Smith", email: "alice@example.com", then:

This approach has real constraints:

  1. The pseudonymisation table is itself personal data: The mapping from user_uuid_8a3f2c91 to Alice Smith must be stored somewhere. That store must support Art.17 erasure.

  2. Re-identification risk persists until the pseudonymisation table is erased: As long as the mapping exists, the historical journal data is personal data. The CLOUD Act exposure remains during this period.

  3. Pseudonymisation is not anonymisation: GDPR Recital 26 notes that pseudonymous data remains personal data. Pseudonymisation reduces risk but does not exempt data from GDPR obligations.

  4. Key rotation and cryptographic erasure: Some organisations implement "cryptographic erasure" — encrypting journal entries with a per-user key and deleting the key when erasure is requested. The encrypted data remains in the journal but is computationally unreadable. Supervisory authorities have varying views on whether cryptographic erasure satisfies Art.17. The EDPB has not issued a definitive opinion. It remains a legal grey area.

Pseudonymisation is a partial mitigation, not a complete solution. For organisations committed to QLDB, it is the best available approach — but it requires careful architecture and should be validated with your DPO before deployment.


EU-Native Alternatives for Immutable Audit Logs

The following alternatives replace QLDB with EU-native or self-hosted immutable audit log infrastructure that resolves the CLOUD Act jurisdiction problem.

immudb: An open-source, tamper-proof, immutable database built by Codenotary. immudb provides the same cryptographic integrity guarantees as QLDB — append-only storage, cryptographic hash chains, tamper-evident audit logs — but is open source (Apache 2.0 licence) and fully self-hostable on EU-jurisdiction infrastructure. immudb also supports a DELETE operation that records the deletion event in the hash chain rather than truly removing data (same semantics as QLDB), but it supports optional key expiration that allows for TTL-based data lifecycle management — a capability QLDB lacks. Self-hosted on Hetzner, OVH, or Scaleway, immudb resolves the CLOUD Act jurisdiction problem. https://immudb.io

PostgreSQL with cryptographic audit logging: PostgreSQL does not offer native QLDB-style immutability, but purpose-built audit extensions and architectural patterns can provide equivalent guarantees. The pgaudit extension provides fine-grained audit logging of all database operations to PostgreSQL's logging infrastructure. Combined with a Write-Ahead Log (WAL) archive shipped to immutable object storage (e.g., Scaleway Object Storage with Object Lock), PostgreSQL provides a tamper-evident audit trail that:

This pattern trades QLDB's built-in cryptographic verification for a more flexible architecture that supports GDPR erasure in the live database while maintaining immutable archive logs for regulatory purposes.

Apache Cassandra with immutable write patterns: For financial services and supply chain use cases requiring high-throughput immutable event logging, Apache Cassandra with append-only table design (no updates or deletes in the schema, time-series partitioning) provides a distributed, self-hostable alternative. EU-managed Cassandra is available from OVHcloud (Managed Cassandra), ScyllaDB Cloud (EU regions), and self-hosted via DataStax Enterprise or open-source Cassandra on Hetzner.

Hyperledger Fabric on EU infrastructure: For multi-party ledger use cases where cryptographic non-repudiation between independent organisations is required, Hyperledger Fabric on EU-native Kubernetes infrastructure provides a permissioned blockchain without US jurisdiction. IBM Blockchain Platform (IBM Cloud Frankfurt) and self-hosted Fabric on OVH or Hetzner are both viable options. Hyperledger Fabric supports rich GDPR-compatible design patterns including private data collections (off-chain personal data with on-chain hashes) and data expiry policies.

Self-hosted Dolt: Dolt is a MySQL-compatible database that provides Git-style version history for all data changes. Unlike QLDB, Dolt supports explicit deletion of historical commits, making it compatible with Art.17 erasure. Self-hosted on EU infrastructure, Dolt provides human-readable version history, diff operations, and merge semantics — a developer-friendly audit log that trades QLDB's cryptographic verification for better GDPR compliance. https://github.com/dolthub/dolt


Use-Case Analysis: When to Migrate Off QLDB

Not every QLDB deployment carries the same GDPR risk. The risk profile depends on what personal data the QLDB ledger stores.

High risk — migrate urgently: QLDB ledgers storing user profile data, transaction histories, behavioural records, or any data subject to regular Art.17 erasure requests. The journal's indefinite retention and non-erasability create systematic non-compliance.

Medium risk — assess carefully: QLDB ledgers storing financial transaction records subject to specific legal retention obligations (AML, MiFID II, etc.). The Art.17(3)(b) exception may apply to legally mandated retention, but the CLOUD Act jurisdiction exposure remains, and the exception does not cover all data in the ledger.

Lower risk — document and monitor: QLDB ledgers storing non-personal operational data (hardware asset registries, configuration change logs, software deployment histories). No personal data in the journal means no Art.17 conflict. But verify that the ledger truly contains no personal data — developer usernames, IP addresses, and email-keyed entries are personal data.


Migration Approach: QLDB to EU-Native Immutable Audit Log

Migrating from QLDB requires two parallel tracks:

Historical data export: Use the QLDB Export Ledger API to export all journal blocks to S3. Export the journal before decommissioning QLDB so you retain the historical record for any legally required retention period. Store the exported journal blocks in EU-native object storage (Scaleway, OVH, IONOS) with appropriate access controls. This exported journal represents the historical audit trail; it is not queryable in real-time but is accessible for legal hold or regulatory examination.

Live data migration: For each document table in QLDB, export the current state and import it into the replacement system. For immudb, use the immudb SDK to write current-state records. For PostgreSQL, write to the table with the current state as the initial row. New write operations flow to the replacement system as the application cutover proceeds.

The trickiest part of QLDB migration is applications that use the QLDB history() function to query historical revisions. These queries need to be rewritten against the replacement system's version history API (immudb's GetAllEntries, PostgreSQL's WAL archive, etc.). Audit tooling that relies on QLDB's cryptographic digests needs to be rebuilt for the replacement system's integrity verification mechanism.


Conclusion

AWS QLDB's immutability is simultaneously its most valuable feature and its most serious GDPR problem. For EU organisations processing personal data, the permanent, non-erasable journal directly conflicts with GDPR Art.17's right to erasure and Art.5(1)(e)'s storage limitation principle.

The Art.17 conflict is not a configuration problem that can be mitigated through GDPR DPA language or Standard Contractual Clauses. It is architectural: the journal is designed to be permanent, and no AWS API allows deletion of individual journal blocks. If you store personal data in QLDB and receive a valid Art.17 erasure request, you cannot fully honour it without deleting the entire ledger.

For organisations that genuinely need immutable audit logs with cryptographic verification, the EU-native alternatives — immudb, PostgreSQL with WAL archiving to object-locked EU storage, or Hyperledger Fabric on EU infrastructure — provide the same trust model without US jurisdiction. For organisations that used QLDB primarily for application-level audit logging without a strict immutability requirement, migrating to standard PostgreSQL or Cassandra on EU infrastructure is a simpler path that gains GDPR compliance without losing core functionality.

The session data, transaction histories, and behavioural records that QLDB typically stores are exactly the categories of data that GDPR's erasure and storage limitation obligations are designed to protect. A ledger that makes them permanently undeletable is incompatible with those obligations — regardless of how well it serves the audit trail use case.


Part of the sota.io EU Compliance Series. sota.io is an EU-native PaaS — deploy your application on European infrastructure under European jurisdiction. No US parent company, no CLOUD Act exposure, GDPR-native from day one.

EU-Native Hosting

Ready to move to EU-sovereign infrastructure?

sota.io is a German-hosted PaaS — no CLOUD Act exposure, no US jurisdiction, full GDPR compliance by design. Deploy your first app in minutes.