Variant store on AWS: design & implementation
Last reviewed: 2026-06-28 — see the freshness policy.
Learning objectives
After this chapter you will be able to:
- Compare the concrete options for a population-scale variant store on AWS.
- Choose between managed (HealthOmics), managed-Iceberg (S3 Tables), and DIY (Iceberg/TileDB).
- Design partitioning, incremental ingest, and clinical joins for variant data.
From "what" to "how" on AWS
Variant stores & scale covered why per-sample VCFs don't scale and what a columnar, sample-aware store must do. This chapter is the AWS implementation — the build the genomics platform actually ships, and a hands-on lab. The recurring requirements: cross-sample queries (allele frequency, carriers), incremental sample addition (the N+1 problem), a join to clinical data (OMOP), and PHI-grade governance.
The options
flowchart LR
VCF["gVCF / VCF"] --> Choice{"Variant store on AWS"}
Choice --> HO["HealthOmics variant store<br/>(managed)"]
Choice --> S3T["S3 Tables<br/>(managed Apache Iceberg)"]
Choice --> Ice["S3 + Iceberg<br/>(custom)"]
Choice --> TDB["TileDB-VCF<br/>(sparse arrays)"]
HO & S3T & Ice --> Athena["Query: Athena / Spark / Trino"]
TDB --> TDBq["Query: TileDB API / Spark"]
Athena --> Join["Join to clinical (OMOP) · Lake Formation governance"]
| Option | What it is | Ops burden | Best when |
|---|---|---|---|
| HealthOmics variant store | Managed: ingest VCFs, query via Athena/Lake Formation; built-in provenance with HealthOmics workflows | Lowest | You want managed genomics end-to-end with audit, on AWS |
| S3 Tables | AWS-managed Apache Iceberg tables in S3 with automatic compaction/maintenance | Low–medium | You want open Iceberg + SQL without operating table maintenance |
| S3 + Iceberg (custom) | DIY: convert VCF→Parquet, define your own Iceberg tables on S3, query with Athena/Spark/Trino | Medium–high | You need full control of schema, partitioning, and engines |
| TileDB-VCF | Sparse multi-dimensional array storage purpose-built for variant data | Medium | Dense cohort queries, efficient incremental ingest, array semantics |
Why Iceberg matters here
Variant data is huge, append-heavy (new samples), and schema-evolving (new annotations). Apache Iceberg (open table format) gives ACID transactions, schema evolution, partition evolution, and time travel on S3 — exactly the properties a growing variant store needs. S3 Tables is AWS's managed-Iceberg option: you get Iceberg semantics without running compaction and snapshot expiration yourself. The custom S3+Iceberg path trades that convenience for full control (custom partitioning, your choice of Athena/Spark/Trino/EMR).
Design considerations
- Model + partition for the query. Store one row per (variant, sample) call in a long/columnar layout; partition by chromosome (and often by sample batch) so cohort scans prune aggressively. Right-size Parquet files (avoid the small-files problem — what S3 Tables auto-compaction solves for you).
- Incremental ingest (N+1). Use gVCFs and an append/merge strategy (Iceberg upserts, or HealthOmics import jobs) so sample N+1 doesn't reprocess all N. Validate this explicitly when choosing a store.
- Join to clinical data. Land the variant store and the OMOP gold layer in the same lake so genotype↔phenotype joins are a query, not a data movement (the payoff — target discovery, biomarkers).
- Governance. Genomic data is inherently re-identifying — govern as high-sensitivity PHI: Lake Formation column/row controls, KMS, and audit (see governance and de-identification).
- Cost. Compute-dominated queries; co-locate with storage to avoid egress, use columnar pruning, and archive raw FASTQ/CRAM after QC (see TCO).
Choosing
- Want managed genomics with provenance, all-AWS? HealthOmics variant store.
- Want open Iceberg + SQL, minimal table ops? S3 Tables.
- Need full control of layout/engines, or multi-cloud portability? Custom S3 + Iceberg.
- Array-style cohort queries and incremental ingest are central? TileDB-VCF.
Many platforms combine them: HealthOmics for ingest/provenance, Iceberg/S3 Tables for the analytical store joined to OMOP.
Lab
hls-variant-store-aws — build and benchmark the same cohort queries across a HealthOmics variant store, an S3 Tables (managed Iceberg) table, and a custom S3+Iceberg layout, then join to synthetic OMOP clinical data.
Check yourself
- Why does Apache Iceberg suit a growing variant store, and what does S3 Tables add over rolling your own Iceberg?
- How do you keep sample N+1 from reprocessing all prior samples, and which design choices support it?
- Why land the variant store and the OMOP gold layer in the same lake?