AWS defined flat: bucket policies against IAM policies, S3 versioning and Object Lock, the Glue Data Catalog, DynamicFrames, Glue workers and versions, EMR Serverless, Athena CTAS, Redshift Serverless and RPUs, compound and interleaved sort keys, VACUUM and ANALYZE, Firehose against Data Streams, shards and enhanced fan-out, Lambda concurrency, Step Functions Standard and Express, MWAA, DMS parts, trust policies, KMS and SSE modes, LF-tags, CloudWatch against CloudTrail, plus the ten one-liners every AWS screen opens with.
What is the difference between an S3 bucket policy and an IAM policy? How are they evaluated together, and which do you need for cross-account access?
Why they ask this
Every S3 access-denied ticket is one of these two, and cross-account is where the rule becomes visible.
Say this
An IAM policy is identity-based: it is attached to a user, group or role and says what that identity may do. A bucket policy is resource-based: it is attached to the bucket and says who may do what to it, including principals in other accounts. Within one account, access is allowed if either policy allows it and neither denies. Across accounts, both must allow: the bucket policy must grant the foreign principal, and that principal's IAM policy must allow the action.
The reasoning
IAM policies travel with the identity. A role with `s3:GetObject` on `arn:aws:s3:::lake/*` can read that bucket from any service it runs in. They cannot name a principal, because the principal is whoever holds the policy.
Bucket policies live on the bucket and have a `Principal` element. That is what makes them the tool for cross-account grants, for forcing TLS with `aws:SecureTransport`, and for restricting to a VPC endpoint. They also govern public access when Block Public Access allows it.
Evaluation follows the IAM logic: an explicit deny in either policy wins over any allow. Same account: the union of allows. Cross account: the resource owner's bucket policy must allow the external principal, and the external account must also allow its identity, so a deny on either side blocks.
Access Points add a third layer with their own policies, and S3 Block Public Access overrides any policy that would grant public reads. The practical rule: identity policies for your own roles, bucket policies for other accounts and for guardrails.
The answer most people give
"If the IAM role allows it, the bucket must let it through." A bucket policy deny, Block Public Access, or a missing cross-account grant all block a role whose own policy says allow.
They’ll ask next
Account B's role has full S3 permissions but gets AccessDenied reading account A's bucket. Which policy is missing, and what element must it contain?
What are S3 versioning and S3 Object Lock? What does a delete do on a versioned bucket, and what are the two Object Lock modes?
Why they ask this
Versioning is what makes a lake recoverable, and Object Lock is the compliance question that follows it.
Say this
Versioning keeps every version of an object under the same key: an overwrite adds a version, and a delete adds a delete marker rather than removing data. Once enabled, versioning can only be suspended, not disabled. Object Lock, which requires versioning, prevents a version from being deleted or overwritten for a retention period or under a legal hold. Governance mode can be bypassed by users with a special permission; compliance mode cannot be shortened or removed by anyone, including the root user.
The reasoning
With versioning on, `PUT` on an existing key creates a new version id and the old one stays. `DELETE` without a version id inserts a delete marker, which makes the key look gone while every version remains and can be restored by deleting the marker. A `DELETE` with an explicit version id removes that version for good.
Storage cost grows with every version, so versioning is paired with a lifecycle rule: expire noncurrent versions after N days and clean up expired delete markers. Without that rule a daily-overwritten file costs 365 copies a year.
Object Lock is write-once-read-many. A retention period is set per object or as a bucket default, in days or years. A legal hold is an on-off flag with no end date. Both block deletes of that version until lifted.
Governance mode lets principals with `s3:BypassGovernanceRetention` override, for operational mistakes. Compliance mode is absolute: the version cannot be deleted until retention expires, and retention can only be extended. Object Lock once had to be enabled at bucket creation; since late 2023 it can be turned on for an existing versioned bucket.
The answer most people give
"Versioning protects against deletes, so a delete fails." The delete succeeds and hides the key behind a marker. Only Object Lock makes a delete fail.
They’ll ask next
An audit requires that raw files cannot be deleted for seven years by anyone. Which mode, and what must already be true of the bucket?
Reported · 2Glue Data Catalog & crawlersAthena & query cost
What is the AWS Glue Data Catalog? What does it store, which services read it, and how do tables get into it?
Why they ask this
It is the metastore behind Athena, EMR and Redshift Spectrum, and candidates often describe it as a Glue-only feature.
Say this
The Glue Data Catalog is a managed, Hive-metastore-compatible metadata store: databases, tables with their columns and types, partitions with their S3 locations, and connections. It holds no data, only where the data is and how to read it. Athena, Redshift Spectrum, EMR, Glue jobs and Lake Formation all read it. Tables arrive by crawler, by Glue job, by Athena DDL, by API or Terraform, and the first million objects stored are free.
The reasoning
There is one catalog per account per region. A table entry records the S3 location, the input and output format, the SerDe, the columns, and the partition keys. A partition entry records one partition value set and its location. A query engine reads these to know which files to scan.
A crawler walks an S3 prefix, infers the schema and partitions, and creates or updates the table. Crawlers are convenient and the usual source of schema drift surprises, because an inferred type can change between runs. Explicit DDL or a Glue job's `getSink` with `enableUpdateCatalog` gives control.
Partition management is the operational cost. Every new daily folder needs a partition entry before Athena can see it, hence `MSCK REPAIR TABLE` or crawler schedules. Partition projection is the alternative: it computes partitions from a pattern and skips the catalog entirely.
Pricing is per object stored above the first million and per request above the first million per month. Lake Formation layers permissions over the catalog, and Iceberg tables register in it with their metadata location, which is what lets Athena and EMR share one table.
The answer most people give
"The Glue Data Catalog stores the data Glue processes." It stores metadata only. The data stays in S3 or the source, and the catalog says where and in what shape.
They’ll ask next
A new day's folder landed in S3 but Athena returns nothing for that date. What is missing from the catalog, and what are the three ways to add it?
Reported · 2Glue ETL jobs & job bookmarksGlue Data Catalog & crawlers
What is a Glue DynamicFrame, and how does it differ from a Spark DataFrame? What is a choice type, and when do you convert between them?
Why they ask this
It is the Glue-specific abstraction, and the choice type is the detail that shows someone has handled messy JSON in Glue.
Say this
A DynamicFrame is Glue's distributed collection in which each record carries its own schema, so no schema is fixed up front and a column can hold more than one type. A Spark DataFrame has one schema for every row. When a column's type is inconsistent, a DynamicFrame records a choice type, which you resolve with resolveChoice by casting, projecting or splitting into columns. You convert with toDF for Spark's SQL and joins and fromDF to use Glue's sinks and catalog integration.
The reasoning
The design target is semi-structured data. JSON where `price` is a number in some files and a string in others fails DataFrame inference or becomes a string. A DynamicFrame reads it and marks the column `choice<double, string>`.
`resolveChoice(specs=[('price', 'cast:double')])` casts; `make_cols` splits into `price_double` and `price_string`; `project:double` keeps one type and nulls the rest; `make_struct` nests both. `applyMapping` renames and casts in one pass, and `relationalize` flattens nested structures into several frames with keys.
DynamicFrames integrate with the catalog and the Glue sinks: `glueContext.create_dynamic_frame.from_catalog` reads with partition pushdown; `write_dynamic_frame.from_options` writes and can update the catalog. Job bookmarks work on DynamicFrames read from the catalog.
For joins, window functions, SQL and most transformations, a DataFrame is the better tool and usually faster. The common pattern is to read as a DynamicFrame, resolve choices, call `toDF()`, transform, and `fromDF()` back for the sink.
The answer most people give
"A DynamicFrame is a DataFrame with a different name." The per-record schema and the choice type are a different model. A DataFrame cannot hold two types in one column.
They’ll ask next
A column arrives as both integer and string across files. Show the resolveChoice call for two different outcomes and say when each is right.
Reported · 2Glue ETL jobs & job bookmarksCost optimisation
What are the AWS Glue worker types and what is a DPU? What does the Glue version decide, and how is a job billed?
Why they ask this
Sizing a Glue job is a cost conversation, and the worker and version choices are what the bill depends on.
Say this
A DPU, data processing unit, is Glue's capacity unit of 4 vCPUs and 16 GB of memory. Worker types are multiples: G.1X is one DPU, G.2X two, G.4X four, G.8X eight, and G.025X a quarter DPU for streaming; R-type workers add memory-optimised ratios. The Glue version fixes the Spark and Python versions: Glue 4.0 is Spark 3.3 and Python 3.10, Glue 5.0 is Spark 3.5 and Python 3.11. Jobs are billed per DPU-hour, by the second, with a one-minute minimum.
The reasoning
Each worker runs one Spark executor, and the number of workers sets the parallelism. A job of 10 G.1X workers is 10 DPUs. The same 10 workers as G.2X is 20 DPUs with twice the memory per executor, which is the fix for executor out-of-memory on skewed joins.
G.4X and G.8X exist for memory-heavy workloads and are available from Glue 3.0 onward. The driver is also a worker of the chosen type. Auto scaling, from Glue 3.0, lets you set a maximum and have Glue add and remove workers per stage, which is the main cost lever.
The Glue version is a compatibility decision. Glue 5.0 brought Spark 3.5.4, Python 3.11, native Iceberg, Delta and Hudi support, and Lake Formation fine-grained access. Upgrading changes Spark behaviour, so it is a tested migration, not a flag.
Billing is DPU-hours times the regional rate, per second after the first minute. A 10-DPU job running 6 minutes is 1 DPU-hour. Flex execution, which runs on spare capacity, is cheaper for jobs that tolerate delay. Python shell jobs bill at a fraction of a DPU.
The answer most people give
"Add more workers to fix out-of-memory." More G.1X workers adds parallelism, not memory per executor. A larger worker type is what raises memory per task.
They’ll ask next
A G.1X job fails with executor OOM on one skewed stage. Which change fixes it, and how does the DPU count move?
What is Amazon EMR Serverless, and how does it differ from an EMR cluster on EC2? What is an application, and how is it billed?
Why they ask this
The EMR choice shapes Spark cost on AWS, and the dump's own notes size EMR clusters by hand.
Say this
EMR Serverless runs Spark and Hive jobs without a cluster you provision. You create an application, submit jobs to it, and EMR allocates workers per job and scales them with the job's stages. An EMR cluster on EC2 is a set of instances you size, start and stop, with YARN, Spot fleets and the full Hadoop ecosystem. Serverless bills per vCPU-second, GB-second and storage used by the job, with an optional pre-initialised capacity that is billed while it waits.
The reasoning
On EC2 you pick instance types, as the dump's exercise does with four r5.12xlarge nodes, and you tune executors to them. Capacity is yours whether a job uses it or not, and Spot instances cut cost at the risk of interruption. It supports every framework EMR packages: Spark, Hive, Presto, Trino, Flink, HBase.
Serverless removes the cluster. An application fixes the release label and the maximum capacity. Each job request runs with its own driver and executors, sized from Spark configs such as `spark.executor.memory`, and scales down to zero at the end. There is no SSH, no YARN UI, and only Spark and Hive.
Pre-initialised capacity keeps workers warm so a job starts in seconds instead of a minute or more. It is billed while idle, so it is for latency-sensitive or frequent jobs. Without it, every job pays start-up time.
The fit: Serverless for bursty, scheduled Spark jobs where paying only for the job beats managing a cluster. EC2 for long-running clusters with high utilisation, Spot-heavy cost strategies, or frameworks Serverless lacks. EMR on EKS is the third option for teams already on Kubernetes.
The answer most people give
"EMR Serverless is EMR with auto scaling turned on." Managed Scaling on EC2 still runs a cluster you own. Serverless has no cluster; capacity exists only while a job runs.
They’ll ask next
A nightly 40-minute Spark job and a continuous Flink job both need a home. Which EMR flavour for each, and why does Flink not fit one of them?
What is CTAS in Amazon Athena? What does it write, what are its limits, and when do you use it instead of a Glue job?
Why they ask this
CTAS is the cheapest way to convert and partition data on AWS, and its partition limit is the classic gotcha.
Say this
CTAS, CREATE TABLE AS SELECT, runs a query and writes the result to S3 as a new table registered in the Glue catalog, in Parquet by default or ORC, JSON, CSV or Avro, with optional partitioning and bucketing. A single CTAS query can write at most 100 partitions. It is the right tool for converting CSV to Parquet, repartitioning, or building a summary table from SQL, and a Glue or Spark job is the right tool when logic needs code or when more than 100 partitions are written in one pass.
The reasoning
`CREATE TABLE curated.orders WITH (format = 'PARQUET', external_location = 's3://lake/curated/orders/', partitioned_by = ARRAY['order_date']) AS SELECT ... FROM raw.orders`. Athena writes the files, creates the table, and adds the partitions. The partition columns must be last in the select.
The 100-partition limit per query is enforced; a CTAS over a year of daily data fails. The workaround is `INSERT INTO` in batches of up to 100 partitions, or a loop from Step Functions or Airflow over date ranges.
Costs follow Athena's model: the query scans the source and is billed per terabyte scanned, with a 10 MB minimum per query. Converting CSV to Parquet once typically cuts every later query's scan by an order of magnitude, which is why CTAS is often the first optimisation.
CTAS cannot update in place, has no job bookmarks, and runs with Athena's query limits on time and concurrency. For incremental daily loads the pattern is CTAS once for history, then daily `INSERT INTO` for the new partition, or a Glue job when the logic grows beyond SQL.
The answer most people give
"CTAS creates a view over the query." It writes real files to S3 and a real table. A view in Athena is `CREATE VIEW` and stores nothing.
They’ll ask next
You need to convert three years of daily CSV to partitioned Parquet with Athena. Why does one CTAS fail, and what does the working sequence look like?
What is Amazon Redshift Serverless, and what is an RPU? What are a namespace and a workgroup, and how does billing differ from a provisioned cluster?
Why they ask this
Serverless is the default Redshift answer in 2026, and the RPU is the unit everyone has to explain.
Say this
Redshift Serverless runs the Redshift engine without a cluster you size: a namespace holds the data, users and encryption settings, and a workgroup holds the compute settings and endpoint. An RPU, Redshift Processing Unit, is the capacity unit, each providing 16 GB of memory; you set a base capacity in RPUs and Serverless scales up for load. Billing is per RPU-hour, by the second with a 60-second minimum, only while queries run, plus storage per GB-month. A provisioned cluster bills per node-hour whether busy or idle.
The reasoning
The namespace is the database side: schemas, tables, snapshots, the KMS key, IAM roles for COPY. The workgroup is the compute side: base RPUs, max RPUs, network, and the endpoint your tools connect to. One namespace can be served by one workgroup at a time.
Base capacity can be set from as low as 4 RPUs up to 1,024, and Serverless adds RPUs beyond the base when concurrency or query size demands it. A max capacity setting caps the spend. More base RPUs means more memory and faster cold queries, at a higher rate per second.
Idle costs nothing for compute. A warehouse that is queried for two hours a day pays two hours. A provisioned RA3 cluster of the same power pays 24, which is why Serverless suits spiky BI and development, and provisioned suits steady 24-hour load where reserved instances get cheaper.
Features are nearly equal: Spectrum, data sharing, materialized views, federated queries. Serverless lacks a few knobs, such as manual WLM queues. It also surprises people with the 60-second minimum per burst of activity: a monitoring query every 30 seconds keeps it billing continuously.
The answer most people give
"An RPU is a node." There are no nodes to see. An RPU is an abstract slice of compute and memory, 16 GB each, scaled by Redshift behind the endpoint.
They’ll ask next
A dashboard refreshes a tiny query every 20 seconds against a Serverless workgroup. What happens to the bill, and what setting or design change addresses it?
What is a sort key in Amazon Redshift? How do compound and interleaved sort keys differ, and which does AWS recommend?
Why they ask this
Sort keys are Redshift's pruning mechanism, and the compound-versus-interleaved choice is asked by name.
Say this
A sort key defines the physical order of rows on disk, and Redshift keeps a zone map of the minimum and maximum values per 1 MB block, so a filter on a sort key column skips blocks. A compound sort key orders by the columns in sequence, like a phone book, and prunes well on filters that use the leading column. An interleaved sort key gives each column equal weight, so filters on any subset prune, at the cost of expensive maintenance. AWS recommends compound in most cases, or AUTO, which lets Redshift choose.
The reasoning
With `COMPOUND SORTKEY (order_date, customer_id)`, blocks are ordered by date, then customer within date. A filter on date skips most blocks; a filter on customer alone skips almost none, because every date range contains every customer. Range scans, merge joins and `GROUP BY` on the leading columns all benefit.
`INTERLEAVED SORTKEY (order_date, customer_id, region)` interleaves the bits of each column into the sort order, so a filter on any one column prunes about equally. It suits ad hoc query patterns with no dominant column. It costs more to load, degrades as data skews, and needs `VACUUM REINDEX` to recompute.
The docs' guidance: use compound unless you specifically need equal selectivity across columns, and prefer `SORTKEY AUTO` on new tables, which observes queries and picks a key. Keep the sort key to a few columns, since more columns dilute the leading-column benefit.
Sort keys interact with distribution keys. The distribution key decides which node holds a row; the sort key decides the order within a node. A timestamp sort key with an `EVEN` or key distribution is the typical fact-table design, and new rows appended in date order stay sorted without a vacuum.
The answer most people give
"Interleaved is better because it works for every column." Its maintenance cost and the loss of range-scan efficiency make it the exception. Compound or AUTO is the default recommendation.
They’ll ask next
Queries filter on event_time 90 percent of the time and occasionally on customer_id. Which sort key type and column order, and why not interleaved?
What do VACUUM and ANALYZE do in Amazon Redshift? What are the VACUUM variants, and how much of this is automatic now?
Why they ask this
The two maintenance commands explain most slow Redshift queries after heavy deletes, and the automatic parts are a recency check.
Say this
VACUUM reclaims space from rows that were deleted or updated, which Redshift only marks as deleted, and re-sorts rows so the sort key order holds. Its variants are FULL, the default, which does both; DELETE ONLY; SORT ONLY; REINDEX for interleaved keys; and RECLUSTER for large tables with unsorted regions. ANALYZE collects table statistics for the query planner. Redshift now runs automatic vacuum delete, automatic vacuum sort and automatic analyze in the background, so manual runs are for after large loads or deletes.
The reasoning
Redshift's storage is append-only: an `UPDATE` writes a new row and marks the old one deleted, and a `DELETE` just marks. Those ghost rows still occupy blocks and are still scanned. `VACUUM DELETE ONLY` removes them. A table that is rewritten daily by delete-and-insert without vacuum doubles in scanned size.
Rows loaded out of sort order land in an unsorted region at the end of the table, and zone maps stop pruning for it. `VACUUM SORT ONLY` merges it into the sorted part. `VACUUM FULL` does both. `VACUUM RECLUSTER` sorts only the unsorted portion and is the cheaper choice on very large tables.
`ANALYZE` updates statistics the planner uses for join order and distribution decisions. Stale statistics after a big load produce bad plans, so `ANALYZE` after a load, or `COPY` with `STATUPDATE ON`, is standard. `svv_table_info` shows `stats_off` and `unsorted` percentages to tell you which table needs attention.
Automatic vacuum delete, automatic sort and automatic analyze run during low activity and handle the steady state. They do not keep up with a 100 million row delete at 9 a.m., which is when a manual, scheduled `VACUUM` still matters. VACUUM is heavy and single-threaded per table; running it in a maintenance window is the norm.
The answer most people give
"Redshift vacuums automatically, so you never run it." The automatic jobs handle gradual change. Bulk deletes and out-of-order loads still need an explicit run, and `stats_off` and `unsorted` in `svv_table_info` tell you when.
They’ll ask next
A fact table is rebuilt daily by DELETE then INSERT and queries have slowed 3x over a month. Which VACUUM variant, and which system view proves the diagnosis?
What is Amazon Data Firehose, and how does it differ from Kinesis Data Streams? What are its buffering settings and destinations?
Why they ask this
The two Kinesis names are confused in most answers, and the dump itself lists the choice as a top ingestion question.
Say this
Kinesis Data Streams is a durable stream you write to and read from with your own consumers, retained for 24 hours by default and up to 365 days. Amazon Data Firehose, renamed from Kinesis Data Firehose in 2024, is a delivery service: it receives records, buffers them, optionally transforms or converts them, and writes them to S3, Redshift, OpenSearch, Snowflake, Iceberg tables, Splunk or an HTTP endpoint. Firehose has no consumers to write and no retention to manage; its buffer is 1 to 128 MB or 0 to 900 seconds, whichever fills first.
The reasoning
Data Streams is the Kafka-like primitive: shards, partition keys, ordering within a shard, multiple independent consumers, replay within retention. You build the consumer with the KCL, Lambda, Flink or Spark, and you own the delivery logic.
Firehose is the pipe to storage. You configure a destination, a buffer size and interval, an optional Lambda transformation, and an optional conversion to Parquet or ORC using a Glue table schema. It scales without shards in direct-put mode, and it can read from a Data Stream as its source.
Buffering decides latency. The default 5 MB or 300 seconds means a file lands on S3 every five minutes at low volume. The 2023 zero-buffering option delivers within seconds for destinations that support it, at the cost of many small files. Dynamic partitioning writes to S3 prefixes from record fields, such as `year=/month=/day=`.
The choice: Firehose when the job is "land this in S3 or Redshift with minimal code". Data Streams when you need custom consumers, replay, ordering guarantees or fan-out to several processors. Both together, Streams as source and Firehose as archive, is the common pattern.
The answer most people give
"Firehose is Kinesis with a bigger buffer." Firehose has no consumer API, no shards and no replay. It is a managed writer to destinations, and it can sit downstream of a stream.
They’ll ask next
Events must reach S3 as Parquet within a minute and also feed a real-time fraud model. Which service does each half, and how are they connected?
Reported · 2Kinesis Data Streams & FirehoseMonitoring & failure handling
What is a Kinesis shard, and what are its limits? What is enhanced fan-out, and what is on-demand capacity mode?
Why they ask this
Shard arithmetic is the sizing question the dump drills, and enhanced fan-out is what separates one consumer from many.
Say this
A shard is the unit of capacity and ordering in a Kinesis data stream. Each shard accepts 1 MB per second or 1,000 records per second of writes and serves 2 MB per second of reads shared across all standard consumers, with up to five GetRecords calls per second. Records with the same partition key land on the same shard and are ordered there. Enhanced fan-out gives each registered consumer its own 2 MB per second per shard over an HTTP/2 push connection. On-demand mode removes shard planning by scaling the stream automatically.
The reasoning
Sizing is arithmetic: 200,000 events per second at 2 KB is 400 MB per second, so at least 400 shards in provisioned mode. The dump's note is the right one: total throughput is not enough, because one hot partition key saturates one shard while the others idle. Partition key cardinality must be high and evenly spread.
Standard consumers share a shard's 2 MB per second and five reads per second, so three consumers polling the same shard each get a fraction and add latency. Enhanced fan-out registers each consumer, and Kinesis pushes records to each at a full 2 MB per second per shard. It supports up to 20 consumers per stream, with roughly 70 millisecond propagation. It costs per consumer-shard-hour and per GB.
Provisioned mode means you set the shard count and reshard by splitting and merging; the KCL handles shard changes in consumers. On-demand mode scales capacity with traffic, doubling peak within limits, and bills per GB written and read. It is the default suggestion for unknown or spiky loads.
Ordering holds only within a shard, so a key's events are ordered but the stream as a whole is not. Retention is 24 hours by default, extendable to 365 days. A record is at most 1 MB.
The answer most people give
"Add shards until total throughput fits and the stream is fine." A hot key still overloads one shard. Capacity planning includes key distribution, and the fix for a hot key is a better key, not more shards.
They’ll ask next
Three Lambda consumers read the same 50-shard stream and each lags. Which limit are they sharing, what feature removes it, and what does it cost?
Reported · 2Lambda in data pipelinesMonitoring & failure handling
What are reserved concurrency and provisioned concurrency in AWS Lambda? What problem does each solve, and what are Lambda's hard limits a data engineer hits?
Why they ask this
Lambda is in every event-driven pipeline, and the two concurrency settings are confused constantly.
Say this
Concurrency is how many instances of a function run at once; an account has a regional pool, 1,000 by default. Reserved concurrency carves out a fixed share of that pool for one function: it can never use more, and nothing else can take it, which both caps a function and protects it from starvation. Provisioned concurrency pre-initialises a number of instances so they answer without a cold start, and is billed while provisioned. The limits that bite are the 15-minute maximum duration, 10 GB of memory, 6 MB synchronous payload, and 10 GB of ephemeral storage.
The reasoning
Without reserved concurrency, one function under a burst can consume the whole account pool and throttle every other function. Setting reserved concurrency of 50 on it limits the damage. Setting it to zero is the emergency stop that disables a function.
A cap also protects downstream systems: a Lambda writing to a database with 100 connections gets reserved concurrency of 80. With Kinesis or SQS sources, the effective parallelism is also bounded by shard count or the event source's maximum concurrency setting.
Provisioned concurrency targets latency, not throughput. The runtime, dependencies and initialisation code are already loaded, so the first request is as fast as the hundredth. It is for synchronous APIs with latency budgets, and it costs per GB-second whether invoked or not. Batch pipelines rarely need it.
The 15-minute ceiling is the design boundary: a transformation that cannot finish in 15 minutes belongs in Glue, EMR or Fargate, or must be chunked by Step Functions. Memory from 128 MB to 10 GB also sets CPU proportionally, so a slow function is often fixed by more memory.
The answer most people give
"Provisioned concurrency raises the limit so more invocations run." It warms a fixed number of instances for latency. Reserved concurrency is the setting that partitions the pool.
They’ll ask next
A Lambda loading into a Postgres with 100 connections is throttling the rest of the account and exhausting connections. Which setting fixes both, and at what value?
Reported · 2Step Functions & MWAA orchestrationLambda in data pipelines
What are AWS Step Functions Standard and Express workflows? How do they differ in duration, execution semantics and billing, and what is Distributed Map?
Why they ask this
Step Functions is the AWS-native orchestrator, and the two workflow types answer different pipeline shapes.
Say this
Step Functions runs state machines defined in Amazon States Language. Standard workflows run up to one year, execute each step exactly once, keep full execution history, and bill per state transition. Express workflows run up to five minutes, at high rates, with at-least-once semantics when asynchronous and at-most-once when synchronous, and bill by request count and duration. Distributed Map runs a step over a large dataset, such as the objects in an S3 prefix, with up to 10,000 parallel child executions.
The reasoning
A Standard workflow suits a nightly pipeline: start a Glue job, wait, run a crawler, run Athena CTAS, notify. The `.sync` integration pattern waits for a job to finish without a polling loop. Every step's input and output is recorded and visible for a year. Cost is about 2.5 cents per thousand transitions, so a long-running wait is cheap.
Express suits high-volume, short event processing: thousands of executions per second transforming records, each done in seconds. History goes to CloudWatch Logs rather than the console. Asynchronous Express may run a step twice, so steps must be idempotent.
Standard's exactly-once applies to the state machine's bookkeeping; a task it invokes can still fail halfway and be retried by your `Retry` block, so idempotency in the task still matters. Both types support `Retry` and `Catch` per state, error matching, and backoff.
Distributed Map, from late 2022, reads an S3 inventory, a JSON array or CSV and launches child workflows per item or batch. Concurrency goes up to 10,000, with tolerance for a failure percentage. It is how Step Functions processes a million files without a Spark cluster.
The answer most people give
"Express is just the cheaper version of Standard." It has a five-minute limit and different execution semantics. A pipeline that waits on a 40-minute Glue job cannot be Express.
They’ll ask next
A pipeline orchestrates a 45-minute EMR step followed by validation. Which workflow type, which integration pattern avoids polling, and roughly what does a run cost?
What is Amazon MWAA? How do DAGs and dependencies get into it, how does it scale, and what can you not do with it?
Why they ask this
Managed Airflow is the common production choice on AWS, and its constraints decide how a team deploys DAGs.
Say this
Amazon Managed Workflows for Apache Airflow runs an Airflow environment for you: scheduler, workers on the Celery executor, web server and metadata database, inside your VPC. DAG files, a requirements.txt for Python packages and a plugins.zip go into an S3 bucket that the environment syncs. Environment classes from mw1.micro to mw1.2xlarge set scheduler and worker size, and workers autoscale between a minimum and maximum you set. You cannot SSH in, change the executor, or run unsupported Airflow versions.
The reasoning
Deployment is a file copy: `aws s3 cp dags/ s3://my-mwaa-bucket/dags/ --recursive`, and the environment picks up changes within a short sync interval. requirements.txt and plugins.zip are versioned objects, and changing them triggers an environment update that restarts components, which takes tens of minutes.
Scaling is by workers. Each environment class fixes the vCPU and memory per worker and the default tasks per worker. You set min and max workers, and MWAA adds workers when queued tasks exceed capacity. Scheduler count can be raised for parse-heavy environments.
Networking is yours: the environment lives in your VPC's private subnets, with public or private web server access. Connections and variables can come from Secrets Manager via the built-in secrets backend. Logs go to CloudWatch per component, which is where debugging happens without shell access.
Limits that shape design: the Celery executor only, with no custom executor, and Airflow versions limited to those MWAA supports, with upgrades as environment updates. Packages install only through requirements.txt, with a constraints file to keep Airflow itself compatible. Heavy compute belongs in EMR, Glue or ECS called from DAGs, not in the workers.
The answer most people give
"MWAA lets you run any Airflow you want, managed." The executor, versions and installation path are fixed. It is Airflow with AWS's operational choices made for you.
They’ll ask next
A team's DAG needs a Python package with a native dependency and a 20 GB pandas transform. Where does each requirement go, and which one does not belong in MWAA?
What are a replication instance, endpoints and a task in AWS Database Migration Service? What are the three migration types, and what does DMS write to S3?
Why they ask this
DMS is the default CDC tool on AWS, and the three-part vocabulary is asked directly.
Say this
A replication instance is the compute DMS runs on, an EC2 instance you size, or DMS Serverless, which sizes itself. A source endpoint and a target endpoint hold the connection details for each database or service. A task joins one source and one target with table mappings and a migration type: full load, CDC only, or full load plus CDC. To an S3 target, DMS writes CSV or Parquet files per table, and for CDC adds an operation column marking each row insert, update or delete.
The reasoning
The replication instance reads from the source's transaction log for CDC, which requires the source to be configured for it. That means binlog in row format on MySQL, and logical replication or supplemental logging on PostgreSQL and Oracle. Instance size sets memory for the change cache and the number of concurrent tables.
Endpoints are reusable across tasks and tested from the console. Extra connection attributes tune behaviour: on an S3 target, `dataFormat=parquet`, `cdcInsertsAndUpdates`, `includeOpForFullLoad`, and `timestampColumnName` are the ones data engineers set, because they decide what the lake receives.
Full load copies tables as they are, in parallel, with no ordering guarantee between tables. CDC only starts from a position in the log and streams changes. Full load plus CDC does the first and then switches to the second, caching changes that occur during the load, which is the migration and lake-ingestion default.
On S3 the CDC files carry an `Op` column with I, U or D, and a timestamp. Downstream, a merge job applies them to a Delta or Iceberg table, deduplicating by primary key and latest timestamp. Task monitoring through CloudWatch shows latency between source and target, which is the health signal.
The answer most people give
"DMS replicates the database to S3 as a live copy." It writes files: a full-load snapshot and then change records with an operation flag. Making those files into a current table is a job you build.
They’ll ask next
The CDC files in S3 have I, U and D rows for the same key within one hour. What job turns them into a current-state table, and which two columns does it sort by?
What is an IAM trust policy, and what does it mean to assume a role? How does it differ from the role's permissions policy, and how long do the credentials last?
Why they ask this
Roles are how every AWS service gets access, and the two-policy model is where cross-account setups break.
Say this
A role has two kinds of policy. The trust policy is a resource-based policy on the role that says which principals, such as an account, a service like glue.amazonaws.com, or a user, may call sts:AssumeRole on it. The permissions policies say what the role may do once assumed. Assuming a role means calling AWS STS, which returns temporary credentials for the role, valid from 15 minutes to 12 hours, one hour by default. Both the trust policy and the caller's own permission to assume are required.
The reasoning
When a Glue job runs with a role, Glue's service principal assumes it, so the trust policy must name `glue.amazonaws.com`. The permissions policy then grants S3 and catalog access. A trust policy that names the wrong service gives "not authorized to perform sts:AssumeRole", the commonest Glue setup error.
Cross-account access is the same mechanism: account A's role trusts account B's principal, and B's principal has `sts:AssumeRole` on A's role ARN. B calls STS, receives A-scoped temporary credentials, and acts in A. An external id in the trust policy guards against the confused-deputy problem.
Credentials are temporary by design. `DurationSeconds` ranges from 900 seconds to the role's maximum session duration, which an administrator sets up to 12 hours. Role chaining, assuming a role from an assumed role, is limited to one hour. Long-running jobs rely on the SDK refreshing automatically.
The practical distinction: the trust policy answers who, the permissions policy answers what, and a permission boundary or SCP can cap both. Reading an access denied means asking which of the three said no.
The answer most people give
"If the role has S3 permissions, the Lambda can use it." Only if the trust policy lets `lambda.amazonaws.com` assume it. Permissions without trust are unreachable.
They’ll ask next
An Airflow worker in account B must read S3 in account A. Write the two policies' essential elements in words, and name the STS call the worker makes.
Reported · 2IAM, KMS & Lake FormationCost optimisation
What is AWS KMS, and what is the difference between SSE-S3 and SSE-KMS? What does SSE-KMS give you that SSE-S3 does not, and what does it cost?
Why they ask this
Encryption at rest is in every security section of a pipeline interview, and the dump lists the TLS and SSE-KMS pair explicitly.
Say this
KMS is the managed key service: it creates and stores keys, controls who may use them through key policies, and logs every use to CloudTrail. SSE-S3 encrypts objects with AES-256 using keys S3 manages entirely, with no key you can see or control, and it has been the default on new objects since January 2023. SSE-KMS encrypts with a KMS key, so access to the data also requires permission on the key, each use is audited, and keys can be rotated or disabled. KMS costs per key per month and per request, with S3 Bucket Keys reducing request counts.
The reasoning
Both use envelope encryption: a unique data key per object encrypts the bytes, and the data key is itself encrypted by the master key. With SSE-S3 the master is S3's. With SSE-KMS it is a KMS key, either AWS managed, `aws/s3`, or customer managed, which is the one whose policy you write.
The control SSE-KMS adds is the second gate. A role with `s3:GetObject` but no `kms:Decrypt` on the key gets access denied, and the key policy can span accounts. Disabling the key makes every object unreadable at once, which is the crypto-shredding pattern for deletion requests.
Audit is the other gain. Every decrypt appears in CloudTrail with the principal and the object context, which SSE-S3 cannot provide. Compliance regimes that ask "who accessed this data" are usually answered with SSE-KMS plus CloudTrail data events.
Costs: a customer managed key is about one dollar per month, and requests are billed per 10,000 beyond a free tier. A pipeline reading millions of small objects can generate millions of decrypt calls and hit the KMS request quota. S3 Bucket Keys derive a bucket-level key so that most objects stop calling KMS. SSE-C, where you supply the key per request, and DSSE-KMS, dual-layer, are the other two options.
The answer most people give
"SSE-KMS is more secure because the encryption is stronger." Both are AES-256. SSE-KMS adds control, audit and revocation, not stronger ciphers.
They’ll ask next
A Spark job on a bucket with SSE-KMS throttles on KMS and the bill jumps. Which S3 feature reduces the calls, and what does it change about the key hierarchy?
Reported · 2IAM, KMS & Lake FormationGlue Data Catalog & crawlers
What are LF-tags in AWS Lake Formation? How does tag-based access control differ from named-resource grants, and what granularity can it reach?
Why they ask this
Lake Formation is the answer to column-level security on S3, and LF-tags are what makes it scale past a few tables.
Say this
LF-tags are key-value attributes, such as classification equals pii or domain equals finance, that a Lake Formation administrator attaches to catalog databases, tables and columns. Tag-based access control grants permissions on tag expressions, like select on everything where classification is public, instead of on named tables. New tables inherit the database's tags and are covered automatically. Named-resource grants list each table explicitly. Both reach column level, and data filters add row-level security.
The reasoning
Lake Formation sits between the Glue catalog and the engines. When Athena, Redshift Spectrum, EMR or Glue reads a table registered with Lake Formation, the engine asks Lake Formation for permissions and receives temporary, scoped S3 credentials. IAM policies on S3 are replaced by Lake Formation grants for registered locations.
Named-resource grants are `GRANT SELECT ON TABLE sales.orders TO role analyst`, one statement per table and principal. They are precise and do not scale: a hundred tables and twenty roles is two thousand grants, and each new table needs new ones.
With LF-tags, the administrator tags once and grants once: analysts get `SELECT` where `classification=public`; the finance role gets `classification=pii` as well. A new table tagged at creation, or inheriting from its database, is immediately governed. Column tags let `email` carry `pii` while the rest of the table is `public`, which gives column-level security without views.
Row-level security comes from data filters: a filter expression such as `region = 'EU'` attached to a grant. Hybrid access mode lets a table be governed by both IAM and Lake Formation during a migration. The trade is a steeper setup and engine support that varies by feature.
The answer most people give
"Lake Formation is a UI over IAM policies." It is a separate permission model that vends scoped credentials to engines. Once a location is registered, S3 IAM policies stop being the control.
They’ll ask next
Two hundred tables, three sensitivity levels, ten roles. Describe the grants with LF-tags, and say what happens when table 201 is created.
Reported · 2Monitoring & failure handlingIAM, KMS & Lake Formation
What is the difference between Amazon CloudWatch and AWS CloudTrail? What does each record, and which one answers who deleted a table?
Why they ask this
The two names are swapped constantly, and the deleted-table question makes the difference concrete.
Say this
CloudWatch is the monitoring service: metrics, logs, alarms and dashboards about how resources perform, such as Glue job duration, Lambda errors or Redshift CPU. CloudTrail is the audit service: a record of every API call made in the account, with the principal, time, source IP and parameters. CloudWatch answers how a system is behaving; CloudTrail answers who did what. Who deleted a table is a CloudTrail question.
The reasoning
CloudWatch Metrics are time series emitted by services and by your code; Alarms watch them and notify through SNS. CloudWatch Logs collects log streams from Lambda, Glue, MWAA and agents, with Logs Insights for querying. A pipeline's health dashboard and failure alerts live here.
CloudTrail records management events, API calls that change configuration, free for the last 90 days in the event history and delivered to S3 or CloudWatch Logs for a trail. Data events, such as individual S3 `GetObject` calls or Lambda invocations, are opt-in and billed, because of their volume.
A `DeleteTable` call to the Glue catalog, a `DeleteObject` on S3 with data events on, a change to an IAM policy: each is one CloudTrail record. The record carries the IAM identity, including an assumed role's session name. Athena over the trail bucket is the standard way to query it.
They connect: a CloudTrail trail can deliver to CloudWatch Logs, where a metric filter and alarm notify on a sensitive call such as a bucket policy change. CloudWatch cannot tell you who; CloudTrail cannot tell you how slow.
The answer most people give
"CloudWatch logs show who deleted the table." CloudWatch holds the service's own logs and metrics. The identity behind an API call is in CloudTrail.
They’ll ask next
A Glue table vanished overnight. Which service, which event name, and what field identifies the role session that made the call?
What is Amazon S3, and what guarantees and limits does it give a data engineer?
Why they ask this
The first AWS question in any data interview; the consistency model and the prefix limits are the parts worth knowing precisely.
Say this
Amazon S3 is object storage: you put and get whole objects by key within a bucket over HTTP, with no file system semantics. It is designed for eleven nines of durability, offers strong read-after-write consistency for all operations since December 2020, stores objects up to 5 TB, and supports at least 3,500 PUT and 5,500 GET requests per second per prefix. It is the storage layer of the AWS data lake, with storage classes from Standard to Glacier Deep Archive.
The reasoning
An object is bytes plus metadata under a key such as `lake/orders/dt=2026-11-01/part-0001.parquet`. There are no directories; the slashes are part of the key, and prefixes are what listing and the request limits operate on. Renames are copies, which is why Spark's commit protocols matter on S3.
Strong consistency means a `GET` or `LIST` after a `PUT` or `DELETE` returns the new state immediately, which removed the old need for consistent-view layers like EMRFS. It does not make S3 transactional across objects, which is the gap table formats fill.
The per-prefix request rate scales with more prefixes, so a layout with many partitions parallelises. Small files are the enemy: each object is a request, so millions of small files make listing and reading slow and expensive, which the dump notes as the HDFS comparison. Compaction to 128 MB to 1 GB files is the standard fix.
Storage classes trade retrieval time and cost: Standard, Intelligent-Tiering, Standard-IA, One Zone-IA, Glacier Instant, Glacier Flexible, Deep Archive. Lifecycle rules move objects between them by age. Pricing is per GB-month, per request and per GB transferred out.
The answer most people give
"S3 is a file system you mount." It is an object store with a key-value API. Tools that present it as a file system are emulating directories over keys, and operations like rename are copies.
They’ll ask next
A Spark job writes 50,000 small files a day to one prefix. Which two S3 properties make that slow and costly, and what layout and compaction fix it?
What is Amazon Redshift, and what is its architecture?
Why they ask this
The AWS warehouse definition, expected with the leader-and-compute-node picture.
Say this
Amazon Redshift is a columnar, massively parallel data warehouse. A provisioned cluster has a leader node that parses queries and plans, and compute nodes that each hold slices of the data and execute in parallel. RA3 nodes separate compute from Redshift Managed Storage on S3, so storage scales independently. Redshift Serverless hides the nodes behind RPUs. Redshift Spectrum queries S3 directly, data sharing exposes tables to other clusters, and COPY from S3 is the loading path.
The reasoning
The leader node receives SQL, compiles it, and distributes execution steps to the compute nodes. Each compute node has slices, and each slice owns a portion of every table according to the distribution style. `KEY` co-locates rows by a column, `EVEN` round-robins, `ALL` copies small tables to every node, and `AUTO` chooses.
Columnar storage with compression encodings per column, zone maps per 1 MB block, and sort keys give the scan efficiency. Queries that touch few columns of a wide table read a fraction of the bytes. The planner relies on statistics from `ANALYZE`.
RA3 node types, the current generation, keep hot data in local SSD cache and the full dataset in managed storage, billed separately. That decoupling is what allows concurrency scaling clusters and data sharing to read the same storage. DC2 nodes with local storage remain for small, fixed workloads.
Loading is `COPY` from S3 in parallel, one file per slice ideally; single-row inserts are slow. Spectrum extends queries to Parquet on S3 through the Glue catalog. Redshift is the AWS answer when a SQL warehouse with predictable performance is wanted next to a lake.
The answer most people give
"Redshift is a managed PostgreSQL." It began from a PostgreSQL fork but is a columnar MPP engine with its own storage, planner and limits. PostgreSQL features such as full constraint enforcement and many data types are absent.
They’ll ask next
Which node type separates compute from storage, and what two features does that separation make possible?
What is AWS Lambda, and where does it fit in a data pipeline?
Why they ask this
The serverless definition, with the pipeline use cases that make it relevant.
Say this
AWS Lambda runs your code in response to events without servers to manage: you upload a function, choose memory from 128 MB to 10 GB, and Lambda runs it per invocation, scaling to thousands of concurrent instances and billing per millisecond. A run lasts at most 15 minutes. In pipelines it is the glue: react to an S3 object, transform Kinesis records, trigger a Glue job or Step Functions, or serve a lightweight API.
The reasoning
Triggers include S3 events, Kinesis and DynamoDB streams, SQS queues, EventBridge rules and schedules, API Gateway and direct invocation. Each delivers an event payload to the handler. Stream and queue sources are polled by Lambda on your behalf in batches.
Memory sets CPU and network proportionally, so a 1,769 MB function gets one full vCPU. Cold starts add initialisation time on new instances; provisioned concurrency removes them where latency matters. Ephemeral storage up to 10 GB and container images up to 10 GB are available.
In data engineering the fit is small and event-driven. Validate a landed file and move it, fan out notifications, call an API, enrich records in flight, run light Python over a batch. Heavy or long transformations exceed the 15-minute limit and belong in Glue, EMR or a container.
Failure handling is per source. Asynchronous invocations retry twice and go to a dead-letter queue or destination. Stream sources retry the batch until success or expiry, with bisect-on-error and a failure destination to avoid a poison record blocking a shard.
The answer most people give
"Lambda is for any workload if you split it up." The 15-minute limit, the memory cap and the per-invocation cost model make it wrong for large transformations. It orchestrates and reacts; it does not replace Spark.
They’ll ask next
A Lambda processing a Kinesis shard hits one malformed record and the shard stops advancing. Which two settings fix it?
What is AWS IAM, and what are its main building blocks?
Why they ask this
The security foundation; the answer should name users, groups, roles and policies and say roles are preferred.
Say this
IAM, Identity and Access Management, controls who can do what in an AWS account. Its parts are users, long-lived identities for people; groups, collections of users that share policies; roles, identities with temporary credentials assumed by services, applications or other accounts; and policies, JSON documents that allow or deny actions on resources under conditions. The guidance is to use roles for anything that runs, least privilege in policies, and no long-lived keys.
The reasoning
A policy statement has Effect, Action, Resource and optional Condition. `{"Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::lake/curated/*"}` grants one read. Identity-based policies attach to users, groups and roles; resource-based policies attach to buckets, keys and roles' trust.
Evaluation is deny by default, explicit deny wins, and allows from any applicable policy are combined, within the ceilings of service control policies and permission boundaries. Conditions add context: source IP, VPC endpoint, MFA, tags, time.
Roles are the operational unit. A Glue job, an EC2 instance, a Lambda and an EKS pod each assume a role and receive rotating temporary credentials. Humans federate in through an identity provider and assume roles too. Access keys on users are the legacy path and the main source of leaked credentials.
Data engineers meet IAM in every service call: a job's role needs the S3, catalog, KMS and Lake Formation permissions its work touches, and nothing more. IAM Access Analyzer and CloudTrail show what a role actually uses, which is how least privilege is reached.
The answer most people give
"Give the job a user with an access key." Services should assume roles. Keys on users are long-lived secrets to rotate and leak; a role's credentials expire on their own.
They’ll ask next
Name the four IAM building blocks and say which one every AWS service uses to run your code.
EvergreenReported · 2Lambda in data pipelinesDMS & CDC ingestion
What is Amazon DynamoDB, and when does a data engineer use it?
Why they ask this
The NoSQL definition, with the key design facts that decide whether it fits.
Say this
DynamoDB is a managed key-value and document database with single-digit millisecond latency at any scale. A table has a partition key and an optional sort key; items are up to 400 KB; capacity is on-demand or provisioned in read and write units. It fits lookups and writes by key at high rates, such as pipeline state, deduplication tables, feature stores and serving layers. It does not fit analytics, which is done by exporting to S3 or streaming changes out.
The reasoning
Access is by key: `GetItem` and `PutItem` on the primary key, and `Query` on a partition key with a sort key range. `Scan` reads the whole table, which is slow and expensive. Design starts from the queries, because there are no joins and secondary indexes are the only other access paths.
Global secondary indexes give alternative keys with their own capacity; local secondary indexes share the partition key. Hot partitions throttle, so the partition key must spread load, the same lesson as Kinesis.
DynamoDB Streams, or Kinesis Data Streams for DynamoDB, emit every item change, which is how a table feeds a lake or a Lambda. Export to S3 writes a point-in-time snapshot without consuming capacity, and the zero-ETL integration to Redshift and OpenSearch is the analytics path.
Pipelines use it as a control plane: a table of processed file names for idempotent S3 ingestion, or a watermark per source. It also serves as a lock for a singleton job, or a cache of lookups a Lambda enriches with. TTL expires rows automatically. Conditional writes give the compare-and-set that locks need.
The answer most people give
"DynamoDB is a flexible database you can query however you like." Query paths are fixed at design time by keys and indexes. A new question often means a new index or an export to a query engine.
They’ll ask next
An S3-triggered Lambda must process each file exactly once despite duplicate events. Which DynamoDB feature implements the guard, and what is the key?
EvergreenReported · 2Lambda in data pipelinesMonitoring & failure handling
What is Amazon SQS, and what is the difference between a standard and a FIFO queue?
Why they ask this
The queue definition, with the two queue types and the visibility timeout that interviewers probe.
Say this
SQS is a managed message queue that decouples a producer from a consumer: messages wait in the queue until a consumer receives and deletes them. A standard queue offers nearly unlimited throughput with at-least-once delivery and best-effort ordering. A FIFO queue guarantees exactly-once processing within a deduplication window and strict order within a message group, at 300 messages per second per API action, or 3,000 with batching. Messages are retained 4 days by default, up to 14, and hide for a visibility timeout of 30 seconds by default after being received.
The reasoning
A consumer calls `ReceiveMessage`, processes, then `DeleteMessage`. Between those, the message is invisible to others for the visibility timeout. If processing takes longer, another consumer receives it again, which is the usual cause of duplicate processing on standard queues. Set the timeout above the processing time or extend it.
A dead-letter queue receives messages that were received more than `maxReceiveCount` times without deletion, isolating poison messages. Long polling, `WaitTimeSeconds` up to 20, reduces empty receives and cost.
FIFO queues order by message group id and deduplicate by content hash or an explicit id for five minutes. The group id also bounds parallelism: one group is consumed in order by one consumer at a time. High throughput mode raises FIFO limits by partitioning per group.
In pipelines SQS buffers S3 event notifications for Lambda or a Spark structured streaming source. It smooths bursts to a rate a database can absorb, and is the retry layer in front of an API. It is not a stream: once deleted, a message is gone, and there is no replay.
The answer most people give
"SQS delivers each message exactly once." Standard queues are at-least-once. Only FIFO queues deduplicate, within a five-minute window, and consumers must still be idempotent.
They’ll ask next
A consumer takes 90 seconds per message and messages are being processed twice. Which setting is at its default, and what two fixes exist?
EvergreenReported · 2Monitoring & failure handlingLambda in data pipelines
What is Amazon SNS, and how does it differ from SQS?
Why they ask this
The pub-sub definition, almost always asked together with SQS.
Say this
SNS is a pub-sub notification service: a publisher sends a message to a topic, and SNS pushes a copy to every subscriber, which can be SQS queues, Lambda functions, HTTP endpoints, email, SMS or Kinesis Data Firehose. SQS is a queue one consumer pulls from. SNS fans out; SQS buffers. The common pattern is SNS to several SQS queues, so each consumer gets its own durable copy.
The reasoning
A topic is the address. Publishing is one API call; delivery is SNS's job, with retries per protocol. Standard topics are at-least-once and unordered; FIFO topics, which deliver only to FIFO queues, preserve order and deduplicate.
Subscription filter policies let each subscriber receive only messages whose attributes match, so one topic can route by event type without a consumer discarding most of what it gets.
The fan-out pattern solves the problem that an S3 event notification can go to only one target per event type. Send it to SNS and subscribe three queues. Three pipelines then each process the file independently with their own retries and dead-letter queues.
SNS is also the alerting channel: CloudWatch alarms publish to a topic, and the topic emails, pages and invokes a Lambda. It stores nothing; a subscriber that is down misses the message unless it is a queue.
The answer most people give
"SNS and SQS do the same thing." SNS pushes to many subscribers and keeps nothing. SQS holds messages for one consumer group to pull. They are combined, not substituted.
They’ll ask next
Three teams each need every new file in a bucket. Why can S3 alone not deliver that, and what topology does?
EvergreenReported · 2Step Functions & MWAA orchestrationLambda in data pipelines
What is Amazon EventBridge, and how is it used in data pipelines?
Why they ask this
EventBridge is the event router behind event-driven pipelines and the replacement for cron on AWS.
Say this
EventBridge is a serverless event bus. AWS services, SaaS partners and your applications publish events as JSON; rules match events by pattern and route them to targets such as Lambda, Step Functions, SQS, Kinesis, Glue workflows or an API destination. EventBridge Scheduler runs targets on cron or rate schedules. In pipelines it starts a workflow when a file lands, when a Glue job changes state, or at a scheduled time, without writing a poller.
The reasoning
Every account has a default bus that receives AWS service events. Examples: S3 object created, with EventBridge notifications enabled on the bucket; Glue job state changes; EMR step completions; DMS task events. Custom buses hold your own domain events. Partner buses receive from SaaS vendors.
A rule is an event pattern plus targets. `{"source": ["aws.s3"], "detail-type": ["Object Created"], "detail": {"bucket": {"name": ["landing"]}}}` fires on each landed object and can start a Step Functions execution with the key as input. Input transformers reshape the event for the target.
Scheduler, split out in 2022, is the cron replacement: one-off or recurring schedules with time zones and flexible windows, targeting any API. It is how a nightly Glue job starts when there is no Airflow.
Archive and replay store events on a bus and replay them to rules, which is the recovery tool when a consumer was broken. Pipes connect a source such as SQS or Kinesis to a target with filtering and enrichment, point to point, without a rule.
The answer most people give
"EventBridge is SNS with more targets." SNS delivers a message to subscribers of a topic. EventBridge matches structured events against rules and routes them, with schedules, archives and partner sources.
They’ll ask next
A Step Functions pipeline must start whenever a file lands under one prefix. Which bucket setting, which event pattern elements, and which target?
EvergreenReported · 2Monitoring & failure handlingIAM, KMS & Lake Formation
What is AWS CloudTrail, and what are management and data events?
Why they ask this
The audit-trail definition, with the event types that decide what you can prove.
Say this
CloudTrail records API activity in an AWS account: who called which API, when, from where, with what parameters and result. Management events are control-plane calls such as creating a bucket, changing a policy or deleting a Glue table, recorded by default and viewable for 90 days in the event history. Data events are high-volume data-plane calls such as S3 object reads and Lambda invocations, which must be enabled on a trail and are billed. A trail delivers events to S3 and optionally CloudWatch Logs.
The reasoning
Each event is JSON with `eventName`, `eventSource`, `userIdentity` including the assumed role session, `sourceIPAddress`, `requestParameters` and `responseElements`. That is enough to reconstruct a deletion or a permission change.
Management events cover every service's configuration calls. Data events are opt-in per resource type: S3 object-level operations on chosen buckets, Lambda `Invoke`, DynamoDB item operations. Enabling S3 data events on a busy lake produces huge volumes, so teams scope them to sensitive buckets.
A trail writes to an S3 bucket, where Athena with a partitioned table over the trail prefix is the standard query interface, and CloudTrail Lake offers a managed SQL store. Organisation trails collect every account in an organisation into one bucket.
For a data platform, CloudTrail is the evidence for access reviews, the source for alerts on dangerous calls, and the first stop when something disappeared. It records calls, not query text; what someone selected inside Redshift is in Redshift's own audit logs.
The answer most people give
"CloudTrail shows who read which rows." It shows API calls. Row-level access inside a database is that engine's audit log; S3 object reads appear only if data events are on.
They’ll ask next
Compliance asks who downloaded a specific object last month. Which event type, was it on by default, and where do you run the query?
EvergreenReported · 2Cost optimisationIAM, KMS & Lake Formation
What is a VPC endpoint for S3, and why do data pipelines use one?
Why they ask this
A networking one-liner that shows whether you have deployed a pipeline in a private subnet.
Say this
A VPC endpoint lets resources in a VPC reach S3 over the AWS network without a NAT gateway or internet gateway. The gateway endpoint for S3 is free, adds a route to the subnet's route table, and is the default choice. The interface endpoint uses PrivateLink, puts an elastic network interface with a private IP in your subnet, costs per hour and per GB, and is needed for on-premises or cross-region access. Pipelines use them to keep traffic private, cut NAT costs, and restrict buckets to the VPC.
The reasoning
Without an endpoint, a Glue job or EMR cluster in a private subnet reaches S3 through a NAT gateway, which bills per GB processed. A Spark job that shuffles terabytes through S3 makes that the largest line item. The gateway endpoint removes it.
The gateway endpoint works through routing: a prefix list for S3 in the region points at the endpoint. It is regional and reachable only from inside that VPC. An endpoint policy can restrict which buckets are reachable, and a bucket policy can require `aws:sourceVpce` so the bucket is reachable only from that endpoint.
The interface endpoint gives S3 a DNS name and private IP inside your subnets. A data centre connected by Direct Connect or VPN can then reach S3 privately, and security groups apply. It is the choice when the gateway's routing model does not fit.
Glue connections to a VPC, EMR in private subnets, Redshift enhanced VPC routing and MWAA environments all expect an S3 endpoint. Their failures without one show up as timeouts rather than access denied, which is the diagnostic clue.
The answer most people give
"You need a NAT gateway for private subnets to reach S3." A gateway endpoint does it for free and keeps traffic off the internet. NAT is for everything that has no endpoint.
They’ll ask next
An EMR cluster in a private subnet has a huge NAT gateway bill and the security team wants S3 traffic private. Which endpoint type, what does it cost, and what bucket policy condition locks the bucket to it?