AWS Data Stores and Ingestion Pipelines. These are the foundation of any machine learning project on AWS because raw data must be reliably stored and efficiently moved before a model can ever learn from it. For the MLS-C01 exam, you need to understand the different types of storage services, when to use each, and how pipelines connect them—without knowing this, you will fail questions about data preparation and architectural design.
Jump to a section
A simple way to picture AWS Data Stores and Ingestion Pipelines
For a large wedding, the catering team needs to manage 500 kilograms of raw ingredients delivered overnight. The kitchen has different storage areas for different needs: a walk-in freezer for frozen meats (-18 degrees Celsius), a refrigerated pantry for dairy and vegetables (4 degrees Celsius), and dry shelves for pasta and spices. The freezers are like Amazon S3 Glacier, which stores rarely accessed data very cost-effectively for years. The refrigerated pantry is like Amazon S3 Standard-Infrequent Access, which holds data that is accessed only occasionally but must be available quickly. The dry shelves are like Amazon S3 Standard, storing everyday ingredients that get pulled frequently. To get the ingredients into the kitchen, the team uses a conveyor belt system. First, suppliers unload pallets at the loading dock (like data sources such as IoT sensors or application logs). Then, the belts automatically inspect and sort each item—checking for spoilage, sorting vegetables by type, and weighing meat portions (this is like AWS Glue or Kinesis Data Firehose, which cleans, transforms, and routes incoming data). The conveyor belt moves the sorted items directly into the correct storage area without anyone having to carry them manually, which prevents bottlenecks and spoilage. If the wedding planner suddenly needs 50 kilograms of chicken for an extra course, the kitchen manager uses a tablet to quickly locate the chicken in the freezer and summon it to the prep station via a lift (this mimics querying S3 with an API request to retrieve specific objects). The entire system—from receiving to storage to retrieval—is designed so that the chefs never run out of ingredients, never waste space, and never slow down service, no matter how large the wedding gets.
This analogy maps precisely to AWS Data Stores and Ingestion Pipelines for machine learning. The data stores (S3, S3 Glacier, DynamoDB, Amazon RDS) each have different performance characteristics and costs, just like the kitchen storage areas. The ingestion pipelines (AWS Glue, Amazon Kinesis, Amazon Data Firehose, AWS DMS) are the conveyor belts that transport, validate, and transform data from source to storage. An ML workflow might pull training data from S3 (the pantry), transform features using Glue (the sorting belt), and store results back in a database like Amazon DynamoDB (a quick-access shelf for frequent querying). The conveyor belt model perfectly illustrates how AWS handles data movement at scale—parallel, reliable, and automatic—so that ML engineers can focus on building models instead of babysitting file transfers.
Before we dive into the specific services, let us understand the big picture. In any machine learning project, you start with data—lots of it. This data comes from many places: website clicks, sensor readings, financial transactions, or social media feeds. But before you can train a model, you need to store that data somewhere secure, scalable (meaning it can grow as you get more data), and cost-effective. That is where AWS Data Stores come in. AWS offers several types of data stores, each designed for a specific kind of data and access pattern. The three main categories are object storage, block storage, and database storage. Let us break each one down.
Object storage is best exemplified by Amazon Simple Storage Service (S3). Think of S3 as an infinite filing cabinet. You put files (called objects) into folders (called buckets). Each object can be anything—a CSV file, an image, a video, a log file—and it can be up to 5 terabytes in size. S3 is designed to hold massive amounts of data, petabytes (one petabyte is one million gigabytes) and beyond. It is also highly durable, meaning AWS guarantees that your data will not be lost. S3 replicates your objects across multiple devices in at least three different physical locations within the same region (a region is a specific geographic area, like US East (N. Virginia) or Europe (Ireland)). This is called 99.999999999% durability. For machine learning, S3 is the most common place to store training datasets, because you can access the data from any machine learning service like Amazon SageMaker without needing to set up complex connections. S3 has different storage classes. Standard is for frequently accessed data. Standard-Infrequent Access (S3 Standard-IA) costs less per gigabyte but charges a fee if you retrieve the data, so it is good for data you access only a few times a month. Glacier and Glacier Deep Archive are for long-term archival, where you might only retrieve data once a year or less. These have lower storage costs but higher retrieval costs and longer retrieval times (minutes to hours).
Block storage is different. This is for data that needs to be accessed at the level of individual bytes, like the operating system of a virtual machine. The main AWS block store is Amazon Elastic Block Store (EBS). EBS volumes are like virtual hard drives that you attach to an Amazon Elastic Compute Cloud (EC2) instance. They are very fast and offer consistent, low-latency performance. For machine learning, you might use EBS to store intermediate outputs of model training or to hold a local copy of a dataset that your code reads repeatedly. However, EBS volumes are tied to a specific EC2 instance in a particular Availability Zone (a data centre location), so they are less flexible for sharing data across many different services compared to S3.
Database stores are optimised for querying—asking questions about the data and getting answers quickly. AWS offers many database types: relational databases like Amazon RDS (for structured data with relationships, such as customer orders and products), NoSQL databases like Amazon DynamoDB (for key-value or document data that needs high-speed reads and writes without a fixed schema), and graph databases like Amazon Neptune (for data where relationships between entities are important, such as social networks or recommendation engines). For ML workflows, you often pull data from databases to create training datasets, or you store model predictions back into databases for real-time applications.
Now, how does data actually get from its source into these data stores? That is where ingestion pipelines come in. Ingestion means bringing data in. A pipeline is a series of steps that transforms and moves the data. AWS provides several managed services to build these pipelines so that you do not have to write complex code from scratch.
Amazon Kinesis Data Firehose is one of the easiest ways to load streaming data (data that arrives continuously, like Twitter feeds or stock prices) into S3, Redshift, or Elasticsearch. It can also transform the data on the fly using AWS Lambda (a serverless compute service that runs small pieces of code). For example, you might use Firehose to take raw JSON log data from a web app, convert it to Parquet format (a columnar format that is efficient for queries), and then save it to S3 every 60 seconds or every 1 MB of data.
AWS Glue is a serverless data integration service that can crawl your data sources (understand their schema—the structure of the data), clean and transform the data, and then load it into a target data store. Glue is especially useful for extract, transform, load (ETL) jobs in machine learning. Suppose you have customer data in DynamoDB and order data in RDS. Glue can join these datasets, handle missing values, and output a single CSV file ready for model training in S3.
Amazon Data Firehose (previously called Kinesis Data Firehose) is now integrated with Amazon S3, Amazon Redshift, and Amazon OpenSearch Service. It does not store data permanently; it delivers it to destinations you specify. For example, if you are monitoring website traffic, Firehose can take every click event, convert it to JSON, and send it to an S3 bucket for later analysis.
Amazon Kinesis Data Streams is a more low-level service for building custom streaming applications. It stores data for up to 365 days and allows multiple applications to consume the same stream simultaneously. You would use Kinesis Data Streams if you need real-time processing with custom code, like detecting fraud as transactions happen.
AWS Database Migration Service (DMS) is used to move data from one database to another. For example, if you have an on-premises Oracle database and you want to copy its data to Amazon RDS for MySQL so you can use it for ML, DMS can do that with minimal downtime.
The choice of ingestion pipeline depends on factors: is the data arriving in real-time or in batches (at scheduled intervals)? How much data is there? Does the data need transformation before it lands in the store? For the MLS-C01 exam, remember that for real-time streams, think Kinesis or Firehose. For scheduled batch ETL, think Glue or AWS Step Functions (a service to coordinate multiple AWS services). For one-time data migration, think DMS.
Finally, all these storage and pipeline services work together in a typical ML workflow. The data resides in operational databases (RDS, DynamoDB) or object storage (S3). Glue or Firehose moves it to a data lake (usually S3) where it is cleaned and prepared. Then SageMaker reads the data from S3 to train a model. The model is stored back in S3 as a model artifact, and predictions can be written back to DynamoDB or RDS for use by applications. Understanding which service fits which role is exactly what the exam tests.
Identify Source Data Systems
First, determine where your data originates. This could be an operational database (RDS, DynamoDB), a web server emitting logs, IoT sensors, or a data lake on-premises. For the MLS-C01, recognise that different sources require different ingestion methods. For example, a relational database (RDS) typically uses DMS or Glue for batch exports, while real-time sensor data needs Kinesis.
Select the Destination Data Store
Decide where you want the data to land. For most ML workflows, the destination is Amazon S3 because it acts as a data lake and is directly accessible by SageMaker. If the data needs to be queried quickly without transformation, you might choose DynamoDB or Redshift. The exam tests whether you match the access pattern (frequent reads/writes vs analysis vs archive) to the correct store.
Choose the Ingestion Method: Batch vs Stream
If the data arrives in discrete chunks at scheduled times (e.g., daily database snapshots), you use batch ingestion via AWS Glue, DMS, or Step Functions. If the data is produced continuously (e.g., clickstream log events), you need streaming ingestion via Kinesis Data Streams or Kinesis Data Firehose. The exam loves scenario questions that force you to decide based on time sensitivity.
Configure Transformation and Enrichment
Raw data is rarely ready for ML. You need to clean, normalise, and enrich it. Use AWS Glue to run ETL jobs that join tables, handle missing values, and generate features. For streaming data, attach a Lambda function to Kinesis Data Streams or use Kinesis Data Analytics for SQL-based transformations on the fly. This step ensures training data is consistent and in the correct format.
Deliver Transformed Data to the Destination
The final step is to write the clean data to your chosen data store. For batch jobs, Glue outputs to S3, RDS, or Redshift. For streaming jobs, Firehose automatically delivers to S3, Redshift, or OpenSearch Service. The exam may ask you to specify the output format—Parquet is often preferred for its compression and query efficiency, but CSV and JSON are also common.
Verify and Monitor the Pipeline
Once the pipeline is running, you need to monitor its health. AWS CloudWatch collects metrics like bytes ingested, number of records, and error rates. CloudTrail logs API calls for auditing. For the exam, know that you can set up alarms for pipeline failures (e.g., if Firehose buffer is overflowing) and you can retry failed records. This step ensures the ML team always has fresh, reliable data.
Let us imagine you work for a retail company called ShopFast, and you are building a machine learning system to predict customer churn (which customers are likely to stop buying). The company captures data from multiple sources: a PostgreSQL database containing customer profiles and purchase history, clickstream logs from the website, and customer support ticket text. Your task is to design the data storage and ingestion pipeline so that data scientists can train a churn prediction model using Amazon SageMaker.
Step 1: Identify the source systems. The PostgreSQL database is running on-premises (in the company's own data centre). The clickstream logs are generated every second from the web server, and they are currently saved as plain text files on an FTP server. The support ticket texts are stored in a MongoDB database (a NoSQL document database). You need to bring all of these into AWS.
Step 2: Choose the appropriate AWS Data Stores. Because the final dataset needs to be a single, clean, tabular format with features like 'total purchases last 30 days', 'days since last login', 'support ticket volume', you decide to land all raw data in Amazon S3. S3 is cheap, durable, and easily accessible by SageMaker. You create an S3 bucket called 'shopfast-ml-raw-data' with three prefixes (folders): /customer_db, /clickstream, /support_tickets. For the PostgreSQL data, you use AWS Database Migration Service (DMS) to do an initial full copy, then set up ongoing replication so that changes are continuously streamed to S3 as CSV files. For the clickstream logs, you decide to use Amazon Kinesis Data Firehose. You configure a Firehose delivery stream that reads the log data from a custom HTTP endpoint (your web server pushes logs there), then uses a Lambda function to convert the raw text into JSON and filter out irrelevant entries (like page load times). Firehose then delivers the processed data to the S3 bucket every 5 minutes, organised by date partitions (e.g., /clickstream/year=2025/month=04/day=10). For the MongoDB support tickets, you write a small Python script that runs on an EC2 instance once a day to extract new tickets from the last 24 hours and writes them as JSON files to S3 using the AWS SDK.
Step 3: Build the ETL pipeline to transform raw data into a training dataset. You set up an AWS Glue job that runs nightly. The Glue job first crawls the S3 raw data to automatically recognise the schemas of the CSV and JSON files. Then it performs transformations: it joins the customer data with the clickstream data by customer ID, computes aggregate features like ‘number of logins in the last week’, and joins with support ticket counts. It also handles missing values (e.g., if a customer has no clickstream data, it fills zero). The output is a Parquet file written to a separate S3 bucket called 'shopfast-ml-training-data'. Parquet is used because it compresses well and is efficient for querying large datasets.
Step 4: Use the prepared data for training. The data scientists use Amazon SageMaker. They point a processing job to the S3 location 'shopfast-ml-training-data' and run a script that splits the data into training (80%) and testing (20%) sets. The model is trained using SageMaker's built-in XGBoost algorithm (a popular gradient boosting algorithm for classification). The trained model artifact is stored back in S3 under a 'models' prefix.
Step 5: Serve predictions. Once the model is deployed as an endpoint in SageMaker, a custom application for customer service agents queries the endpoint via an API. The input data (customer features) comes from the same operational PostgreSQL database, transformed on the fly using a Lambda function. The predicted churn score is stored in an Amazon DynamoDB table for fast retrieval by the agent's dashboard.
This real-world scenario shows that the IT professional does not write most of the data pipeline code from scratch. Instead, they configure AWS managed services (DMS, Firehose, Glue, Lambda) to do the heavy lifting. The key decisions are choosing the right data store for each stage (raw S3, clean S3, operational DynamoDB), selecting the ingestion method (batch vs stream), and ensuring transformation steps are performed in the correct order (usually before training, not during inference). The exam expects you to know which service fits which part of this workflow.
The MLS-C01 exam tests domain 2.3 by asking you to select the correct combination of AWS data stores and ingestion services for a given ML scenario. This is not about memorising service names—it is about understanding their characteristics and knowing when to use each. Here is exactly what you need to focus on.
First, know the three main data store categories: object storage (S3), block storage (EBS), and database storage (RDS, DynamoDB, Redshift, Neptune, ElastiCache). For each, understand the typical use case and performance characteristics. The exam will give you a scenario like, 'A data scientist needs to store terabytes of raw image data for training a deep learning model. Which storage is most cost-effective?' The answer is S3 because it is durable, scalable, and cheap per gigabyte. They will not ask you to memorise the exact storage class names (e.g., S3 Standard vs S3 Standard-IA), but you should know the difference: Standard for frequent access, Standard-IA for infrequent access, Glacier for archive.
Second, understand the difference between batch and streaming ingestion. Batch ingestion means data is collected over a period (e.g., every hour, every night) and then processed all at once. Streaming means data is processed continuously as it arrives. The exam will present a scenario: 'An IoT sensor emits thousands of readings per second. Which service should you use to collect the data in real time?' The answer is Amazon Kinesis Data Firehose or Amazon Kinesis Data Streams. Firehose is the simpler, less code option—just configure a destination (S3, Redshift). Data Streams gives you more control and supports multiple consumers but requires you to write code for processing.
Third, recognise the role of AWS Glue. Glue is a serverless ETL service. It is the go-to answer for questions about cleaning, transforming, and preparing data for ML. If the scenario mentions crawling data sources to discover schemas, creating a catalog of data, or performing transformations with Spark (a distributed processing framework), think Glue.
Fourth, be aware of the trap: mixing up data stores with ingestion services. For example, a question might list Amazon S3, Amazon RDS, and Amazon Kinesis Data Firehose as answer options. The question asks, 'Which service should you use to load streaming data into S3?' The correct answer is Kinesis Data Firehose, not S3 itself. S3 is a destination, not an ingestion service.
Fifth, know the key properties of each service for ML-specific scenarios:
S3: most common data lake for ML training data. Use for large datasets, unstructured data (images, video), and as a source for SageMaker.
DynamoDB: fast key-value lookups. Use for real-time prediction serving (store model inputs and outputs).
Amazon Redshift: columnar data warehouse. Use when you need to run complex analytical queries on petabyte-scale structured data before training.
Amazon ElastiCache in-memory cache. Use for low-latency retrieval of frequently accessed data during inference.
Amazon Data Firehose: best for simple, serverless streaming ingestion to S3 or Redshift.
Amazon Kinesis Data Streams: best for building custom real-time applications with multiple consumers.
AWS Glue: best for batch ETL with schema discovery and transformations.
AWS DMS: best for migrating existing databases into AWS with minimal downtime.
Amazon SageMaker Processing: can read from S3, but it is not an ingestion service itself; it is for data processing within SageMaker.
Sixth, watch out for questions that combine services. For instance, 'You need to ingest clickstream data from a web app, enrich it with a lookup table from DynamoDB, and store the result in S3 every 5 minutes.' The correct design might be: Kinesis Data Firehose to stream the raw data, a Lambda function to enrich with DynamoDB data, and Firehose to deliver to S3. This tests your ability to chain services together.
Seventh, remember that the exam can ask about durability and availability. S3 is designed for 11 nines of durability (99.999999999%), meaning you will almost certainly never lose data. EBS has different durability depending on whether you use snapshots. RDS and DynamoDB have built-in replication. Knowing this helps you answer scenario questions about data loss risk.
Finally, the exam has specific question patterns. One common pattern: 'A company wants to move a Terabyte of data from an on-premises Oracle DB to S3 every night. Which AWS service should they use?' Answer: AWS Glue or AWS DMS. DMS is for database-to-database migration, but if the target is S3, you can use DMS to write to S3 (it supports S3 as a target). AWS Glue can also perform this task with a custom ETL script. The best answer usually depends on whether the data needs transformation. Another pattern: 'Which storage is best for storing intermediate results of a SageMaker training job that runs on EC2?' If the question specifies that the data needs low-latency access during training, use EBS (which is attached to the EC2 instance). If the data is shared across multiple instances, use S3 or Amazon EFS.
Amazon S3 is the foundational data lake for ML on AWS because it is durable, scalable, and cost-effective for storing raw and processed training data.
Amazon Kinesis Data Firehose is the simplest way to ingest streaming data into S3 or Redshift without writing custom code.
AWS Glue is the primary serverless ETL service for cleaning, transforming, and preparing data before ML training, with automatic schema discovery.
DynamoDB is ideal for real-time prediction serving because of its single-digit millisecond latency for key-value lookups.
Amazon Redshift is a data warehouse for OLAP, not for transactional workloads; use it for analytical queries on large structured datasets before training.
AWS DMS allows you to migrate databases from on-premises to AWS with minimal downtime, making it the go-to for moving operational data into your ML pipeline.
SageMaker reads training data directly from S3; you do not typically need EBS volumes for SageMaker jobs.
Streaming ingestion (Kinesis) is for data that arrives continuously and needs immediate processing, while batch ingestion (Glue) is for periodic scheduled transfers.
These come up on the exam all the time. Here's how to tell them apart.
Amazon S3
Object storage: stores files as objects in buckets
Accessed over HTTP/HTTPS from anywhere, not tied to a compute instance
Designed for massive scale (petabytes) and high durability (11 nines)
Amazon EBS
Block storage: attached as a virtual hard drive to one EC2 instance
Accessed via the operating system as a block device (low latency)
Limited size per volume (max 16 TB) and bound to a single Availability Zone
Amazon Kinesis Data Streams
Stores data for up to 365 days; allows multiple consumer applications
You must write custom consumer code (e.g., Lambda, KCL) to process records
Supports real-time processing with arbitrary transformations
Amazon Kinesis Data Firehose
Delivers data to a destination (S3, Redshift, etc.) without persistent storage
Serverless; no code needed for basic delivery, optional Lambda for transformations
Designed for simple, near-real-time ingestion; single consumer pattern
Amazon RDS
Relational OLTP database for small, frequent transactions
Optimised for row-based access and high concurrency of inserts/updates
Best for operational applications like a web app backend
Amazon Redshift
Relational OLAP data warehouse for large-scale analytical queries
Optimised for column-based storage and aggregate queries over petabytes
Best for business intelligence and complex analytics before ML training
AWS Glue
Serverless ETL service focused on transforming and cleaning data
Uses Apache Spark to run complex transformation jobs
Best suited for batch processing with schema discovery and data cataloguing
AWS DMS
Database migration service focused on moving data with minimal downtime
Replicates data from source to target (database or S3) with continuous changes
Best for moving entire databases without transformation
Mistake
S3 is a database you can query like SQL.
Correct
S3 is object storage, not a database. You cannot query it directly with SQL unless you use a service like Amazon Athena, which runs SQL queries on data stored in S3. S3 itself is just a place to store and retrieve files (objects) via HTTP.
Beginners hear 'store data' and think that implies query capabilities. They confuse storage services (S3) with database services (RDS, DynamoDB). S3 cannot do joins, indexes, or transactions.
Mistake
Amazon Redshift and Amazon RDS are the same—both are databases.
Correct
They serve completely different purposes. RDS is a relational database for OLTP (online transaction processing), meaning it handles many small, fast read/write operations like a web app. Redshift is a data warehouse for OLAP (online analytical processing), optimised for large, complex analytical queries on petabytes of data. Using RDS for analytics would be slow and expensive.
Both use SQL and are relational, so names sound similar. Beginners miss the critical difference: operational database vs data warehouse.
Mistake
You can use Kinesis Data Firehose to store data indefinitely and query it later.
Correct
Firehose does not store data permanently. It streams data to a destination (like S3) and then the data is removed from the Firehose buffer. The destination service (e.g., S3) is where you store and later query the data. Firehose itself is a transient pipeline.
The word 'Firehose' sounds like a continuous flow, and people assume it holds data like a bucket. In reality, it is a conveyor belt, not a storage tank.
Mistake
AWS Glue can only be used for batch processing, not streaming.
Correct
While Glue is primarily designed for batch ETL, AWS Glue also has a streaming ETL capability that can process data from Amazon Kinesis Data Streams or Apache Kafka in near-real-time. However, Glue streaming is less common; for pure streaming, Kinesis Data Streams with Lambda or Kinesis Analytics is more typical.
Many online tutorials focus on Glue for batch jobs, and the name 'Glue' suggests batch processing. Beginners do not realise it also supports streaming, albeit with fewer features.
Mistake
DynamoDB is the best choice for storing large files like images for training.
Correct
DynamoDB is designed for small items (up to 400 KB per item) and high-speed key-value lookups. Large files like images (megabytes or gigabytes) should be stored in S3, with metadata pointers in DynamoDB if needed. Storing large objects directly in DynamoDB will hit item size limits and be inefficient.
DynamoDB is fast and scalable, so beginners assume it can handle any data type. They miss the item size constraint and the cost of scanning large blobs.
Mistake
You need to use EBS volumes for all storage in SageMaker training jobs.
Correct
SageMaker can read training data directly from S3, which is the recommended approach for most cases. EBS volumes are only needed if the training algorithm requires very fast local disk I/O or if the dataset is too small to benefit from S3's object storage latency. Many SageMaker built-in algorithms read directly from S3.
People think of 'disk' when they think of loading data, and EBS is the obvious disk. They overlook S3's convenience and cost advantages for large datasets.
Reveal each answer, then mark whether you got it right. Score 60%+ to unlock the next chapter.
S3 is object storage for files of any type (up to 5 TB per object), accessible from anywhere via HTTP. EBS is block-level storage that works like a virtual hard drive attached to a single EC2 instance. Use S3 for large datasets, data lakes, and sharing files across services. Use EBS for low-latency local storage when running code on a specific instance.
Yes, you can, but it is not typical. RDS is designed for transactional workloads, not large-scale analytical queries. If you need to train a model using data from RDS, you would usually extract the data to S3 using AWS DMS or Glue, then point SageMaker to the S3 location for training.
Kinesis Data Streams stores data for up to 365 days and allows multiple consumer applications to process the same stream in real time. You must write your own consumer code (e.g., using Lambda) to process the data. Kinesis Data Firehose is simpler: it buffers data then automatically delivers it to a destination (S3, Redshift, etc.) with optional built-in transformation via Lambda, but it does not support multiple consumers.
Use AWS DMS when you need to migrate an entire database from on-premises or another cloud to AWS with minimal downtime. Use AWS Glue when you need to perform complex ETL transformations, such as joining tables, cleaning data, and converting formats, before loading it into a data store. DMS focuses on replication, Glue on transformation.
Yes, you can use Amazon Athena, which is an interactive query service that runs SQL directly on data in S3. Athena is serverless, so you pay only for the data scanned. This is common for ad-hoc analysis before training an ML model.
Parquet is a columnar storage format that compresses better and is more efficient for queries that only need a subset of columns. For large datasets, Parquet reduces storage costs and speeds up I/O. Many AWS services like Athena, Glue, and SageMaker support Parquet natively.
Use RDS if your ML pipeline needs to run frequent small transactions (e.g., updating customer features in real time). Use Redshift if you need to run complex analytical queries on multi-terabyte datasets (e.g., computing features across millions of orders). Redshift is a data warehouse, RDS is an OLTP database.
You've finished AWS Data Stores and Ingestion Pipelines. Continue through the MLS-C01 study guide to build a complete picture of the exam.
Done with this chapter?