SaveMyCert
Log in
5 of 5 free questions left today·for 10 a day
Architecture Design and Implementation Built for the Cloud

SAP-C03 Data, Storage and Database Architecture: Iceberg Lakehouses, Streaming, Global Databases, Caching and Data Sharing

26 min readSAP-C03 · Architecture Design and Implementation Built for the CloudUpdated

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.

What you’ll learn
  • 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 livesWho maintains itOperational effort
Amazon S3 Tables (a table bucket)S3 runs compaction, snapshot management and unreferenced-file removal automaticallyLowest: nothing to schedule
General purpose bucket, Glue Data Catalog table optimizers turned onManaged optimizers for compaction, snapshot retention and orphan file deletion run continuously per tableLow: turn them on per table
General purpose bucket, your own jobsAthena 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.

NeedLake Formation mechanism
Hide some columns from a groupColumn-level grant (include or exclude columns) on the table
Show each group only its own rowsData 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 dayLF-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:ResourceTag conditions 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.

ServiceRoleDeciding detail
Amazon Kinesis Data StreamsDurable, ordered streamRetention 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 MSKManaged Apache KafkaExisting Kafka clients and Kafka Connect connectors keep working; MSK Connect runs connectors as a managed service
Amazon Managed Service for Apache FlinkStateful stream processingSliding and session windows, joins and aggregations with results in seconds
Amazon Data FirehoseDeliveryBuffers and delivers a stream to S3 (including Iceberg tables), Redshift, OpenSearch; applications cannot attach to it as consumers
AWS Lambda on a streamPer-batch processingTumbling windows only (fixed, non-overlapping, up to 15 minutes); no sliding windows
Amazon SQSWork queueA 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 optionBest forTrade-off
EMR ServerlessSpiky or short batch jobs; unchanged Spark code with no cluster sizingWorkers 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 clusterA nightly job that needs EC2-level controlNo idle cost, but you still choose instance types, counts and scaling
Persistent EMR on EC2 clusterSteady load, custom AMIs, HDFS-resident intermediate dataPays for idle hours unless scaled; most to manage
EMR on EKSCompanies already running Amazon EKS that want Spark beside other workloadsAdds 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 patternFitWhy the alternatives fail
Read/write one item by key, up to millions of requests per second, single-digit millisecond latencyAmazon 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 DBAsAmazon Aurora Serverless v2DynamoDB has transactions but no joins; RDS storage autoscaling grows storage, not compute
Steady relational OLTP that must stay on a specific engineAmazon RDS (MySQL, PostgreSQL, MariaDB, Oracle, SQL Server, Db2)Moving to Aurora changes the engine
Aggregations over billions of rows, reports, BIAmazon 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 changeElastiCache (Valkey or Redis OSS) sorted setIndex-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 (ZADD to 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.

OptionReplicationServes reads?Failover
RDS Multi-AZ DB instanceSynchronous to one standby in another AZNo: the standby exists only for failoverAutomatic, 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 acknowledgeYes, through the reader endpointAutomatic and typically faster than a Multi-AZ DB instance
Read replica (same or another Region)AsynchronousYesNone automatic: you promote it manually, and recent commits can be lost
Aurora ReplicasShared cluster storageYes, through the cluster reader endpointAutomatic 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_rpo parameter, 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)
ReplicationAsynchronous, typically within a second or soSynchronous to another Region before the write is acknowledged
Strongly consistent readsReturn the latest value only for items last written in the same RegionReturn the latest version from any Region
Concurrent writes to one itemLast writer wins per item; the other write is silently overwrittenA conflicting write fails with a replicated write conflict error
RPO on a Region failureRecent unreplicated writes can be lostZero
RegionsAny number of replicasExactly three, all from one Region set (US, EU or Asia Pacific): three replicas, or two replicas and a witness
RestrictionsTransactions 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.

RequirementFitWhy not the near-twin
HPC cluster of hundreds of instances, hundreds of GB/s, sub-millisecond latency, data in S3FSx 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 DRFSx 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 copiesFSx for Windows File Server joined to the domainFSx for OpenZFS and EFS serve NFS
Shared, elastic NFS for Linux across AZsAmazon 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 AZS3 Express One Zone directory bucket in the compute's AZS3 Standard is multi-AZ with higher request latency; Transfer Acceleration only speeds long-distance internet transfers
Durable object storage at any scaleAmazon S3 (Standard and other classes)Storage-class and lifecycle cost choices belong to cost optimization
Low-latency block storage for one instanceAmazon 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

StrategyHow it worksStrengthWeakness
Lazy loading (cache-aside)On a miss, read the database and populate the cacheOnly requested data is cached, so memory holds the hot setData is stale until the entry expires or is replaced
Write-throughEvery database write also writes the cacheCached data is always currentAlone, it caches everything written, including cold data that is never read
TTLEach entry expires after a set timeSafety net against stale or forgotten entriesA 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 GetItem and BatchGetItem. A write through DAX updates it, so single-item reads see the change at once.
  • Query cache stores result sets of Query and Scan. 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 ConsistentRead set 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.

How do you catalog data and share it across accounts and with partners?

Catalog data once in the AWS Glue Data Catalog and share it in place: Lake Formation cross-account grants for lake tables, Redshift data sharing for warehouse tables, and AWS Clean Rooms when partners must analyse combined data without seeing each other's raw records. None of these copies the data.

Lake Formation cross-account sharing

  1. In the producer (central) account, grant Lake Formation permissions, such as SELECT with column restrictions or through a data filter, to the consumer's AWS account ID (or organization). Lake Formation shares the resources through AWS RAM.
  2. In the consumer account, the data lake administrator accepts the share if needed, creates resource links to the shared databases or tables in the local catalog so Athena and other engines can find them, and grants local analysts permissions on the links and the shared tables.

The producer's column and row restrictions stay enforced wherever the tables are queried. Replicating the bucket, or crawling the central bucket from the consumer account, creates copies or separate table definitions that bypass the central grants.

Amazon Redshift data sharing

A producer Redshift warehouse (RA3 provisioned or Serverless) creates a datashare, and authorizes another account; an administrator in the consumer account associates the datashare with the account (or specific namespaces), and the consumer then creates a database from it. Consumers read live, current data with no extract jobs or copies, and their queries run on their own compute, so they do not slow the producer. UNLOAD-plus-Spectrum is an extract job with stale data, restored snapshots are stale copies, and querying the producer through the Data API uses the producer's compute. Datashares work between Redshift warehouses; they do not expose Glue Data Catalog tables to Athena in another account.

AWS Clean Rooms

In a Clean Rooms collaboration, each member adds configured tables that point at data in its own account, and an analysis rule on each table decides what queries may return.

Analysis ruleReturnsUse when
AggregationOnly aggregate values (COUNT, SUM, AVG…) over allowed dimensions, with a minimum aggregation threshold that suppresses small groupsOverlap sizing, measurement, attribution
ListRow-level values of the allowed list columns for records that match on the join columnActivation: one party needs IDs of shared customers only
CustomResults of approved analysis templates, or of any query from named analysis providersAd-hoc SQL with new joins and groupings; can turn on differential privacy

Aggregation thresholds protect each result on its own, but not a sequence of results: if collaborators may run free-form SQL that is not pre-approved, the difference between two otherwise identical aggregates that differ by a single record can expose that record (a differencing attack). AWS Clean Rooms Differential Privacy, turned on in a custom analysis rule and governed by the collaboration's differential privacy policy (a privacy budget and the noise added per query), limits what repeated queries can reveal. Query logging records what ran but prevents nothing. Lake Formation filtered shares, S3 access points and copied lists all hand the other party customer-level records, which Clean Rooms exists to avoid.

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.

Key takeaways
  • 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.

Sign up free to mark lessons complete, bookmark topics and track your exam readiness.

Spotted a mistake in this lesson?