SAP-C03 Data, Storage and Database Architecture: Iceberg Lakehouses, Streaming, Global Databases, Caching and Data Sharing
Data, storage and database architecture is the practice of choosing where data lives, how it moves and who can reach it: lakehouses on Amazon S3 with Apache Iceberg and AWS Lake Formation, real-time and batch pipelines, purpose-built databases with in-Region and multi-Region availability, file, block and object storage, caching, and sharing data across accounts and partners. It is SAP-C03 Task 1.5, in the Architecture Design and Implementation Built for the Cloud domain, and at Professional level the questions turn on fine distinctions: a Multi-AZ standby that serves no reads, a DAX query cache that writes never refresh, a DynamoDB consistency mode that can only be chosen at creation. This lesson teaches each of those decisions and the near-twin options that fail one requirement.
On this page10 sections
- How do you design a lakehouse on Amazon S3 with Apache Iceberg?
- How does AWS Lake Formation give different audiences access to one copy of the data?
- How do you design a real-time analytics pipeline on AWS?
- How do you design batch processing and managed ingestion?
- How do you select a database by access pattern, consistency and scale?
- How do RDS Multi-AZ deployments and read replicas differ?
- How do you make databases highly available across Regions?
- How do you choose storage by access pattern and performance?
- How do you design caching with ElastiCache and DAX?
- How do you catalog data and share it across accounts and with partners?
- Design an S3 lakehouse with Apache Iceberg tables, choose who runs compaction and snapshot expiry, evolve partitions without rewrites, and query the lake from Redshift Spectrum cost-effectively
- Give different audiences column-, row- and cell-level access to one copy of the data with Lake Formation grants, data filters and LF-Tags
- Design real-time pipelines with Kinesis Data Streams, Amazon MSK, Managed Service for Apache Flink and Firehose, and batch pipelines with EMR Serverless or EMR on EC2
- Replace hand-built pipelines with zero-ETL integrations into Redshift, and ingest SaaS data with Amazon AppFlow or AWS Glue zero-ETL
- Select databases by access pattern and design high availability with RDS Multi-AZ instances and clusters, read replicas, Aurora Global Database and DynamoDB global tables
- Match storage services to protocol and performance needs across S3, S3 Express One Zone, EBS, EFS and the FSx family
- Design caching with ElastiCache and DAX, and share data across accounts and partners with Lake Formation, Redshift datashares and AWS Clean Rooms
How do you design a lakehouse on Amazon S3 with Apache Iceberg?
Design a lakehouse by storing the data once in Amazon S3 as Apache Iceberg tables, cataloging them in the AWS Glue Data Catalog, and letting several engines (Amazon Athena, Amazon EMR, AWS Glue, Amazon Redshift) read and write the same tables. Plain Parquet files partitioned in Hive style give you cheap storage and fast scans, but no transactions: a change means rewriting whole partitions by hand, and readers can see a half-written partition. Iceberg adds a table layer on top of the files that fixes this.
- Atomic commits. Every write produces a new snapshot that becomes visible all at once, so readers never see a partial change.
- Row-level DELETE, UPDATE and MERGE. A privacy request to erase or correct one customer becomes a SQL statement from Athena or Spark instead of a partition rewrite.
- Time travel. Queries can read the table as it stood at an earlier snapshot or timestamp, which auditors use to see past states.
- Schema and partition evolution. Columns can be added, dropped, renamed and widened, and the partition layout can change, without rewriting existing data.
S3 Versioning is not a substitute: it keeps old object versions but offers no consistent table view and no "as of" query.
Table maintenance: who runs it?
Iceberg tables need ongoing maintenance. Frequent small writes (a streaming source committing every minute, for example) create millions of small files and thousands of snapshots; queries slow down because each one opens far more files and metadata, and S3 request charges climb. Three jobs fix this: compaction (rewrite small files into large ones), snapshot expiry (drop old snapshots beyond the time-travel window) and orphan file removal (delete files no snapshot references). The design decision is who performs them.
| Where the Iceberg table lives | Who maintains it | Operational effort |
|---|---|---|
| Amazon S3 Tables (a table bucket) | S3 runs compaction, snapshot management and unreferenced-file removal automatically | Lowest: nothing to schedule |
| General purpose bucket, Glue Data Catalog table optimizers turned on | Managed optimizers for compaction, snapshot retention and orphan file deletion run continuously per table | Low: turn them on per table |
| General purpose bucket, your own jobs | Athena OPTIMIZE and VACUUM, or Spark procedures on EMR, scheduled by you (for example Step Functions plus EventBridge Scheduler) | Highest: you build, schedule and monitor them for every table |
Raising the ingestion buffer (for example a longer Amazon Data Firehose buffering interval) writes fewer, larger files from now on, but it does nothing for the files and snapshots that already exist, so it complements maintenance rather than replacing it.
Partition evolution
Iceberg uses hidden partitioning: the partition spec is a transform of a source column (such as day(event_ts) or hour(event_ts)), and queries filter on the source column itself. Changing the spec is a metadata operation: new data is written with the new layout, existing files keep the old one, and a filter on the timestamp prunes files under both specs. Nothing is rewritten and the queries do not change. Athena's Iceberg DDL can add, drop, rename and reorder columns and promote types, but it cannot change the partition spec; that is done with Spark SQL (ALTER TABLE … REPLACE PARTITION FIELD), for example on Amazon EMR. Athena partition projection is a Hive-table feature that computes partition locations from a pattern; it does not apply to Iceberg, which tracks partitions in its own metadata.
Querying the lake from Redshift
Amazon Redshift Spectrum queries S3 data in place: you create an external schema in Redshift that points at a Glue Data Catalog database, and its tables can be joined with local warehouse tables in one SQL statement, with nothing loaded. It suits cold history that is queried occasionally while the warehouse keeps the hot data. Spectrum is billed by the bytes it scans in S3, so cost and speed come from the file layout, not from cluster size: a columnar format such as Parquet lets it read only the referenced columns, and partitions on the filtered column let it skip whole partitions. Row-based CSV is read in full whatever the query selects, and a view or more cluster nodes does not change what is scanned. Loading the history with COPY defeats the purpose, and concurrency scaling adds query capacity for warehouse bursts rather than making S3 files queryable.
How does AWS Lake Formation give different audiences access to one copy of the data?
AWS Lake Formation enforces fine-grained permissions on Glue Data Catalog tables, so one copy of the data can serve audiences that may see different columns and rows. You register the S3 location with Lake Formation, and integrated engines such as Athena, Redshift Spectrum, EMR and AWS Glue then check Lake Formation permissions on every query, wherever the query runs.
| Need | Lake Formation mechanism |
|---|---|
| Hide some columns from a group | Column-level grant (include or exclude columns) on the table |
| Show each group only its own rows | Data filter with a row filter expression (for example region = 'emea') |
| Both at once (rows and columns, that is cell-level) | One data filter that combines a row filter with column inclusion or exclusion; grant SELECT through the filter |
| Thousands of tables, new ones every day | LF-Tags (LF-TBAC) assigned to databases, tables and columns, with grants on tag expressions |
Tag-based access control at scale
Named-resource grants (one grant per table) grow with the table count, and any automation that creates them per table leaves new tables without access until it runs. LF-Tags invert this. You define tags such as domain and sensitivity, assign them to databases, and tables and columns inherit the database's tags at creation; you override a tag at a lower level, for example marking a personal data column sensitivity=high inside a low-sensitivity table. Principals are then granted permissions on tag expressions (domain=payments AND sensitivity=low), which match every resource carrying those tags, including resources created later. The number of grants scales with roles and tag values, not with tables. LF-Tags work at database, table and column level only; restricting rows still needs data filters.
What does not do the job
- Engine views (Athena views per group) exist only in the engine that defines them, must be rebuilt for every other engine, and do not stop a principal with access to the base table or its S3 objects.
- IAM resource tags and
aws:ResourceTagconditions on Glue actions control catalog API calls, not the column- and row-level data access that Lake Formation enforces in the engines. - Separate KMS keys control who can decrypt objects, not which columns or rows a query returns.
- Extra copies per audience (written by Glue jobs or to separate prefixes) work but must be kept in sync, which breaks any "single copy" requirement.
How do you design a real-time analytics pipeline on AWS?
A real-time pipeline is chosen by four questions: which protocol the producers already speak, whether several consumers must read independently and replay history, whether the processing needs state across time windows, and where the data must land. The building blocks divide the work as follows.
| Service | Role | Deciding detail |
|---|---|---|
| Amazon Kinesis Data Streams | Durable, ordered stream | Retention defaults to 24 hours and can be raised up to 365 days, so any number of consumers can read and replay independently; on-demand or provisioned capacity |
| Amazon MSK | Managed Apache Kafka | Existing Kafka clients and Kafka Connect connectors keep working; MSK Connect runs connectors as a managed service |
| Amazon Managed Service for Apache Flink | Stateful stream processing | Sliding and session windows, joins and aggregations with results in seconds |
| Amazon Data Firehose | Delivery | Buffers and delivers a stream to S3 (including Iceberg tables), Redshift, OpenSearch; applications cannot attach to it as consumers |
| AWS Lambda on a stream | Per-batch processing | Tumbling windows only (fixed, non-overlapping, up to 15 minutes); no sliding windows |
| Amazon SQS | Work queue | A consumed message is deleted: no replay, no second independent consumer |
Kafka workloads: MSK, not a rewrite
When a company runs self-managed Kafka and wants to stop patching, scaling and managing broker storage without touching application code, the target is Amazon MSK: it runs Apache Kafka itself, so clients only need new bootstrap brokers. Topics move with MirrorMaker 2, and existing connectors move to MSK Connect. Moving to Kinesis means switching to the Kinesis libraries, and rebuilding connectors as Glue or Spark jobs means new code. Amazon MQ does not speak the Kafka protocol either: Amazon MQ for ActiveMQ supports OpenWire, AMQP 1.0, STOMP, MQTT and WebSocket, and Amazon MQ for RabbitMQ supports AMQP 0-9-1.
Kinesis capacity and fan-out
Two separate limits catch architects out. Write and shard capacity: in provisioned mode you size and reshard the stream yourself; on-demand mode scales capacity with traffic and can be switched on for an existing stream in place, without recreating it. Read capacity: consumers that call GetRecords share each shard's read throughput, so adding consumers throttles all of them even when writes are well within limits. Enhanced fan-out gives each registered consumer its own dedicated read throughput per shard, pushed over SubscribeToShard. Adding shards adds shared capacity but keeps the manual resharding; longer retention keeps unread records available but adds no read throughput. Write and read capacity are independent problems, so a stream that both throttles producers during spikes and starves several consumers can need a change on each side.
A combined pattern
Because a durable stream keeps records for its whole retention period and lets each reader track its own position, one stream can serve several requirements at once: a stateful processor for windowed detection, a delivery service writing to the lake, and later readers that replay history. The design rule is to set retention from the longest replay requirement (the 24-hour default is often too short) and to give each requirement its own reader, rather than chaining services or copying the data into a second stream.
How do you design batch processing and managed ingestion?
Batch analytics on AWS runs Spark, Hive and similar frameworks on Amazon EMR, and the deployment option is chosen by utilization and how much infrastructure the team wants to own. Data that already lives in an AWS database or a SaaS application should usually arrive through a managed integration rather than a hand-built pipeline.
| EMR option | Best for | Trade-off |
|---|---|---|
| EMR Serverless | Spiky or short batch jobs; unchanged Spark code with no cluster sizing | Workers are sized per job and billed only while jobs run; the application stops when idle. No custom AMI or HDFS, although custom container images for the runtime are supported |
| Transient EMR on EC2 cluster | A nightly job that needs EC2-level control | No idle cost, but you still choose instance types, counts and scaling |
| Persistent EMR on EC2 cluster | Steady load, custom AMIs, HDFS-resident intermediate data | Pays for idle hours unless scaled; most to manage |
| EMR on EKS | Companies already running Amazon EKS that want Spark beside other workloads | Adds a Kubernetes cluster to operate if one does not already exist |
Cost and reliability on EMR on EC2
An EMR cluster has a primary node (cluster coordination), core nodes (run tasks and store HDFS blocks) and task nodes (run tasks, store no HDFS data). Spot reclamation of a core node can destroy HDFS blocks and fail jobs, so the safe split is primary and core nodes On-Demand and task nodes on Spot. Instance fleets that list several instance types let EMR draw Spot capacity from more pools, which lowers the chance of interruption compared with one type. Pair the fleet with a capacity-aware Spot allocation strategy such as price-capacity-optimized, which launches from the pools with the most spare capacity at a low price instead of simply the cheapest pool (lowest-price draws from the pools most likely to be reclaimed). EMR managed scaling resizes the cluster from YARN metrics and can be limited so growth happens on task nodes, so you stop paying for peak capacity in quiet hours.
Zero-ETL and SaaS ingestion
- Zero-ETL integrations into Amazon Redshift replicate data without pipeline code from sources such as Aurora MySQL, Aurora PostgreSQL, RDS for MySQL, RDS for PostgreSQL, RDS for Oracle and DynamoDB, and AWS Glue zero-ETL integrations bring SaaS applications such as Salesforce, SAP, ServiceNow and Zendesk into Redshift or a SageMaker lakehouse. The DynamoDB integration is built on table exports (point-in-time recovery must be on), so it consumes no read capacity on the source table; it replicates on an interval of minutes (AWS documents roughly 15 to 30), so it fits analytics that can be minutes behind, not a per-event leaderboard. A Lambda function on DynamoDB Streams or a scheduled Glue scan is code to own, and a scan consumes read capacity.
- Amazon AppFlow is the managed flow service for SaaS applications such as Salesforce, Zendesk, ServiceNow and Slack. Flows run on a schedule, on an event or on demand, map and filter fields, encrypt with an AWS KMS key, and write to S3, Redshift and other destinations. Glue zero-ETL is the other no-code path for supported SaaS sources when the goal is continuous replication into Redshift or a lakehouse rather than scheduled, field-mapped flows. AWS DMS migrates databases and has no Salesforce or Zendesk source, AWS DataSync moves files and objects between storage systems, and a Glue crawler only infers schemas into the Data Catalog.
How do you select a database by access pattern, consistency and scale?
Select the database from the access pattern first, then confirm consistency and scale: key lookups at very high rates go to DynamoDB, multi-table transactions and ad-hoc joins go to Aurora or RDS, large analytical scans go to Redshift, and rankings or counters that change constantly go to an in-memory sorted set.
| Access pattern | Fit | Why the alternatives fail |
|---|---|---|
| Read/write one item by key, up to millions of requests per second, single-digit millisecond latency | Amazon DynamoDB (on-demand for no capacity planning) | A relational writer cannot absorb that write rate; read replicas scale reads only |
| Transactions across several tables plus ad-hoc joins; unpredictable load; no DBAs | Amazon Aurora Serverless v2 | DynamoDB has transactions but no joins; RDS storage autoscaling grows storage, not compute |
| Steady relational OLTP that must stay on a specific engine | Amazon RDS (MySQL, PostgreSQL, MariaDB, Oracle, SQL Server, Db2) | Moving to Aurora changes the engine |
| Aggregations over billions of rows, reports, BI | Amazon Redshift (provisioned or Serverless) | A columnar warehouse is not built for high-rate single-row reads and writes |
| Top-N leaderboard and a player's rank, updated on every change | ElastiCache (Valkey or Redis OSS) sorted set | Index-based rankings in DynamoDB need a single hot key; SQL window functions over all rows are expensive per request |
Scaling traps in DynamoDB
- Hot partitions. A global secondary index whose partition key is a constant value sends every update to one partition, which throttles at high update rates. Rankings across all players belong in a sorted set (
ZADDto update, range and rank commands to read), not in a constant-key index. - Sudden spikes in on-demand mode. On-demand tables instantly serve up to double their previous peak; a known launch that jumps far beyond that should raise the table's warm throughput beforehand so it is ready for the spike.
- Reports without affecting the table. Exporting the table to S3 (point-in-time export) and querying it with Athena consumes no read capacity.
Mixed workloads usually mean several stores, each matched to one access pattern: a key-value store for high-rate item writes (using conditional writes where an update must not overwrite a concurrent one), an in-memory structure for constantly changing rankings, and an offline copy such as an S3 export for periodic analytical reporting.
How do RDS Multi-AZ deployments and read replicas differ?
Multi-AZ deployments provide high availability with automatic failover, read replicas provide read scaling, and only the Multi-AZ DB cluster does both at once. Mixing these up is the most common error in database availability scenarios.
| Option | Replication | Serves reads? | Failover |
|---|---|---|---|
| RDS Multi-AZ DB instance | Synchronous to one standby in another AZ | No: the standby exists only for failover | Automatic, no committed transactions lost |
| RDS Multi-AZ DB cluster (MySQL, PostgreSQL) | To two standbys in two other AZs; a commit waits for at least one standby to acknowledge | Yes, through the reader endpoint | Automatic and typically faster than a Multi-AZ DB instance |
| Read replica (same or another Region) | Asynchronous | Yes | None automatic: you promote it manually, and recent commits can be lost |
| Aurora Replicas | Shared cluster storage | Yes, through the cluster reader endpoint | Automatic promotion of a replica (Aurora engine only) |
The rule follows from the table: availability and read offload are separate goals on a Multi-AZ DB instance, so a design that needs both on that deployment type needs both a standby and a read replica, because reports cannot run on the standby. A Multi-AZ DB cluster meets both goals in one deployment and keeps the RDS engine; Aurora offers similar benefits but is a different engine, which matters whenever a requirement fixes the engine. RDS Proxy pools connections and shortens reconnect time after a failover, but it creates no standby, so it adds nothing to a Single-AZ instance.
How do you make databases highly available across Regions?
For relational data across Regions use Amazon Aurora Global Database; for key-value data use Amazon DynamoDB global tables, choosing between eventual and strong consistency modes. Both are managed replication that a self-built logical or binlog replica cannot match for writer impact and recovery speed.
Aurora Global Database
- Storage-level replication. Data is replicated by the storage layer, typically with sub-second lag and no binary logging or replication work on the primary writer. A cross-Region binlog replica, by contrast, needs binary logging on the writer and lags more as write volume grows; bidirectional logical replication adds load to each writer and risks write conflicts.
- Read locally, promote on failure. Secondary clusters serve local, low-latency reads and can be promoted if the primary Region fails. An existing cluster is converted by adding a secondary Region.
- Write forwarding. With write forwarding on, a secondary cluster accepts occasional writes and forwards them to the primary, so the application needs no code that routes writes to the primary Region.
- Switchover versus failover. A switchover is the planned operation: Aurora waits until the secondary is fully synchronized before swapping roles, so no data is lost; use it for drills and Region rotation. A failover is for an unplanned outage: it promotes a secondary immediately, and any data not yet replicated (the replication lag) is lost.
- Bounding RPO on Aurora PostgreSQL. The
rds.global_db_rpoparameter, set in the primary cluster's DB cluster parameter group (minimum 20 seconds), makes Aurora block commits on the primary whenever every secondary is further behind than the limit; commits resume as soon as one secondary catches up. This guarantees the maximum data loss of a failover while adding no latency to normal writes. An alarm on lag only reacts after the fact, and synchronous cross-Region commit adds a round trip to every write.
Snapshot copies to another Region give an RPO of minutes or more and a slow restore, with no live cluster to accept writes. ElastiCache Global Datastore copies a cache, not the database, and cannot replace a database cluster.
DynamoDB global tables: MREC versus MRSC
| Multi-Region eventual consistency (MREC, default) | Multi-Region strong consistency (MRSC) | |
|---|---|---|
| Replication | Asynchronous, typically within a second or so | Synchronous to another Region before the write is acknowledged |
| Strongly consistent reads | Return the latest value only for items last written in the same Region | Return the latest version from any Region |
| Concurrent writes to one item | Last writer wins per item; the other write is silently overwritten | A conflicting write fails with a replicated write conflict error |
| RPO on a Region failure | Recent unreplicated writes can be lost | Zero |
| Regions | Any number of replicas | Exactly three, all from one Region set (US, EU or Asia Pacific): three replicas, or two replicas and a witness |
| Restrictions | Transactions are Region-local (not atomic across Regions) | Mode chosen at creation and cannot be changed; a single-Region table can be converted only while empty; no transactions and no TTL; higher write latency |
The consequence for migrations: because the mode is fixed at creation, data that needs strong reads in every Region and zero RPO goes into a newly created MRSC table that is loaded afterwards, never an existing populated table switched over; and routing all writes to one Region on MREC still leaves reads in the other Regions eventually consistent. Replicated writes from other Regions are applied to the table directly, bypassing any DAX cluster in front of the local replica, so that cache keeps old values until its TTL expires.
How do you choose storage by access pattern and performance?
Choose storage by protocol first (object, block, NFS, SMB, parallel file system) and then by performance and data-protection needs. The near-twins below are where most designs go wrong.
| Requirement | Fit | Why not the near-twin |
|---|---|---|
| HPC cluster of hundreds of instances, hundreds of GB/s, sub-millisecond latency, data in S3 | FSx for Lustre with a data repository association to the bucket (imports objects as files, exports results) | EFS is not built for that parallel throughput; EBS Multi-Attach serves only a few instances in one AZ |
| Same files over NFS (Linux) and SMB (Windows), snapshots, cross-Region DR | FSx for NetApp ONTAP (multiprotocol volumes, SnapMirror replication) | FSx for Windows is SMB only; EFS is NFS only |
| SMB shares, NTFS ACLs with Active Directory, user self-restore with shadow copies | FSx for Windows File Server joined to the domain | FSx for OpenZFS and EFS serve NFS |
| Shared, elastic NFS for Linux across AZs | Amazon EFS (Elastic throughput, optional replication to another Region) | Windows clients cannot mount it over SMB |
| Millions of small objects, single-digit millisecond requests from compute in one AZ | S3 Express One Zone directory bucket in the compute's AZ | S3 Standard is multi-AZ with higher request latency; Transfer Acceleration only speeds long-distance internet transfers |
| Durable object storage at any scale | Amazon S3 (Standard and other classes) | Storage-class and lifecycle cost choices belong to cost optimization |
| Low-latency block storage for one instance | Amazon EBS (gp3 for general use, io2 Block Express for the highest IOPS and durability) | Multi-Attach needs a cluster-aware file system and a small set of instances in one AZ |
Mountpoint for Amazon S3 gives high-throughput file access to a bucket, but it does not provide full POSIX semantics (for example, modifying existing files in place), so it is not a shared scratch file system. Copying data between EFS and S3 with DataSync before and after every run adds time that a linked FSx for Lustre file system avoids.
How do you design caching with ElastiCache and DAX?
Use Amazon ElastiCache (Valkey, Redis OSS or Memcached) as a general-purpose cache in front of any data source, and DynamoDB Accelerator (DAX) only in front of DynamoDB. The design work is choosing how entries get into the cache, how they stay fresh, and what bypasses the cache.
ElastiCache strategies
| Strategy | How it works | Strength | Weakness |
|---|---|---|---|
| Lazy loading (cache-aside) | On a miss, read the database and populate the cache | Only requested data is cached, so memory holds the hot set | Data is stale until the entry expires or is replaced |
| Write-through | Every database write also writes the cache | Cached data is always current | Alone, it caches everything written, including cold data that is never read |
| TTL | Each entry expires after a set time | Safety net against stale or forgotten entries | A very short TTL turns most reads into misses and loads the database |
The usual answer combines them: lazy loading with a TTL for reads, plus updating (or deleting) the cached entry whenever the application writes a change, so changes are visible within seconds and memory still holds only what is read. For cross-Region caches, ElastiCache Global Datastore (Valkey and Redis OSS) replicates a primary cluster to read-only secondary clusters in other Regions for local reads, and a secondary can be promoted if the primary Region fails. Replica nodes in a replication group stay in the primary's Region, and ElastiCache Serverless is single-Region.
How DAX actually caches
DAX keeps two separate caches and is write-through for writes made through the DAX client.
- Item cache serves
GetItemandBatchGetItem. A write through DAX updates it, so single-item reads see the change at once. - Query cache stores result sets of
QueryandScan. Writes through DAX do not update or invalidate it; a cached result set stays until its TTL expires (both caches default to five minutes). Lowering the query cache TTL bounds how stale list pages can be. - Strongly consistent and transactional reads pass through. With
ConsistentReadset to true, DAX forwards the request to DynamoDB and caches nothing, so latency and consumed read capacity do not improve. Switch to eventually consistent reads where short staleness is acceptable, or use strongly consistent reads deliberately on the one path that must always be current. - No invalidation API. You cannot delete individual DAX entries from a stream consumer; freshness comes from TTLs, writes through DAX and eviction.
- Writes that bypass DAX, including global table replication from other Regions and writes made directly to DynamoDB, leave the DAX cache stale until the TTL ends.
Adding DAX nodes adds capacity and availability, and adding table read capacity raises throughput, but neither makes pass-through reads use the cache.
Tip. SAP-C03 tests this task with multi-account, multi-Region scenarios that state several requirements at once (no extra copies, no code change, stay on a given engine, no data loss on drills, minimal operational overhead, lowest cost) and offer four or five designs from the same service family. The wrong options are usually real designs that meet every requirement but one, so read each constraint and check every option against all of them: who runs the maintenance, whether a replica actually serves reads, whether a setting can be changed after creation, whether a cache is really used on the stated read path, and whether a migration changes client code. Select TWO items usually combine two independent changes, each fixing a different stated requirement, so check that the pair together covers everything and that neither choice duplicates the other.
- Row-level deletes, atomic commits and time travel on S3 mean Apache Iceberg; S3 Tables or Glue Data Catalog table optimizers remove the compaction and snapshot-expiry work that streaming writes make necessary.
- Iceberg partition evolution is a metadata change done with Spark: new data uses the new layout, nothing is rewritten, and queries on the source column keep pruning.
- Redshift Spectrum is billed by bytes scanned: Parquet plus partitions on the filtered column is the cost fix, not more nodes or views.
- Lake Formation data filters combine row filters and column exclusion on one table; LF-Tags inherited from databases scale grants to thousands of tables but never filter rows.
- Kafka clients and connectors map to Amazon MSK and MSK Connect; sliding windows need Managed Service for Apache Flink; many throttled Kinesis consumers need enhanced fan-out.
- DynamoDB to Redshift without code or read capacity is a zero-ETL integration; scheduled, field-mapped SaaS ingestion is Amazon AppFlow, and Glue zero-ETL is the other no-code path that replicates supported SaaS apps into Redshift or a lakehouse.
- A Multi-AZ DB instance standby serves no reads, a Multi-AZ DB cluster has two readable standbys, and read replicas are asynchronous with manual promotion.
- Aurora Global Database switchover loses no data and suits drills; failover is for outages and loses the replication lag, which rds.global_db_rpo on the primary can bound.
- DynamoDB MRSC gives strong reads in any Region and zero RPO, but needs exactly three Regions and a new empty table; MREC resolves conflicts with last writer wins.
- DAX caches only eventually consistent reads, writes refresh its item cache but never its query cache, and replicated or direct writes bypass it entirely.
Frequently asked questions
What is the difference between an RDS Multi-AZ DB instance and a Multi-AZ DB cluster?
An RDS Multi-AZ DB instance keeps one synchronous standby in another Availability Zone that serves no traffic and exists only for automatic failover. A Multi-AZ DB cluster, available for RDS for MySQL and PostgreSQL, has a writer and two standbys in different Availability Zones that serve reads through a reader endpoint and typically fail over faster. Choose the cluster when you want readable standbys without separate read replicas while staying on the RDS engine.
When should I use an Aurora Global Database switchover instead of a failover?
Use a switchover for planned Region changes such as disaster recovery drills or Region rotation: Aurora waits until the secondary cluster is fully synchronized before swapping roles, so no data is lost. Use a failover only for an unplanned Region outage: it promotes a secondary immediately and loses any data that had not yet replicated.
What is the difference between DynamoDB global tables MREC and MRSC?
Multi-Region eventual consistency (MREC), the default, replicates asynchronously, resolves concurrent writes with last writer wins, and returns the latest value for strongly consistent reads only for items last written in the same Region. Multi-Region strong consistency (MRSC) replicates synchronously so reads in any Region return the latest version and RPO is zero, but it requires exactly three Regions (or two plus a witness), is chosen at creation on an empty table, and does not support transactions or TTL.
Why does DAX not reduce latency for some DynamoDB reads?
DynamoDB Accelerator passes strongly consistent reads (ConsistentRead set to true) and transactional reads straight to DynamoDB without caching them, so those requests see no latency benefit and still consume table read capacity. Only eventually consistent GetItem, BatchGetItem, Query and Scan calls are served from the DAX item and query caches.
Why does DAX return stale Query results after an item is updated?
DAX keeps Query and Scan result sets in a query cache that is separate from its item cache. A write through DAX updates the item cache but does not update or invalidate cached query results, which remain until their TTL expires. Lower the query cache TTL, or use a strongly consistent Query on the path that must always be current.
How do you share AWS Glue Data Catalog tables governed by Lake Formation with another AWS account?
In the producer account, grant Lake Formation permissions on the tables, with any column or row restrictions, to the consumer's account ID; Lake Formation shares them through AWS RAM. In the consumer account, the data lake administrator creates resource links to the shared tables and grants local users permissions on them. No data is copied and the producer's restrictions stay enforced.
What is the difference between Clean Rooms aggregation, list and custom analysis rules?
In AWS Clean Rooms, an aggregation analysis rule allows only aggregate results with a minimum group threshold, which suits measurement and overlap counts. A list analysis rule returns the allowed columns for records that match on the join key, which suits activating shared customers. A custom analysis rule allows approved analysis templates or any query from named analysis providers, and is where differential privacy can be turned on.
When should I use FSx for NetApp ONTAP instead of FSx for Windows File Server or Amazon EFS?
Use Amazon FSx for NetApp ONTAP when Linux clients over NFS and Windows clients over SMB must work on the same files, or when you need ONTAP features such as SnapMirror replication to another Region. FSx for Windows File Server serves SMB only, with Active Directory and NTFS permissions, and Amazon EFS serves NFS only.
Source
This lesson covers the "Architecture Design and Implementation Built for the Cloud" domain of the official SAP-C03 exam guide. Vendors revise their guides — check the source for the current version.
- AWS Certified Solutions Architect – Professional (SAP-C03) exam guide — Amazon Web Services
Sign up free to mark lessons complete, bookmark topics and track your exam readiness.