Domain 1 of 4 · Chapter 1 of 4

Data Ingestion

Choosing the ingestion lane

A retail analytics team gets two requests in the same week: surface fraud alerts within seconds of a card swipe, and load last night's full order table into the warehouse by 6 a.m. Those are the two ingestion lanes, and almost every exam item is really asking which one fits. Streaming ingestion moves records continuously, in order, with second-level latency; batch ingestion moves a bounded set of data on a schedule or trigger, trading freshness for cheaper throughput. Decide the lane from the freshness requirement before you compare any services, because a streaming answer to a nightly-load question (or a batch answer to a real-time alerting question) is the classic wrong choice.

Streaming sources

For data engineering on AWS the streaming entry points are Amazon Kinesis Data Streams[1], Amazon Data Firehose[2] (formerly Kinesis Data Firehose), Amazon MSK[3] (managed Apache Kafka), and Amazon DynamoDB Streams[4]. These differ on one axis that matters for the exam: whether the buffer is a replayable log you can re-read (Kinesis Data Streams, MSK, DynamoDB Streams) or a one-way delivery pipe you cannot (Amazon Data Firehose).

Batch sources

For batch the entry points are Amazon S3[5] as a landing zone, plus the engines that read it: AWS Glue[6], Amazon EMR[7], AWS Lambda[8] for small files, and Amazon Redshift[9] for warehouse loads. Database and SaaS sources get purpose-built connectors covered in the next sections: AWS DMS[10], Amazon AppFlow[11], AWS DataSync[12], and AWS Transfer Family[13].

The rest of this page walks the streaming mechanics (shards, throughput, and buffering) first, then the source connectors, then the triggering and replayability patterns that the exam loves to probe.

Need freshness inseconds?No (minutes+)YesBatch: S3 + Glue / EMR,DMS, AppFlow, DataSyncMust replay / fan outto many consumers?No, just deliverYesAmazon Data Firehoseto S3 / Redshift / OpenSearchNeed Kafka APIs /ecosystem?NoYesKinesisData StreamsAmazon MSK
Freshness first, then replay/fan-out need, then Kafka requirement, sorts the common ingestion services.

Kinesis shards, throughput, and fan-out

A Kinesis data stream is a set of shards, and a shard is the unit of capacity, so sizing a stream means sizing shards. Each shard ingests up to 1 MB/s or 1,000 records per second on writes, whichever it hits first, and serves up to 2 MB/s on reads through the classic shared path, capped at five GetRecords calls per second. A single record's data payload can be up to 10 MiB (the shard still sustains only 1 MB/s, absorbing the occasional large record with burst capacity). When producers push past a shard's write ceiling, the API returns ProvisionedThroughputExceededException and you must either split shards (provisioned mode) or let the stream scale itself (on-demand mode). On-demand removes shard math entirely: a new on-demand stream starts at 4 MB/s write and 8 MB/s read and scales automatically with traffic, which is the right answer when load is spiky or unknown.

Shared throughput vs enhanced fan-out

The shared 2 MB/s read budget per shard is split across every classic consumer, so a fifth consumer on a busy shard starves. Enhanced fan-out (EFO) fixes this by giving each registered consumer its own dedicated 2 MB/s per shard, pushed to it over HTTP/2 with SubscribeToShard instead of polled, which also cuts read latency. The limit that gets tested: you can register up to 20 EFO consumers per stream on On-Demand Standard and Provisioned modes (On-demand Advantage mode allows 50). It is 20 per stream, not per shard. Reach for EFO when several independent applications must each read the full stream at full speed; stay on shared reads when one or two consumers comfortably fit the 2 MB/s budget, because EFO bills per consumer-shard hour plus data retrieved.

Retention and Firehose buffering

A Kinesis data stream keeps records for a configurable retention period: the default is 24 hours and the maximum is 8,760 hours (365 days), which is what makes replay possible. Amazon Data Firehose[2] is a different tool: a fully managed, serverless delivery stream with no shards and no consumers to manage. It buffers incoming data by buffer size (in MB) and buffer interval (in seconds), then flushes a batch to the destination, whichever threshold it reaches first, so a higher interval means larger, less frequent objects in S3. Firehose can convert record format and invoke a Lambda function to transform records in flight, and it delivers to S3, Amazon Redshift, Amazon OpenSearch Service, Splunk, and generic HTTP endpoints. Because it only delivers, it has no replay: if you need to re-read the raw stream, put Kinesis Data Streams (or MSK) in front and let Firehose consume from it. Quoted limits here come from the Kinesis Data Streams quotas[14] page.

1 shardwrite 1 MB/sShared reads2 MB/s split across all consumersEnhanced fan-out (EFO)2 MB/s dedicated per consumerGetRecords (poll)SubscribeToShardConsumer AConsumer BConsumer CConsumer Dshare one 2 MB/seach gets its own 2 MB/s
Shared reads divide one shard's 2 MB/s across all consumers; EFO gives each registered consumer a dedicated 2 MB/s.

Source connectors: databases, SaaS, files, bulk

When the source is not a stream of application events, the right answer is the purpose-built connector for that source, and exam stems telegraph which one by naming the source. Lead with the source type and the connector follows.

Databases: AWS DMS

AWS Database Migration Service[10] (DMS) connects to relational, NoSQL, and data-warehouse sources and does two jobs: a one-time full load and ongoing change data capture (CDC) that replicates inserts, updates, and deletes to keep target in sync. DMS supports fully heterogeneous migrations (a different engine on each end, for example Oracle to Aurora PostgreSQL); pair it with the AWS Schema Conversion Tool (SCT)[15] to convert the schema and code when the engines differ. DMS targets include S3, Kinesis, Amazon Redshift, and DynamoDB, so it is also the answer for streaming a database's change feed into a data lake.

SaaS APIs: Amazon AppFlow

Amazon AppFlow[11] is the no-code, fully managed connector for SaaS applications such as Salesforce, ServiceNow, Zendesk, and Slack. It runs flows on a schedule, on an event, or on demand, and lands data in S3 or Amazon Redshift, so when a stem says "pull data from Salesforce" the answer is AppFlow, not a hand-written API client.

Files and partner uploads: DataSync and Transfer Family

AWS DataSync[12] moves large volumes of files or objects between on-premises storage (NFS, SMB, HDFS, object stores) and AWS (S3, EFS, FSx) with built-in scheduling, verification, and high throughput; it is the answer for recurring bulk file ingestion. AWS Transfer Family[13] is the opposite direction of control: it stands up managed SFTP, FTPS, or FTP endpoints so external partners can push files in, landing them directly in S3 or EFS, without you running a file server.

Too big for the wire: AWS Snow Family

When transferring the data set over the available network bandwidth would take an unacceptable amount of time, use the AWS Snow Family[16]: physical Snowball Edge devices you load and ship. Snowmobile is retired, so for multi-petabyte transfers the answer is Snowball Edge fleets, AWS Direct Connect, or DataSync over a high-bandwidth link, never Snowmobile.

Relational / NoSQL DBSaaS app (Salesforce)On-prem file sharesPartner SFTP uploadPB-scale, low bandwidthAWS DMS (full load + CDC)Amazon AppFlowAWS DataSyncAWS Transfer FamilyAWS Snow Family
Each source type maps to one purpose-built connector; the exam stem names the source, you name the service.

Triggers, replayability, and exam patterns

Two design choices ride alongside the service choice and show up constantly: how the pipeline starts, and what happens when something downstream fails.

Event-driven vs scheduled

Event-driven ingestion fires the moment data arrives. Amazon S3 Event Notifications[17] can publish an s3:ObjectCreated:* event to Lambda, SNS, SQS, or Amazon EventBridge[18] the instant an object lands, which then starts a Lambda function, a Glue job, or a Step Functions workflow. Scheduled ingestion runs on a clock instead: EventBridge Scheduler[19], a Glue trigger, or Amazon MWAA[20] (Managed Workflows for Apache Airflow) kicks off jobs and crawlers at set times. Use events when latency matters and arrivals are irregular; use schedules when work is periodic and batched. For wiring Kinesis into compute, an event source mapping lets Lambda poll a stream and invoke your function per batch of records, so "call a Lambda from Kinesis" means an event source mapping, not an S3 notification.

Replayability

Replayability is the ability to re-process records after a bug or outage without losing data, and the exam rewards designs that have it. A Kinesis data stream is replayable within its retention window (default 24 hours, up to 365 days): a consumer resets its iterator to an earlier SequenceNumber and re-reads. An S3 landing zone is replayable by construction: a failed batch job just re-runs against the same immutable objects. Amazon Data Firehose, by contrast, only delivers and keeps no re-readable buffer, so a Firehose-only pipeline cannot replay; if you need both managed delivery and replay, put Kinesis Data Streams in front of Firehose. DynamoDB Streams gives a 24-hour replay window over item-level changes for the same reason.

Handling rate limits and stateful vs stateless

Producers must respect downstream limits: a Kinesis shard throttles at 1 MB/s or 1,000 records/s, and DynamoDB and RDS throttle on their own provisioned limits, so producers handle ProvisionedThroughputExceededException with exponential backoff and retry, or batch and aggregate records to stay under the cap. Know the difference between a stateless transaction (each record processed independently, so retries and parallelism are safe) and a stateful one (order or accumulated context matters, so it needs a partition key that keeps related records on the same shard and ordered processing).

Exam-pattern recognition

The stem says "within seconds" or "real-time alerting" → streaming (Kinesis Data Streams or MSK). The stem says "deliver to S3/Redshift with no servers to manage" → Amazon Data Firehose. The stem says "replay" or "multiple independent consumers" → Kinesis Data Streams or MSK, never Firehose. The stem names a database and "ongoing replication" → AWS DMS with CDC. The stem names a SaaS app → AppFlow. The stem says "too much data to transfer over the network in time" → Snow Family (and never Snowmobile, which is retired).

What starts the job?arrival, clock, or streamObject arrivesS3 events / EventBridgePeriodic / batchedScheduler / Glue / MWAAStream of recordsLambda event source mappingeventtimepollDesign for replay either wayKinesis retention or re-run from S3
Trigger by arrival, clock, or stream; in every case keep the pipeline replayable via Kinesis retention or re-runnable S3 objects.

Ingestion service by freshness and source

Decision axisKinesis Data StreamsAmazon Data FirehoseAmazon MSKAWS DMSBatch (S3 + Glue/EMR)
FreshnessSeconds, real-timeNear-real-time (buffered)Seconds, real-timeCDC: near-real-timeMinutes to hours
Replayable / re-readableYes, within retentionNo (delivery only)Yes, within retentionRestart taskYes (re-read S3)
Multiple independent consumersYes (incl. enhanced fan-out)NoYes (consumer groups)Per target endpointYes
You manage capacityShards (or on-demand)None (serverless)Brokers/partitionsReplication instanceJob sizing
Primary source typeProducers / appsStreaming recordsKafka producersDatabasesFiles / objects in S3
Typical destinationsCustom consumers, Flink, LambdaS3, Redshift, OpenSearchKafka consumersS3, Kinesis, Redshift, DynamoDBLake / warehouse tables

Decision tree

What is the source?stream of events vs otherdatabase / SaaS / filesapp event streamWhich non-stream source?pick the connector by sourceNeed replay / fan-out?re-read by many consumersDBSaaSfiles / bulkAWS DMSfull load + CDCAppFlowSaaS APIsDataSync / TransferSnow if too big for wireNo, just deliverYesAmazon Data Firehoseto S3 / Redshift / OpenSearchNeed Kafka APIs?ecosystem / native orderingNoYesKinesis Data StreamsEFO for many readersAmazon MSKmanaged KafkaAlways: trigger by event or schedule, and design for replayS3 events / EventBridge / MWAA; Kinesis retention or re-runnable S3

Sharp facts the exam loves — give these one last read before exam day.

Cheat sheet

Sharp facts the exam loves — scan these before test day.

Pick the ingestion lane from the freshness requirement first

Sort every ingestion question by how fresh the data must be before comparing services: second-level freshness means streaming (Kinesis Data Streams or Amazon MSK), while a latency budget of minutes or hours means batch (a scheduled read from S3 with Glue or EMR). Streaming buys continuous, ordered, low-latency delivery; batch trades freshness for cheaper throughput on a bounded data set. Choosing the wrong lane, like a streaming pipeline for a nightly load, is the most common ingestion mistake.

Trap Reaching for a streaming service to satisfy a once-a-night load; batch from S3 is simpler and cheaper when second-level freshness is not required.

Choose Kinesis Data Streams when you need a replayable, multi-consumer log

Kinesis Data Streams is a raw shard log that many independent consumers can read at their own offsets and re-read within the retention window, so it fits fan-out to several processors and reprocessing after a bug. Amazon Data Firehose only delivers and keeps no re-readable buffer, and MSK is the answer instead only when a team specifically needs Kafka APIs. Pick Data Streams whenever the design must replay records or feed more than one downstream application from the same stream.

Trap Choosing Amazon Data Firehose when the requirement is replay or multiple independent consumers; Firehose is a one-way delivery pipe with no re-readable retention.

Use Amazon Data Firehose to land streaming data with no servers to manage

Amazon Data Firehose (formerly Kinesis Data Firehose) is a fully managed, serverless delivery stream with no shards to size and no consumers to run; you point producers at it and it loads to S3, Amazon Redshift, Amazon OpenSearch Service, Splunk, or a generic HTTP endpoint. It can optionally invoke a Lambda function to transform records and convert their format in flight. Reach for it when the whole job is buffer-and-deliver and you do not need to re-read the data.

Firehose flushes on buffer size or buffer interval, whichever comes first

Amazon Data Firehose buffers incoming records by a buffer size in MB and a buffer interval in seconds, then delivers a batch when either threshold is reached. A larger interval produces fewer, bigger objects in S3 and adds delivery latency, while a smaller interval delivers sooner in smaller files; tune the two to trade freshness against object count. This buffering is why Firehose is near-real-time rather than truly real-time.

1 question tests this
A Kinesis shard caps at 1 MB/s or 1,000 records/s on writes

Each Kinesis Data Streams shard ingests up to 1 MB/s or 1,000 records per second on writes, whichever it reaches first, while a single record's data payload can be up to 10 MiB (the shard sustains 1 MB/s and absorbs the occasional large record with burst capacity). Exceed the write ceiling and the API returns ProvisionedThroughputExceededException, so size shard count to peak throughput in provisioned mode. Producers should aggregate or batch records and retry with exponential backoff to stay under the per-shard cap.

Classic shard reads share 2 MB/s; enhanced fan-out gives each consumer its own 2 MB/s

A shard's classic (shared) read path serves 2 MB/s total split across all polling consumers, capped at five GetRecords calls per second, so adding consumers starves them. Enhanced fan-out (EFO) gives each registered consumer a dedicated 2 MB/s per shard pushed over HTTP/2 via SubscribeToShard, which also lowers latency. Use EFO when several applications must each read the full stream at full speed; stay on shared reads when one or two consumers fit inside 2 MB/s, since EFO bills per consumer-shard hour plus data retrieved.

Trap Assuming adding a third or fourth classic consumer scales read throughput; they all divide the same shared 2 MB/s and throttle, which is exactly what EFO's dedicated 2 MB/s per consumer solves.

2 questions test this
Enhanced fan-out is limited to 20 consumers per stream, not per shard

You can register up to 20 enhanced fan-out consumers for each data stream on On-Demand Standard and Provisioned modes (On-demand Advantage mode allows 50). The limit is per stream, not per shard, and each registered EFO consumer still gets its own dedicated 2 MB/s on every shard. Confusing the unit is a classic distractor.

Trap Reading the EFO limit as 20 consumers per shard; it is 20 registered consumers per stream (50 in On-demand Advantage mode), independent of shard count.

Use on-demand mode when load is spiky or unknown to skip shard math

Kinesis on-demand capacity mode removes shard sizing entirely: a new on-demand stream starts at 4 MB/s write and 8 MB/s read and scales automatically with traffic. It is the right call for spiky or unpredictable workloads where you would otherwise over- or under-provision shards. Provisioned mode is cheaper at steady, well-understood throughput where you can right-size shard count. You can switch a stream between on-demand and provisioned modes twice within 24 hours.

1 question tests this
Kinesis retention is what makes a stream replayable: default 24h, up to 365 days

A Kinesis data stream keeps records for a configurable retention period, defaulting to 24 hours and extendable to a maximum of 8,760 hours (365 days). Within that window a consumer can reset its iterator to an earlier sequence number and re-read, which is the mechanism behind replayability after a downstream bug or outage. A Firehose-only pipeline has no such window, so to combine managed delivery with replay you put Kinesis Data Streams in front of Firehose.

Use AWS DMS for database sources, including ongoing change data capture

AWS Database Migration Service (DMS) connects to relational, NoSQL, and warehouse sources and does both a one-time full load and ongoing change data capture (CDC) that replicates inserts, updates, and deletes to keep the target in sync. It supports fully heterogeneous migrations, so pair it with the AWS Schema Conversion Tool (SCT) when source and target engines differ, for example Oracle to Aurora PostgreSQL. DMS targets include S3, Kinesis, Amazon Redshift, and DynamoDB, so it is also how you stream a database's change feed into a data lake.

Trap Hand-rolling a polling job against the source database to capture changes; DMS CDC reads the database's transaction log and replicates inserts, updates, and deletes natively.

1 question tests this
Use Amazon AppFlow to ingest from SaaS applications

Amazon AppFlow is the no-code, fully managed connector for SaaS APIs such as Salesforce, ServiceNow, Zendesk, and Slack, running flows on a schedule, on an event, or on demand and landing data in S3 or Amazon Redshift. When a question says to pull data from a named SaaS app, AppFlow is the answer rather than a custom API client or a generic file transfer service.

Trap Writing a custom API client (or using DataSync) to pull from Salesforce; AppFlow is the managed SaaS connector built for exactly that source.

Use DataSync for bulk file movement and Transfer Family for partner uploads

AWS DataSync moves large volumes of files or objects between on-premises storage (NFS, SMB, HDFS, object stores) and AWS (S3, EFS, FSx) with scheduling, verification, and high throughput, so it fits recurring bulk file ingestion you control. AWS Transfer Family is the inbound counterpart: it provides managed SFTP, FTPS, or FTP endpoints so external partners can push files straight into S3 or EFS without you running a file server. The deciding question is who initiates the transfer and over which protocol.

Trap Standing up a Transfer Family SFTP server to pull files you control from on-premises NAS; that is DataSync's job, while Transfer Family exists for partners pushing files in over SFTP/FTPS/FTP.

Use the Snow Family when data is too big to move over the network in time

When transferring the data set over the available bandwidth would take an unacceptable amount of time, ship it physically with AWS Snow Family (Snowball Edge) devices. Snowmobile is retired, so for multi-petabyte transfers answer with Snowball Edge fleets, AWS Direct Connect, or DataSync over a high-bandwidth link. The trigger phrase is a large volume plus limited bandwidth or a hard deadline.

Trap Answering a multi-petabyte transfer with Snowmobile; Snowmobile is retired, so the offline answer is Snowball Edge fleets (or Direct Connect / DataSync for an online link).

Trigger ingestion on events with S3 Event Notifications or EventBridge

Event-driven ingestion fires the moment data lands: an S3 Event Notification on s3:ObjectCreated:* can target Lambda, SNS, SQS, or EventBridge, which then starts a Lambda function, a Glue job, or a Step Functions workflow. Use events when latency matters and arrivals are irregular. Use a schedule (EventBridge Scheduler, a Glue trigger, or MWAA) instead when work is periodic and batched.

Call a Lambda from Kinesis with an event source mapping, not an S3 notification

To process a Kinesis (or DynamoDB) stream with Lambda, configure an event source mapping: Lambda polls the stream on your behalf and invokes the function per batch of records, with the batch size and parallelization you set. This is distinct from an S3 Event Notification, which fires on object creation in a bucket. When a stem says to call a Lambda from a Kinesis stream, the answer is the event source mapping.

Trap Wiring an S3 Event Notification to invoke Lambda from a Kinesis stream; S3 notifications fire on bucket object events, while a Kinesis-to-Lambda integration is an event source mapping that polls the shards.

Design ingestion to be replayable so a downstream bug never loses data

Replayability is the ability to re-process records after a failure without data loss, and the exam rewards designs that have it. A Kinesis stream is replayable within its retention window by resetting the iterator, and an S3 landing zone is replayable by construction because a failed batch job just re-runs against the same immutable objects. DynamoDB Streams gives a 24-hour replay window over item-level changes for the same reason; Amazon Data Firehose alone cannot replay, so front it with Kinesis Data Streams when you need both managed delivery and replay.

Keep related records ordered by routing them with a partition key

A stateless transaction processes each record independently, so retries and parallel consumers are safe; a stateful transaction depends on order or accumulated context. Kinesis preserves order only within a shard, so to process stateful records in sequence you assign a partition key that keeps related records (for example, all events for one customer) on the same shard. Spreading them across shards parallelizes throughput but loses cross-shard ordering.

Trap Assuming a Kinesis stream preserves global ordering across all shards; ordering is guaranteed only within a shard, so stateful, order-sensitive records need a partition key that pins them to one shard.

1 question tests this
Handle producer-side rate limits with backoff, batching, and aggregation

Downstream targets throttle on their own limits: a Kinesis shard at 1 MB/s or 1,000 records/s, and DynamoDB and RDS on their provisioned capacity. Producers absorb this by catching ProvisionedThroughputExceededException and retrying with exponential backoff, by batching with PutRecords, and by aggregating small records so fewer, larger writes stay under the cap. Throttling is a signal to scale capacity (more shards or on-demand mode) or smooth the producer, not to retry tighter.

DynamoDB Streams emits item-level changes retained for 24 hours

DynamoDB Streams captures a time-ordered, exactly-once log of item-level inserts, updates, and deletes and retains it for 24 hours. The StreamViewType controls what each record carries: KEYS_ONLY, NEW_IMAGE, OLD_IMAGE, or NEW_AND_OLD_IMAGES, and it cannot be changed after the stream is created. Consume it with a Lambda trigger, Apache Flink, or the Kinesis adapter to drive change-driven ingestion such as replicating updates into a data lake.

Trap Expecting to switch a DynamoDB stream's StreamViewType (for example KEYS_ONLY to NEW_AND_OLD_IMAGES) in place; the view type is fixed at creation, so you must disable the stream and create a new one.

Start a CDC-only DMS task from a native start point matching where the load ended

When a full load was done separately (native tools or a prior full-load task), create a CDC-only DMS task and set CdcStartPosition to a native start point so replication resumes exactly where the load finished with no gap or overlap. For Oracle the native start point is the System Change Number (SCN); for MySQL and MariaDB it is the binary log file name and position written as file:position (e.g. mysql-bin-changelog.000024:373).

Trap Starting the CDC task from a wall-clock timestamp, which can skip or replay transactions because one timestamp can map to multiple native points in the log.

4 questions test this
Route S3 events to an SQS FIFO queue through EventBridge, not directly

Amazon S3 Event Notifications cannot target an SQS FIFO queue; standard queues, SNS, Lambda, and EventBridge are the only direct destinations. To preserve strict ordering, enable EventBridge notifications on the bucket and add a rule whose target is the FIFO queue, since EventBridge supports sending S3 events to a FIFO queue.

Trap Configuring an S3 event notification to point straight at a .fifo queue, which the bucket configuration rejects.

4 questions test this
Stop a Lambda from re-triggering itself by scoping the S3 trigger

When a Lambda triggered by S3 writes its output back to the same bucket, the new PutObject fires another notification and creates a recursive invocation loop. Break the loop by scoping the trigger with a prefix or suffix filter so only input objects invoke the function, or by writing transformed output to a different bucket or prefix.

Trap Triggering on the whole bucket and writing results back into it, so each transformed object launches the function again.

4 questions test this
Use EventBridge for S3 events when you need suffix, size, or fan-out filtering

Plain S3 Event Notifications match only on prefix and suffix and allow one destination per event type, whereas EventBridge can filter on rich metadata such as object key suffix and numeric object size and route each pattern to its own rule with its own targets. Enable EventBridge on the bucket to send all events to the default event bus, then add multiple independent rules to route different file types or sizes to different consumers.

9 questions test this

Also tested in

References

  1. What Is Amazon Kinesis Data Streams?
  2. What is Amazon Data Firehose?
  3. What is Amazon Managed Streaming for Apache Kafka (Amazon MSK)?
  4. Change data capture for DynamoDB Streams
  5. What is Amazon S3?
  6. What is AWS Glue?
  7. What is Amazon EMR?
  8. What is AWS Lambda?
  9. Amazon Redshift Database Developer Guide — Welcome
  10. What is AWS Database Migration Service?
  11. What is Amazon AppFlow?
  12. What is AWS DataSync?
  13. What is AWS Transfer Family?
  14. Amazon Kinesis Data Streams — Quotas and Limits
  15. What is the AWS Schema Conversion Tool?
  16. What is an AWS Snowball Edge Device?
  17. Amazon S3 Event Notifications
  18. What Is Amazon EventBridge?
  19. What is Amazon EventBridge Scheduler?
  20. What is Amazon Managed Workflows for Apache Airflow?