Data Lakehouse on AWS: Apache Iceberg, S3 Tables, Governance, and AI-Ready Analytics
A practical guide to AWS lakehouse architecture with Apache Iceberg and Amazon S3 Tables: ingestion, catalogs, governance, schema evolution, maintenance, query engines, cost, and migration.
By BoundLayer Engineering Team
BoundLayer is a senior engineering partner for SaaS, fintech, AI automation, cloud infrastructure, legacy modernization, Web3, IoT, GPU computing, and data systems.
Many data platforms begin with a simple pattern: applications write operational data, pipelines copy it into Amazon S3, and analysts query Parquet files or load curated subsets into a warehouse.
The design works until the platform needs reliable updates, schema evolution, near-real-time ingestion, multiple query engines, historical snapshots, and consistent governance. File paths and partition conventions become an informal database protocol that every pipeline must understand.
A data lakehouse adds table semantics to low-cost object storage. On AWS, Apache Iceberg provides the open table format, while Amazon S3, S3 Tables, AWS Glue Data Catalog, Lake Formation, Athena, Redshift, EMR, and Spark can form the storage, catalog, governance, and compute layers.
The result can support analytics, machine learning, and AI applications from one governed data foundation. It can also become an expensive collection of overlapping services if ownership, table design, and maintenance are left implicit.
At BoundLayer, we design lakehouses around business datasets and workload requirements rather than product checklists. This guide explains the practical decisions required to build or modernize an AWS lakehouse with Apache Iceberg and Amazon S3 Tables.
What a Lakehouse Changes
A traditional data lake stores files. The storage layer does not inherently know that a set of Parquet objects represents one table, which files belong to the current version, or how concurrent changes should be committed.
A lakehouse table format adds metadata and transaction semantics over those files.
With Apache Iceberg, a table can support:
- atomic commits;
- consistent snapshots;
- schema evolution;
- partition evolution;
- hidden partitioning;
- row-level updates and deletes;
- time-travel queries;
- multiple engines reading the same logical table;
- metadata-based query planning.
The data remains in open files, typically Parquet, on object storage. Iceberg metadata identifies the active snapshot and the data and delete files that belong to it.
This separates storage from compute. Spark can transform data, Athena can run ad hoc SQL, Redshift can serve analytical workloads, and other Iceberg-compatible engines can access the same tables without each owning a separate copy.
That flexibility is the main architectural value. It is not a reason to remove every warehouse or operational database. Each workload still needs the right serving layer.
When an AWS Lakehouse Is a Good Fit
A lakehouse is useful when the organization has:
- large or growing analytical datasets;
- several teams or engines consuming the same data;
- batch and streaming ingestion;
- frequent schema changes;
- updates, corrections, or regulatory deletes;
- machine learning and AI workloads alongside BI;
- pressure to reduce duplicated data and proprietary lock-in;
- a need for centralized discovery and access policy.
It is usually unnecessary for a small product with a few relational tables and predictable reports. PostgreSQL plus read replicas, materialized views, and a focused warehouse can be simpler and cheaper.
Use the smallest platform that meets the workload. A lakehouse introduces catalogs, table maintenance, distributed processing, data contracts, and governance responsibilities. Those costs are justified when scale or cross-engine access makes file-based pipelines and duplicated warehouses harder to operate.
Reference AWS Lakehouse Architecture
A practical architecture separates ingestion, storage, catalog, governance, compute, and consumption.
Operational databases, SaaS, events, files, IoT
|
Batch ingestion, CDC, and streaming
|
Raw / Bronze Iceberg tables on S3
|
Validation and transformation layer
|
Curated / Silver and Gold Iceberg tables
|
Catalog + governance + data quality
|
+------------------+------------------+
| | |
Athena / Redshift Spark / EMR / Glue ML and AI
| | |
+---------- BI, APIs, agents, models -+
The components have distinct jobs:
- Amazon S3 or S3 Tables: durable table storage;
- Apache Iceberg: table metadata, snapshots, and transactions;
- AWS Glue Data Catalog or SageMaker Catalog: discovery and table metadata;
- AWS Lake Formation: fine-grained data access policy;
- Athena and Redshift: SQL analytics and serving;
- AWS Glue, EMR, or other Spark runtimes: transformation and heavy processing;
- Kinesis, MSK, Firehose, DMS, or application pipelines: ingestion;
- orchestration: schedules, dependencies, retries, and backfills;
- observability: freshness, quality, cost, lineage, and operational health.
Not every deployment needs every service. Choose one default path for ingestion, transformation, catalog access, and query. Multiple engines are valuable when workloads differ, but unnecessary choice increases operational cost.
S3 General Purpose Buckets or S3 Tables
AWS supports two broad ways to operate Iceberg tables on S3.
Self-Managed Iceberg on General Purpose S3
This approach stores Parquet and Iceberg metadata in conventional S3 buckets. Teams configure the catalog, writers, file layout, compaction, snapshot expiration, orphan cleanup, and access policy.
It offers broad control and compatibility. It may be appropriate when:
- existing Iceberg tables already live in standard buckets;
- engines or tools require a specific catalog arrangement;
- custom storage layout or cross-cloud portability is important;
- the team has mature table-maintenance automation;
- a required AWS Region or integration does not support S3 Tables.
Amazon S3 Tables
S3 Tables provides table buckets designed for tabular analytics data. Tables are first-class resources stored in Apache Iceberg format, with managed optimizations intended to reduce routine maintenance.
It is attractive when:
- building a new AWS-native lakehouse;
- reducing compaction and maintenance work matters;
- the supported Iceberg REST Catalog integration fits the compute engines;
- table-level AWS permissions and resource management simplify governance;
- the workload needs higher table transaction and query throughput than a file-oriented setup provides.
The decision should be tested against actual engine support, Region availability, governance, migration, performance, and cost. "Managed" reduces work but does not remove the need for data modeling, quality controls, retention policy, and workload tuning.
Understand the Iceberg Metadata Model
Iceberg performance and reliability depend on its metadata hierarchy.
At a simplified level:
Table metadata
|
Snapshot
|
Manifest list
|
Manifest files
|
Data files and delete files
A commit creates new metadata and atomically updates the table's current state. Readers use a consistent snapshot even while writers create another one.
This architecture enables time travel and concurrent processing, but metadata still requires care. High-frequency tiny commits can create many snapshots and manifests. Poor write patterns can create thousands of small data files. Row-level changes can accumulate delete files that slow reads.
Monitor metadata growth as a first-class platform signal. A table can have a modest data volume and still perform badly because its file and manifest structure is fragmented.
Design Tables Around Workloads
Do not convert every raw source table directly into one permanent Iceberg table without considering how it will be queried and maintained.
For each dataset, define:
- business owner and purpose;
- grain and primary business key;
- event time and processing time;
- update and delete behavior;
- expected daily volume;
- common filters and joins;
- freshness objective;
- retention and recovery requirements;
- sensitive columns and access policy;
- downstream service-level objectives.
Use a layered model only where each layer has a clear contract.
Raw or Bronze
Preserve source events or extracts with ingestion metadata. This layer supports replay and investigation. Avoid making it a permanent dumping ground with no retention or ownership.
Validated or Silver
Apply schemas, deduplication, normalized identifiers, quality rules, and business transformations. This is often the reusable core of the platform.
Curated or Gold
Create stable business-facing models, aggregates, and serving tables for BI, applications, and ML features.
More layers are not automatically better. Every copy adds storage, transformation, lineage, and freshness cost.
Choose Partitions for Pruning, Not Tradition
Hive-style data lakes often encode partitions directly in directory paths. Changing the partition strategy requires rewriting data and updating queries.
Iceberg supports hidden partitioning and partition evolution. Queries filter on business columns while the table metadata maps those filters to physical partitions.
Good partition fields have:
- frequent use in selective filters;
- enough data per partition to avoid tiny files;
- manageable cardinality;
- stable business meaning.
Common transforms include day or month from a timestamp, buckets of an identifier, and truncation of string or numeric values.
Avoid partitioning by highly unique values such as transaction IDs. Avoid over-partitioning low-volume tables. A useful target is not a specific partition count; it is enough data per partition and file for efficient scans and writes.
Partition evolution allows future data to use a better layout without rewriting all historical data immediately. Query engines use metadata to plan across both layouts.
Build Reliable Batch, CDC, and Streaming Ingestion
The lakehouse should define how each source enters the platform and how duplicates, ordering, late data, and schema changes are handled.
Batch Loads
Use atomic table commits and record source extraction windows. A rerun should replace or merge the intended interval rather than append duplicates.
Change Data Capture
CDC pipelines must preserve source ordering and transaction identity sufficiently to reconstruct the latest state. Store the raw change log before applying merges when replay and audit matter.
Iceberg merge operations can maintain current-state tables, but frequent tiny merges are expensive. Buffer changes into appropriately sized micro-batches and compact resulting files.
Our guide to change data capture and real-time pipelines covers log-based capture, idempotency, ordering, schema evolution, and replay in more detail.
Streaming Events
Streaming does not require committing every event individually. Write bounded batches based on time and size. Track checkpoints outside the table and make commits idempotent.
File and SaaS Ingestion
Record source file names, checksums, extraction IDs, and ingestion timestamps. Quarantine malformed inputs instead of silently coercing them into a curated schema.
Every path should expose freshness, volume, duplicate, and error metrics.
Treat Schema Evolution as a Contract
Iceberg can add, drop, rename, and reorder columns without relying only on column position. This makes evolution safer, but it does not decide whether a change is semantically compatible.
For every source schema change:
- Detect it before or during ingestion.
- Compare it with the registered data contract.
- Classify it as compatible, review-required, or breaking.
- Update transformations and quality rules.
- Notify downstream owners.
- Record the effective version and time.
Adding an optional field may be structurally compatible. Changing currency from cents to decimal units is not, even if the physical type remains numeric.
Use stable field identifiers and explicit casts. Do not infer business compatibility from successful file parsing.
Apache Iceberg V3 expands the available data model with features such as deletion vectors, row lineage, default values, variant data, geospatial types, and nanosecond timestamps. Confirm that every writing and reading engine in the path supports the chosen table version and types before enabling them.
Plan Table Maintenance from Day One
Open table formats move some operational work from warehouses into the data platform.
Compact Small Files
Frequent ingestion produces small files that increase object requests, metadata, and query planning overhead. Compact them into target sizes appropriate for the engine and workload.
Rewrite Manifests
Manifest organization can degrade as tables evolve. Rewrite or cluster manifests when planning latency and metadata scans increase.
Expire Snapshots
Time travel retains references to historical files. Define a retention window based on recovery, audit, and cost requirements, then expire snapshots safely.
Remove Orphan Files
Failed or abandoned writes can leave unreferenced files. Clean them only after a safety interval that accounts for in-progress jobs and eventual operational delays.
Manage Delete Files
Merge-on-read updates can accumulate position or equality deletes. Compact or rewrite affected data before read performance deteriorates.
S3 Tables can automate parts of this maintenance. Self-managed Iceberg requires scheduled jobs and ownership. In both cases, monitor outcomes instead of assuming maintenance is healthy because a job ran.
Use the Right Compute Engine
Separation of storage and compute allows each workload to use an appropriate engine.
Amazon Athena
Useful for serverless SQL, exploration, lightweight transformation, and workloads with variable demand. Query cost depends heavily on data scanned, so pruning, file layout, and column selection matter.
Amazon Redshift
Useful for managed warehouse performance, concurrency, semantic models, and BI serving. Redshift can query lakehouse data and can materialize selected datasets where workload latency requires it.
AWS Glue and Amazon EMR
Spark-based processing fits large transformations, backfills, compaction, machine learning preparation, and complex data engineering.
Aurora PostgreSQL and Applications
Recent AWS capabilities allow analytical access to Iceberg and Parquet data from Aurora PostgreSQL. That can simplify selected operational-plus-analytical queries, but it does not turn object storage into a low-latency transactional database.
Materialize data into a serving database, search engine, or cache when applications need predictable millisecond latency. The lakehouse remains the governed analytical source, not the only database.
Build Governance into the Catalog
A table catalog should answer:
- what data exists;
- who owns it;
- what each field means;
- where it came from;
- who may access it;
- how fresh and reliable it is;
- how long it should be retained.
AWS Glue Data Catalog or SageMaker Catalog can provide technical metadata and discovery. Lake Formation can enforce database, table, column, row, and tag-based permissions across supported services.
Use separate AWS accounts for platform, producers, consumers, and sensitive domains where organizational scale and risk justify it. Centralize policy definitions while preserving clear data ownership.
Protect:
- S3 and table resources;
- catalog operations;
- encryption keys;
- query result locations;
- job roles and temporary credentials;
- logs and lineage metadata;
- cross-account resource links and shares.
Data residency, encryption, access, recovery, and deletion need end-to-end design. Our guide to data sovereignty for SaaS and AI on AWS covers those controls across regional data planes.
Make Data Quality Observable
Pipeline success is not the same as correct data.
Define quality checks at dataset boundaries:
- schema validity;
- non-null and accepted-value rules;
- uniqueness and duplicate rate;
- referential integrity;
- row count and volume anomalies;
- freshness and event-time lag;
- reconciliation with the source;
- aggregate financial or business invariants.
Publish quality status with the table and snapshot. Downstream jobs should be able to distinguish current trusted data from late, quarantined, or failed data.
Track operational metrics by table:
- commit success and latency;
- files and average file size;
- snapshots and manifests;
- delete-file ratio;
- bytes scanned per query;
- query latency and failure;
- compaction backlog;
- storage and compute cost;
- data freshness and quality incidents.
Connect pipeline traces, query jobs, and source changes using stable run and dataset identifiers. This makes it possible to follow a bad dashboard number back to one source extraction and table commit.
Prepare Data for AI Without Creating Another Silo
AI applications need more than raw documents or feature vectors. They need governed source data, provenance, freshness, and access policy.
A lakehouse can provide:
- structured training and evaluation datasets;
- historical snapshots for reproducible experiments;
- approved document metadata and access labels;
- feature engineering inputs;
- batch outputs from enrichment and classification;
- data for retrieval indexes and knowledge bases;
- feedback and agent-evaluation records.
Keep the lakehouse as the durable source and treat vector indexes, feature stores, and model-specific formats as derived serving layers. They should be rebuildable from versioned source snapshots.
Do not expose all lakehouse data to an AI agent through one broad query identity. Apply user and tenant authorization before retrieval, minimize context, and record which snapshot and rows influenced an output.
For foundation model integration, our Amazon Bedrock data management and compliance guide covers RAG ingestion, IAM, encryption, retention, Guardrails, and evidence.
Control Lakehouse Cost
Low-cost object storage does not guarantee a low-cost platform. Major cost drivers include:
- duplicated bronze, silver, gold, and warehouse copies;
- scans caused by weak partition pruning;
- small files and metadata overhead;
- oversized Spark clusters and slow jobs;
- frequent merge operations;
- retained snapshots and orphan files;
- idle provisioned query capacity;
- unnecessary cross-Region or cross-cloud transfer;
- repeated transformations with no reusable output.
Measure cost by dataset, pipeline, team, and consumer where practical. Useful unit metrics include:
- cost per ingested million records;
- cost per transformed terabyte;
- cost per successful pipeline run;
- query cost per dashboard or product;
- storage cost per retained business period;
- cost per fresh, quality-approved dataset.
Optimize in this order:
- Remove unused copies and jobs.
- Fix duplicate processing and failed retries.
- Improve pruning and file layout.
- Right-size compute and concurrency.
- Automate maintenance and retention.
- Materialize repeated expensive queries where justified.
Cost should be reviewed alongside freshness and quality. A cheaper pipeline that delivers late or incorrect data is not an optimization.
Migrate Without a Big-Bang Rewrite
A safe migration starts with one valuable dataset and keeps rollback possible.
1. Inventory the Current Flow
Document sources, file formats, partitions, consumers, SLAs, access rules, and current cost. Identify hidden dependencies such as scripts that construct S3 paths directly.
2. Choose the Catalog and Storage Pattern
Decide between general-purpose S3 and S3 Tables based on supported engines, governance, maintenance, Region, and portability requirements.
3. Define the Iceberg Table Contract
Specify schema, grain, keys, partitions, update model, retention, and quality checks.
4. Backfill and Reconcile
Write historical data into the new table, then compare counts, aggregates, nulls, keys, and representative queries with the current system.
5. Dual-Run Incremental Updates
Feed both paths for a defined period. Compare freshness and results automatically.
6. Move Consumers Gradually
Start with low-risk analytical jobs. Keep compatibility views or exports where they reduce migration risk.
7. Retire the Old Path
After consumers, retention, and rollback requirements are satisfied, remove duplicate storage and pipelines. Leaving both platforms indefinitely defeats the economic case.
Common Lakehouse Mistakes
Treating Iceberg as Just Another File Format
Writers must commit through the table protocol. Directly adding or moving data files can corrupt expectations and bypass metadata.
Letting Every Team Choose Its Own Stack
Provide one supported default for catalog, ingestion, transformation, quality, and maintenance. Add alternatives only for real workload needs.
Writing One Record per Commit
Buffer streaming and CDC changes into sensible batches. Tiny commits and files create operational debt.
Partitioning by High-Cardinality IDs
Design for common filters and healthy file sizes, not source-system conventions.
Ignoring Snapshot Retention
Time travel is valuable, but unlimited history retains data and cost. Make retention explicit.
Moving Every Workload to the Lakehouse
Keep transactional and low-latency serving workloads in purpose-built databases.
Centralizing Data Without Ownership
A shared platform still needs domain owners, contracts, quality objectives, and incident response.
Calling Data AI-Ready Without Access Policy
Provenance, classification, freshness, and retrieval authorization matter as much as format.
A Practical 30-Day Starting Plan
Week 1: Select and Profile One Dataset
Choose a high-value dataset suffering from slow queries, duplicated copies, or fragile updates. Measure volume, files, freshness, quality, consumers, and cost.
Week 2: Build the Table Contract
Define schema, keys, partitions, catalog, security, retention, and quality checks. Create the Iceberg table and backfill a representative period.
Week 3: Add Incremental Ingestion and Maintenance
Implement idempotent batch or CDC updates, compaction, snapshot expiration, metrics, and reconciliation with the source.
Week 4: Migrate One Consumer
Move one BI, analytical, or ML workload. Compare performance, quality, freshness, and cost against the old path before expanding.
This proves the operating model with one real dataset before the organization commits to a broad platform migration.
How BoundLayer Helps
BoundLayer designs and implements production data platforms for analytics, AI, SaaS, fintech, IoT, and operational reporting.
We can help with:
- AWS lakehouse architecture and audits;
- Apache Iceberg and Amazon S3 Tables design;
- AWS Glue, EMR, Athena, Redshift, and Spark pipelines;
- batch, CDC, streaming, and backfill workflows;
- schema evolution and data contracts;
- Lake Formation and cross-account governance;
- compaction, snapshots, retention, and table maintenance;
- observability, data quality, lineage, and incident response;
- cost analysis and workload optimization;
- migration from file-based lakes and duplicated warehouses;
- governed datasets for machine learning, RAG, and AI agents.
A successful lakehouse is not defined by how many AWS services it uses. It is defined by whether teams can find, trust, govern, and query shared data without rebuilding the same pipeline for every new use case.
Further Reading
Related engineering articles
Data Contracts for Reliable Data Pipelines: Schema Evolution, Quality, and Ownership
A practical guide to data contracts for event streams and analytics: schema compatibility, business meaning, quality checks, ownership, privacy metadata, and safe change management.
Big Data Platform Architecture: Turning High-Volume Data into Reliable Business Decisions
A practical guide to Big Data architecture: batch and streaming pipelines, data quality, governance, storage, analytics, cost controls, and a phased implementation plan.
Change Data Capture: Building Reliable Real-Time Data Pipelines Without Breaking Production
A practical guide to CDC architecture, Debezium, AWS DMS, transactional outbox, idempotency, schema evolution, monitoring, replay, and near-real-time data pipelines.
Planning or repairing an AWS data lakehouse?
We design Iceberg data models, ingestion and CDC pipelines, S3 Tables, catalogs, Lake Formation governance, query layers, observability, migration, and cost controls for production analytics and AI.