Choosing an AWS Data Store: Redshift, DynamoDB, Aurora, S3, and MemoryDB
Choosing a data store on AWS means matching the access pattern, latency, volume and cost model to the engine built for it: analytical scans across billions of rows point to Amazon Redshift or Amazon S3 with Athena, transactional row-level reads and writes point to Amazon RDS or Aurora, single-digit-millisecond key/value lookups at any scale point to DynamoDB, durable microsecond in-memory access points to Amazon MemoryDB, and retained event streams point to Kinesis Data Streams or Amazon MSK. DEA-C01 Task 2.1 tests whether you can make that call under cost and performance constraints, then configure the chosen store correctly — Redshift node types, Serverless and cost controls, DynamoDB capacity and keys, RDS and Aurora deployment options, and HNSW or IVF vector indexes on Aurora PostgreSQL. It also covers the surrounding machinery: reaching data you have not loaded through Redshift Spectrum, federated queries, zero-ETL and materialized views; landing partner files with AWS Transfer Family; finding and clearing blocking locks in Redshift and RDS; and running Apache Iceberg tables on S3, including time travel, rollback and maintenance.
On this page10 sections
- Match the data store to the access pattern
- Amazon Redshift: configuring the warehouse for cost and performance
- Controlling Redshift cost: Serverless limits, reservations, reserved nodes, and pause/resume
- Reaching data you didn't load: Spectrum, federated queries, and materialized views
- OLTP and key/value stores: RDS, Aurora, and DynamoDB
- In-memory and vector workloads: MemoryDB, HNSW on Aurora, and IVF
- Streams as storage, EMR, and Lake Formation
- Open table formats: Apache Iceberg on S3
- Managing locks in Amazon Redshift and Amazon RDS
- Landing files with AWS Transfer Family
- Select the appropriate storage service for a given cost, performance, and access-pattern requirement
- Configure Amazon Redshift deployment and cost controls: RA3 managed storage, data sharing, Serverless base capacity, usage limits, reservations, reserved nodes, pause/resume, and concurrency scaling
- Choose between Redshift Spectrum, federated queries, zero-ETL integrations, and materialized views to reach data without building a pipeline
- Configure DynamoDB, RDS, and Aurora for their access patterns — capacity modes, hot partitions, item size, DAX, Multi-AZ options, read replicas, RDS Proxy, and Aurora Serverless v2
- Apply MemoryDB as a durable in-memory database and compare HNSW and IVF vector indexes on Aurora PostgreSQL
- Diagnose and clear blocking locks in Amazon Redshift and Amazon RDS, and prevent them from recurring
- Manage Apache Iceberg tables on S3 — time travel, rollback, row-level deletes, compaction, and snapshot expiry
- Integrate AWS Transfer Family servers and SFTP connectors into pipelines and distinguish them from DataSync, Transfer Acceleration, and S3 File Gateway
Match the data store to the access pattern
You choose a data store by matching four things — access pattern, latency requirement, data volume, and cost model — against what each engine is built for, and DEA-C01 questions almost always hide the answer in the access-pattern wording. "Complex aggregations across years of data" means columnar analytics; "look up a session by ID in milliseconds" means key/value; "query files ad hoc without loading them" means S3 in place.
| Access pattern in the question | Best-fit store | Why |
|---|---|---|
| Complex SQL aggregations, joins, BI dashboards over structured data | Amazon Redshift | Columnar MPP warehouse; scans and aggregates at petabyte scale |
| Transactional (OLTP) row-level reads/writes, relational integrity, joins on normalized schemas | Amazon RDS / Aurora | Row-oriented relational engines with ACID transactions and foreign keys |
| Key/value or document lookups by known key, millisecond latency at any scale | Amazon DynamoDB | Partitioned NoSQL; performance independent of table size |
| Ad hoc or infrequent SQL over files in a data lake; pay only when you query | Amazon S3 + Athena | Cheapest storage; serverless per-query pricing; no cluster to run |
| Microsecond reads, single-digit-millisecond writes, durable in-memory primary store | Amazon MemoryDB | Valkey/Redis OSS-compatible in-memory database with a Multi-AZ transaction log |
| Ordered, replayable event streams retained for hours to days | Kinesis Data Streams / Amazon MSK | Stream storage with retention and multiple independent consumers |
Two heuristics follow from the table. First, cost favors S3 + Athena for data queried occasionally — a running Redshift cluster for a weekly report wastes money, while steady, concurrent BI load is where a warehouse earns its keep. Second, performance favors purpose-built stores: forcing key/value lookups through a relational database, or analytics through DynamoDB scans, works against the engine.
Watch single words that seem decisive but aren't. "ACID" alone does not mean relational — DynamoDB supports ACID transactions across items too. What points to RDS or Aurora is ACID plus foreign keys, joins and ad hoc SQL over normalized tables. Likewise "in-memory" alone does not mean cache: whether the in-memory store must be the durable system of record decides between MemoryDB and ElastiCache.
Amazon Redshift: configuring the warehouse for cost and performance
Amazon Redshift is configured along two axes — how data is placed across the cluster and which deployment shape you run — because it is a massively parallel (MPP) columnar warehouse where every query runs across all compute slices.
Placement in brief. Distribution style decides which node stores each row (KEY co-locates rows sharing a join column, ALL copies small dimensions to every node, EVEN spreads round-robin, AUTO lets Redshift choose), and sort keys order rows on disk so zone maps can skip blocks outside a filtered range. Designing those keys is Task 2.4 (schema design) and is taught in the data-modeling lesson; Task 2.1 is about choosing and configuring the store itself.
Node types and managed storage. RA3 nodes keep data in Redshift Managed Storage (RMS): durable S3-backed storage with a local SSD cache that Redshift fills and evicts automatically. Storage therefore grows without adding nodes, and you size the cluster for compute alone. DC2 is the legacy dense-compute family with storage fixed to each node's local SSD; AWS steers new and upgraded clusters to RA3. Knowing which capabilities depend on RA3 prevents a common mistake:
| Capability | Needs RA3 (or Serverless)? |
|---|---|
| Scaling storage independently of compute (RMS) | Yes |
| Data sharing — producer or consumer | Yes (RA3 provisioned clusters or Redshift Serverless) |
| Redshift Spectrum queries on S3 | No — also works on DC2 |
| Elastic resize | No — also works on DC2 |
| Automatic table optimization (AUTO distribution and sort keys) | No — also works on DC2 |
Data sharing gives another cluster or workgroup live, read-only access to a producer's tables with no copy and no pipeline. Consumers query the producer's managed storage with their own compute, so each team's queries run on, and are billed to, the consumer — isolating workloads and chargeback. That differs from scaling the producer: concurrency scaling clusters added to absorb other teams' queries on the producer bill the producer.
Redshift Serverless removes the cluster: capacity is measured in Redshift Processing Units (RPUs), scales automatically, and is billed per RPU-second only while queries run. The base capacity setting is the RPU level a workgroup starts from — a performance knob (higher base, faster queries, higher cost per second), not a spending cap. Serverless is the natural fit for intermittent or unpredictable analytics with no one to manage a cluster.
Controlling Redshift cost: Serverless limits, reservations, reserved nodes, and pause/resume
Redshift cost is controlled by matching the billing model to the shape of the workload, and each control solves a different shape.
| Workload shape | Control | How it works |
|---|---|---|
| Intermittent, unpredictable queries | Redshift Serverless (on-demand) | Billed per RPU-second while queries run; nothing for idle time |
| Serverless spend must not exceed a budget | Serverless usage limits | Cap RPU-hours per day, week or month; when reached, log to a system table, send an alert, or turn off user queries |
| Predictable, steady Serverless usage | Serverless reservations | Commit to a number of RPUs for one year at a discount; billed every hour whether or not queries run |
| Steady 24/7 provisioned cluster | Reserved nodes | One- or three-year commitment for a lower node price; billed continuously |
| Provisioned cluster idle in known windows (nights, weekends) | Scheduled pause and resume | Compute billing stops while paused (storage is still billed); only helps when the idle windows are predictable |
| Short bursts that queue on a provisioned cluster | Concurrency scaling | Transient clusters absorb queued queries; usage beyond the daily free credits is billed per second, and a usage limit can cap it |
Two distinctions decide most questions. A reservation or reserved node lowers the unit price but bills around the clock, so it only pays off when the warehouse is busy most of the time; for a mostly idle workload it is pure waste. And pause/resume needs a schedule you can predict — when analysts arrive at random, a paused cluster is either down when needed or running when not, which is the case Serverless was built for.
Reaching data you didn't load: Spectrum, federated queries, and materialized views
Redshift can query data it has never loaded, and the right method depends on where the data lives and whether it may be copied into the warehouse.
| Method | Source | Data copied into Redshift? | Freshness |
|---|---|---|---|
| Redshift Spectrum | Files in Amazon S3 (external tables via the Glue Data Catalog) | No — scanned in place | Whatever is in S3 now |
| Federated query | Live Amazon RDS / Aurora PostgreSQL and MySQL databases | No — rows read from the source at query time | Live |
| Zero-ETL integration | Aurora MySQL/PostgreSQL, RDS for MySQL, DynamoDB and others | Yes — AWS replicates continuously; no pipeline to build | Near real time |
| COPY | Files in S3 (and other sources) | Yes — a batch load you schedule | As of the last load |
Redshift Spectrum queries S3 files through an external schema backed by the AWS Glue Data Catalog. Spectrum scales its own fleet and charges by data scanned, so it suits huge, infrequently queried history: keep hot data in local tables, leave cold years in S3 as partitioned Parquet, and one SQL statement joins both.
Federated queries reach live operational rows in RDS and Aurora without ETL. Redshift connects with credentials from AWS Secrets Manager, pushes predicates down where it can, and joins the live rows with warehouse tables — nothing is stored in Redshift, and every query puts load on the source database.
Aurora zero-ETL integration with Redshift is the near-twin to know. It continuously replicates the source tables into Redshift, so queries run on Redshift's own storage and compute and stop touching the production database — at the cost of holding a replica in the warehouse. Choose federated queries when the data must not be copied or only occasional lookups are needed; choose zero-ETL when a replica is acceptable and heavy analytics should not hit the OLTP database.
Materialized views precompute and store a query result inside Redshift, refreshed incrementally where the SQL allows. Two behaviors matter:
- Automatic query rewrite lets Redshift answer an eligible query written against the base tables from the materialized view, without anyone changing the SQL — useful when a BI tool's queries cannot be edited.
AUTO REFRESH YESis best effort: Redshift refreshes when base tables change and resources allow, prioritizing user workloads. When a pipeline needs the view guaranteed current at a known moment, runREFRESH MATERIALIZED VIEWas the last step of the ETL job.
Scenario
A retailer keeps 90 days of orders in Redshift, seven years of order history as partitioned Parquet in S3, and live inventory in Aurora PostgreSQL. Nightly finance queries need all three. A sound design: local tables for the hot 90 days, a Spectrum external schema over the S3 history, a federated schema to Aurora for the occasional live inventory lookup, and a materialized view over the recurring aggregation, refreshed explicitly at the end of the nightly load. If analysts later hammer inventory all day, a zero-ETL integration moves that load off Aurora.
OLTP and key/value stores: RDS, Aurora, and DynamoDB
Operational stores are configured around their access patterns, and Task 2.1 tests the configuration choices, not just the service names.
Amazon RDS and Aurora
Amazon RDS runs managed relational engines (PostgreSQL, MySQL, MariaDB, SQL Server, Oracle, Db2); Amazon Aurora is the AWS-built MySQL- and PostgreSQL-compatible option whose storage replicates six ways across three Availability Zones, with up to 15 Aurora Replicas behind a reader endpoint. Match the configuration to the problem:
| Requirement | Configuration |
|---|---|
| Survive an AZ failure | Multi-AZ. A Multi-AZ DB instance deployment has one standby that serves no reads — it exists only for failover. A Multi-AZ DB cluster deployment (MySQL and PostgreSQL) has two readable standbys. |
| Offload read-heavy reporting | A read replica (RDS) or Aurora Replicas via the reader endpoint — not a bigger writer, and not the Multi-AZ instance standby |
| Connection storms from many short-lived clients such as Lambda | RDS Proxy, which pools and reuses database connections |
| Spiky or intermittent relational load | Aurora Serverless v2, which scales in fine-grained ACU steps. A minimum of 0 ACUs enables auto-pause when idle — cheapest, but the first request after a pause waits for the database to resume; a small nonzero minimum avoids that delay. |
Amazon DynamoDB
DynamoDB delivers consistent single-digit-millisecond performance regardless of table size, but only if the design matches the access pattern.
- Keys. The partition key spreads data and traffic across partitions; a composite key (partition key + sort key) stores an entity's items together in sort-key order, so "all readings for device X between two timestamps" is one
Query. Global secondary indexes serve alternate access patterns; ad hoc filters and joins are not what DynamoDB is for. - Hot partitions. Each partition has its own throughput ceiling (about 3,000 read units and 1,000 write units per second). The symptom of a hot key is throttling while table-level consumed capacity stays far below what is provisioned — and it happens in on-demand mode too, because the per-partition limit still applies. The fix is a higher-cardinality key (or write sharding), not more capacity.
- Capacity modes. On-demand suits unpredictable or spiky traffic with no capacity management: it instantly absorbs up to double the table's previous peak, warm throughput can pre-warm a table ahead of a planned extreme peak, and an optional maximum throughput setting caps cost. Provisioned capacity with auto scaling is cheaper for steady, forecastable traffic.
- Item size. An item is capped at 400 KB. Store larger payloads (images, documents, big JSON) in Amazon S3 and keep the object key plus queryable attributes in the item.
- DAX. DynamoDB Accelerator is an in-memory cache that speaks the DynamoDB API, so an application keeps DynamoDB as its system of record and gains microsecond reads with minimal code change. DynamoDB on its own is single-digit milliseconds, so DAX (or MemoryDB) is justified only when milliseconds are too slow. DAX caches only eventually consistent reads; strongly consistent reads pass straight through to DynamoDB, uncached. TTL expires items automatically.
The dividing line: if the scenario needs flexible ad hoc queries, multi-table joins, or strict relational constraints, use RDS or Aurora. If it needs known-key access at massive scale with no operational tuning, use DynamoDB.
In-memory and vector workloads: MemoryDB, HNSW on Aurora, and IVF
Amazon MemoryDB is the store for fast key/value access when the in-memory data must be durable, and vector indexes are how Aurora PostgreSQL serves similarity search.
MemoryDB, ElastiCache, and DAX
The deciding question is what happens to an acknowledged write when a node fails. ElastiCache replicates from primary to replicas asynchronously, so writes acknowledged just before a failover can be lost — acceptable for a cache that can be rebuilt from a database, not for a system of record. MemoryDB commits every write to a distributed Multi-AZ transaction log before acknowledging it, so it can be the primary database.
| Amazon MemoryDB | Amazon ElastiCache | DynamoDB Accelerator (DAX) | |
|---|---|---|---|
| Role | Durable in-memory primary database | Cache in front of another store | Cache in front of DynamoDB only |
| API | Valkey / Redis OSS | Valkey / Redis OSS / Memcached | DynamoDB API (drop-in client) |
| Acknowledged writes on failover | Preserved (Multi-AZ transaction log) | Can be lost (asynchronous replication) | DynamoDB remains the record |
| Typical fit | Session state, leaderboards, feature lookups that must not be lost | Caching query results or sessions you can recreate | Read-heavy DynamoDB tables needing microsecond reads with minimal code change |
Vector indexes in Aurora PostgreSQL (pgvector)
Vector search stores embeddings and finds nearest neighbors for semantic search and retrieval-augmented generation. With the pgvector extension, a vector column with no index is searched exactly by scanning every row — perfect recall, but slow as the table grows. Approximate-nearest-neighbor indexes trade a little recall for speed. General-purpose index types (B-tree, GIN, full-text) cannot serve distance ordering, so they do nothing for nearest-neighbor queries.
| HNSW | IVF (pgvector IVFFlat) | |
|---|---|---|
| Structure | Multi-layer navigable graph, searched coarse to fine | Vectors clustered into lists; a query searches only the nearest lists |
| Recall and query speed | High recall, fast queries | Good, depends on how many lists are probed |
| Build time and memory | Slower build, more memory | Faster build, less memory |
| Data that keeps growing | Can be built on an empty table; new rows join the graph incrementally | Lists are computed from the data present at build time; as new data drifts from them, recall degrades until the index is rebuilt |
| Query-time knob | hnsw.ef_search — larger candidate list, higher recall, slower | ivfflat.probes — more lists searched, higher recall, slower |
| Fixed at build | m, ef_construction | lists (changing it means rebuilding) |
So: HNSW when recall and query speed matter on data that keeps changing; IVF for quick, low-memory builds on a stable, fully loaded table. If IVF recall is too low and there is latency to spare, raise probes per query or session — no rebuild needed.
Streams as storage, EMR, and Lake Formation
Task 2.1's service list also includes stores that don't look like databases: stream stores, EMR cluster storage, and the Lake Formation governance layer.
Kinesis Data Streams and Amazon MSK are short-term storage, not just pipes: both retain records for a configurable window (Kinesis from 24 hours up to 365 days; Kafka topics per retention policy), letting multiple consumers read independently and rewind for replay. Choose MSK when the scenario requires Apache Kafka compatibility or an existing Kafka ecosystem; otherwise Kinesis is the lower-operational-overhead choice.
MSK tiered storage makes long Kafka retention affordable: older log segments move from broker storage to a low-cost tier, and consumers still read them through the normal Kafka APIs, so replaying months of events needs no separate archive. Prerequisites: MSK provisioned clusters (not MSK Serverless), Apache Kafka 3.6.0 or later (or 2.8.2.tiered), broker sizes larger than kafka.t3.small, and topics using the delete cleanup policy — compacted topics are not supported.
Amazon EMR has a storage decision inside the cluster. HDFS on the cluster's local disks (instance store and/or attached EBS volumes) is fast but ephemeral — it disappears with the cluster — while EMRFS reads and writes Amazon S3 directly, decoupling storage from compute. Keep durable inputs and outputs in S3 and treat clusters as disposable, including transient clusters that terminate after each job. Node types follow from this:
- Primary node — coordinates the cluster.
- Core nodes — run tasks and store HDFS data, so losing them (for example to a Spot interruption) can lose data and fail jobs.
- Task nodes — compute only, no HDFS. They are the safe place for Spot Instances to add cheap capacity.
AWS Lake Formation is not a storage engine — it is the governance layer over an S3 data lake. It registers S3 locations and grants database-, table-, column-, row-, and cell-level permissions that Athena, Redshift Spectrum, Glue, and EMR enforce, replacing per-service bucket-policy sprawl with one permission model. When a scenario pairs a data lake on S3 with fine-grained access control across engines, that is Lake Formation; the data itself still lives in S3.
Open table formats: Apache Iceberg on S3
Managing open table formats means running Apache Iceberg tables on S3, and Iceberg exists to give data-lake files the behaviors of a database table: ACID commits, safe concurrent writers, row-level changes, schema evolution, and time travel.
Plain Parquet-on-S3 tables break down when you need to update or delete individual rows, evolve schemas without rewriting data, or read consistently while a write is in flight. Iceberg adds a metadata layer of snapshots and manifest files: every commit produces a new snapshot, readers see a consistent snapshot, and writers commit atomically. That buys row-level updates and deletes, schema evolution (add, rename, drop columns as metadata-only changes), hidden partitioning (queries prune partitions without filtering on a derived column, and the partition scheme can change without rewriting data), and time travel.
What Iceberg does not add matters too: it has no per-column or secondary indexes — pruning comes from partitioning and file-level column statistics (min/max values) kept in the manifests — and it has no per-row TTL; expiring old rows is a DELETE you run (or a lifecycle job), unlike DynamoDB TTL.
Time travel vs rollback
Time travel reads a past snapshot for one query and changes nothing; rollback changes the table's current state for every reader.
| Time travel | Rollback | |
|---|---|---|
| Effect | Read-only; the current table is untouched | Makes an earlier snapshot the current one for everyone |
| How (on AWS) | Athena: SELECT … FROM t FOR TIMESTAMP AS OF TIMESTAMP '2026-09-01 00:00:00 UTC' or FOR VERSION AS OF <snapshot_id> | Spark (Glue or EMR): CALL catalog.system.rollback_to_snapshot('db.t', <snapshot_id>) |
| Use when | Auditing, reproducing a report, comparing versions | Undoing a bad write or load |
Deletes, compaction, and snapshot expiry
An Athena DELETE on an Iceberg table is merge-on-read: it writes delete files that hide the rows from every query immediately, while the original data files — and older snapshots — still physically contain them. Physically purging deleted rows (for example, for an erasure request) takes two steps:
OPTIMIZE t REWRITE DATA USING BIN_PACKrewrites data files with the deletes applied (it also compacts the small files that streaming writes create) — but only files that meet its thresholds. The table propertyoptimize_rewrite_delete_file_threshold(default 2) skips a data file with fewer associated delete files than that, andoptimize_rewrite_data_file_threshold(default 5) skips the rewrite when fewer files need optimizing. A data file touched by a singleDELETEcan therefore survive at defaults; for a guaranteed purge, lower both thresholds to 1 first (or run Spark'srewrite_data_filesprocedure on Glue or EMR).VACUUM texpires snapshots older than the table'svacuum_max_snapshot_age_secondsproperty and removes the files no snapshot references. It always keeps at leastvacuum_min_snapshots_to_keepsnapshots (default 1), which takes precedence over the age limit.
That retention property defaults to only a few days (432,000 seconds), so running VACUUM at defaults also removes time-travel history older than that — set it to the history you must keep before vacuuming. Never delete data files from S3 directly: the metadata still references them, and the table breaks. Athena, Glue, EMR, and Redshift all read Iceberg tables, the Glue Data Catalog serves as the Iceberg catalog, and Amazon S3 Tables offers bucket-native managed Iceberg tables with automatic compaction and snapshot management.
Managing locks in Amazon Redshift and Amazon RDS
Locks prevent conflicting access to data, and managing them means finding the session that holds a blocking lock, ending it the right way, and changing the workload so it doesn't recur.
Amazon Redshift
Redshift takes table-level locks. Reads take AccessShareLock; writes take ShareRowExclusiveLock; DDL such as DROP TABLE, TRUNCATE and ALTER TABLE takes AccessExclusiveLock, which blocks even reads. A lock is held until its transaction ends, so a DROP TABLE inside a long ETL transaction blocks every dashboard query on that table until COMMIT. Find the blocker in STV_LOCKS and SVV_TRANSACTIONS, then pick the right function:
| Function | What it does | Clears a lock held by an idle open transaction? |
|---|---|---|
PG_CANCEL_BACKEND(pid) | Cancels the query the session is currently running; the session stays connected | No — an idle session has no running query, and its transaction keeps its locks |
PG_TERMINATE_BACKEND(pid) | Ends the session; its open transaction rolls back | Yes — rollback releases every lock the transaction held |
To prevent recurrences, keep DDL transactions short: build the replacement under a temporary name, then swap it in with a quick ALTER TABLE … RENAME inside a brief transaction, so the exclusive lock lasts seconds. To add staged rows to an existing table instead, ALTER TABLE APPEND moves (not copies) them from the staging table into the target; it commits automatically, cannot be rolled back, and cannot run inside a BEGIN … END transaction block, so run it as its own statement. Capacity settings do not help — WLM queues, extra slots and concurrency scaling never bypass a lock; a waiting query waits wherever it runs.
Amazon RDS and Aurora (PostgreSQL)
RDS and Aurora engines lock rows under MVCC, so readers don't block writers; problems show up as lock waits and deadlocks between writers.
- Find the blocker. Query
pg_stat_activitywithpg_blocking_pids(pid)(or joinpg_locks); Performance Insights shows the lock waits. A session in stateidle in transactionis the classic culprit: it opened a transaction, took row locks, and stopped. - End it the right way. As in Redshift,
pg_cancel_backendonly cancels a running query, so it does nothing to an idle-in-transaction session;pg_terminate_backendends the session and rolls the transaction back, releasing its locks. - Prevent recurrence. Set
idle_in_transaction_session_timeout(in the DB parameter group) so the server ends such sessions automatically, and fix the application to commit promptly. - Deadlocks come from transactions locking the same rows in opposite orders. PostgreSQL detects them and aborts one transaction;
deadlock_timeoutonly sets how long it waits before checking, andlock_timeoutjust makes waits fail sooner — neither prevents the deadlock, and neither does a bigger instance. The fix is to lock rows in a consistent order (for example, always by ascending key) and keep transactions short.
On RDS and Aurora MySQL, the same steps use different tools: find the blocker in sys.innodb_lock_waits (or SHOW ENGINE INNODB STATUS and performance_schema, with Performance Insights for the waits), end it with CALL mysql.rds_kill(<id>) because the master user cannot run KILL on other users' threads, and bound waits with innodb_lock_wait_timeout.
Landing files with AWS Transfer Family
AWS Transfer Family is the managed file-transfer service that moves files over SFTP, FTPS, FTP and AS2 directly into Amazon S3 (or Amazon EFS), making it the migration tool that plugs partner and legacy file feeds into a data pipeline with no servers to run.
It works in two directions:
- Server endpoints — Transfer Family hosts an SFTP/FTPS/FTP/AS2 server; partners push files to you, and each file lands as an S3 object.
- SFTP connectors — Transfer Family acts as the SFTP client: it retrieves files from, or sends files to, a server the partner hosts. Use a connector when the partner will not push and instead exposes their own SFTP server.
From S3 the pipeline is event-driven: the new object triggers EventBridge or S3 Event Notifications, which start the Glue job or Step Functions workflow that processes the file. Transfer Family managed workflows can also run post-upload steps (copy, tag, decrypt, custom Lambda).
Its near-twins solve different problems:
| Service | What it is | Choose it when |
|---|---|---|
| AWS Transfer Family | Managed SFTP/FTPS/FTP/AS2 server endpoints and SFTP connectors | External parties exchange files over those protocols and cannot change their tooling |
| AWS DataSync | A transfer service you run (with an agent for on-premises storage) to copy data between NFS, SMB, HDFS, object storage and AWS | You control the source storage and want bulk or scheduled migration — it does not give partners an endpoint to push to |
| S3 Transfer Acceleration | Faster S3 uploads over HTTPS through CloudFront edge locations | Distant clients already use the S3 API and need speed, not a different protocol |
| Storage Gateway — S3 File Gateway | An on-premises appliance presenting NFS/SMB file shares backed by S3 | On-premises applications need to keep writing to a file share that stores objects in S3 |
Tip. Expect scenario questions that describe an access pattern, latency need, and cost constraint, then ask for the most cost-effective or lowest-operational-overhead store or configuration. Redshift items test RA3 managed storage and data sharing, Serverless versus reservations, reserved nodes, pause/resume and usage limits, and choosing among Spectrum, federated queries, zero-ETL, and materialized views (including automatic query rewrite and refresh timing). DynamoDB and RDS items test capacity modes, hot partitions, the 400 KB item limit, DAX consistency, Multi-AZ standbys versus read replicas, RDS Proxy, and Aurora Serverless v2 auto-pause. Others cover MemoryDB durability, HNSW versus IVF and their query-time knobs, MSK tiered storage, EMR node types, Iceberg time travel, rollback, deletes and maintenance, lock resolution in Redshift and PostgreSQL, and Transfer Family servers versus connectors.
- Read the access pattern first: analytics → Redshift or S3 + Athena, OLTP with joins and constraints → RDS/Aurora, key/value at scale → DynamoDB, durable microsecond in-memory → MemoryDB, replayable events → Kinesis/MSK.
- RA3 managed storage scales storage without compute and is required for data sharing; consumers query shared data live with their own compute and bill.
- Redshift cost: Serverless for intermittent use, usage limits to cap RPU-hours, reservations or reserved nodes only for steady load, pause/resume only for predictable idle windows, concurrency scaling for short bursts.
- Spectrum reads S3 in place and federated queries read live RDS/Aurora rows with no copy; zero-ETL replicates into Redshift; materialized views auto-rewrite queries but auto refresh is best effort, so refresh explicitly when freshness must be guaranteed.
- DynamoDB throttling with low table consumption means a hot partition key; items cap at 400 KB (large payloads go to S3); DAX caches only eventually consistent reads.
- MemoryDB acknowledges writes only after its Multi-AZ transaction log commits them; ElastiCache replicates asynchronously, so it is a cache, not a system of record.
- HNSW suits changing data with high recall; IVF builds fast but drifts as data grows; probes and ef_search trade latency for recall at query time.
- Iceberg time travel is read-only, rollback changes the table for everyone; a DELETE only hides rows until OPTIMIZE and VACUUM purge them, and VACUUM at defaults removes history older than a few days.
- An idle open transaction holding a lock needs PG_TERMINATE_BACKEND (cancel only stops running queries); keep DDL transactions short, and prevent PostgreSQL idle blockers with idle_in_transaction_session_timeout.
- Partners pushing files: a Transfer Family server endpoint. Pulling from a partner-hosted SFTP server: a Transfer Family SFTP connector.
Frequently asked questions
When should I choose Amazon Redshift over Amazon S3 with Athena?
Choose Redshift when analytics run frequently, demand consistently low latency, involve complex joins across large structured tables, or power always-on BI dashboards for many users — a warehouse you use constantly justifies its cost. Choose S3 with Athena when queries are ad hoc or infrequent, because S3 storage is cheap and Athena bills per query with no infrastructure. Many designs use both: hot data in Redshift and cold history in S3 queried through Redshift Spectrum.
What is the difference between Redshift Spectrum, a federated query, and a zero-ETL integration?
Redshift Spectrum queries files in Amazon S3 in place through external tables defined in the AWS Glue Data Catalog. A federated query reads live rows from an Amazon RDS or Aurora PostgreSQL or MySQL database at query time, storing nothing in Redshift but putting load on the source. A zero-ETL integration continuously replicates the source tables into Redshift, so queries run on Redshift storage and compute instead of the production database, at the cost of keeping a copy.
How do I keep Amazon Redshift costs under control?
Match the billing model to the workload. Redshift Serverless bills per RPU-second only while queries run, and usage limits cap RPU-hours per day, week or month with log, alert or turn-off-user-queries actions. Serverless reservations and provisioned reserved nodes lower the unit price but bill every hour, so they suit steady load only. Scheduled pause and resume helps provisioned clusters with predictable idle windows, and concurrency scaling handles short query bursts.
When is Amazon MemoryDB the right choice instead of ElastiCache or DAX?
Choose MemoryDB when the in-memory store must be the durable system of record: it commits every write to a Multi-AZ transaction log before acknowledging it. ElastiCache replicates asynchronously, so acknowledged writes can be lost on failover; it suits caches you can rebuild. DAX is a DynamoDB-API-compatible cache for when DynamoDB stays the system of record and you want microsecond reads with minimal code change; it caches only eventually consistent reads.
Why is my DynamoDB table throttling when consumed capacity is low?
A hot partition key is concentrating traffic on one partition, and each partition has its own throughput ceiling (about 3,000 read units and 1,000 write units per second) regardless of the table total. It happens in on-demand mode too. The fix is a partition key with more distinct, evenly accessed values, or write sharding, rather than buying more capacity.
What is the difference between HNSW and IVF vector indexes?
Both are approximate-nearest-neighbor index types supported by pgvector on Aurora PostgreSQL. HNSW builds a multi-layer graph: high recall and fast queries, buildable on an empty table and updated incrementally, but with more memory and longer builds. IVF (IVFFlat) clusters vectors into lists at build time and searches only the nearest lists: faster, smaller builds, but recall degrades as new data drifts from the lists until a rebuild. Query-time settings, hnsw.ef_search and ivfflat.probes, trade latency for recall.
What is the difference between Iceberg time travel and rollback?
Time travel reads an Apache Iceberg table as of an earlier snapshot for a single query and changes nothing; in Athena it uses FOR TIMESTAMP AS OF or FOR VERSION AS OF. Rollback, for example the Spark rollback_to_snapshot procedure, makes an earlier snapshot the current state of the table for every reader, which is how you undo a bad write. Both depend on the snapshot still existing, so snapshot expiry with VACUUM limits how far back either can go.
How do I fix a query that hangs because of a lock in Amazon Redshift?
A hanging Redshift query usually waits on another transaction holding a table lock, often an AccessExclusiveLock from DDL inside a transaction that was never committed. Find the blocking process ID in STV_LOCKS and SVV_TRANSACTIONS, then end that session with PG_TERMINATE_BACKEND(pid), which rolls back its transaction and releases the lock. PG_CANCEL_BACKEND only cancels a running query, so it cannot clear an idle open transaction. Prevent it by keeping DDL transactions short.
Source
This lesson covers the "Data Store Management" domain of the official DEA-C01 exam guide. Vendors revise their guides — check the source for the current version.
- AWS Certified Data Engineer – Associate (DEA-C01) exam guide — Amazon Web Services
Sign up free to mark lessons complete, bookmark topics and track your exam readiness.