This page requires JavaScript to display.
A
Unpacking...
← Cloud Platforms
Cloud Platforms

AWS Reference

Compute, storage classes, data lakes, and IAM — condensed from Solutions Architect and Data Engineer certification material.

Contents
1. Compute 2. Storage 3. Lifecycle & Versioning 4. Data Lakes 5. IAM & Access 6. Global Infrastructure 7. Cloud Economics 8. Data Lake vs Data Warehouse 9. Networking (VPC) 10. Databases 11. Serverless (Lambda) 12. Monitoring 13. Well-Architected Framework 14. Exam Domains & Sample Questions 15. SAS to AWS Migration 16. AWS Services for Data Engineering 17. Workloads Longer Than Lambda's 15 Minutes

1. Compute

2. Storage

S3 is highly available, highly durable, cost-effective and widely accessible — the default for data lakes, backups, and static hosting. Its storage classes trade cost against retrieval speed:

ClassBest for
S3 StandardFrequently accessed data needing instant retrieval
S3 Intelligent-TieringUnpredictable access patterns — auto-moves objects between tiers
S3 Infrequent AccessInstant retrieval, accessed less often, cheaper storage cost
S3 One Zone-IASame as IA but single-AZ — cheapest instant-access tier, for reproducible data
S3 GlacierLong-term archive, minutes-to-hours retrieval, low cost
S3 Glacier Deep ArchiveCheapest tier, 12-hour retrieval, for 7–10 year retention

Block & file storage for EC2

ServiceNotes
EBSPersistent block storage for a single EC2 instance, tied to one Availability Zone; behaves like a raw disk you format yourself. Supports encryption at rest.
EC2 Instance StorePhysically attached, ephemeral — data is lost on stop/terminate. Never for anything that must persist.
EFSShared file system mountable by many EC2 instances concurrently. Bursting Throughput mode (default) scales with size; Provisioned Throughput mode is for high-throughput-relative-to-size workloads.

Rule of thumb: shared access across instances → EFS. Single-instance persistent disk → EBS. Object storage accessible to many clients over the internet → S3.

3. Lifecycle & Versioning

4. Data Lakes

A data lake supports both structured and unstructured data in one place, typically S3-backed. Core services:

Typical flow: ingest raw data to S3 → crawl/catalog with Glue → transform with Glue jobs → secure with Lake Formation → query with Athena or load curated data into Redshift → visualize with QuickSight.

AWS Glue in practice

A crawler scans an S3 path, infers schema and file format, and writes table definitions into the Glue Data Catalog — the metastore Athena, Redshift Spectrum and EMR all read from. Point crawlers at specific prefixes (e.g. one per dataset) rather than a whole bucket, since a crawler can otherwise create unwanted tables from unrelated subfolders.

import boto3

glue = boto3.client("glue")

# Create and run a crawler
glue.create_crawler(
    Name="sales-crawler",
    Role="AWSGlueServiceRole",
    DatabaseName="sales_db",
    Targets={"S3Targets": [{"Path": "s3://my-bucket/sales/"}]}
)
glue.start_crawler(Name="sales-crawler")

# Inspect what the crawler cataloged
tables = glue.get_tables(DatabaseName="sales_db")
for t in tables["TableList"]:
    print(t["Name"], t["StorageDescriptor"]["Location"])

A Glue ETL job is a managed Spark (or Python shell) script that reads from the catalog, transforms, and writes back to S3 in an analytics-friendly format:

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from awsglue.context import GlueContext
from pyspark.context import SparkContext

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session

# Read from the Data Catalog
datasource = glueContext.create_dynamic_frame.from_catalog(
    database="sales_db", table_name="raw_orders"
)

# Transform: drop nulls, rename a field
cleaned = datasource.drop_fields(["temp_col"]) \
                     .rename_field("cust_id", "customer_id")

# Write back as partitioned Parquet
glueContext.write_dynamic_frame.from_options(
    frame=cleaned,
    connection_type="s3",
    connection_options={"path": "s3://my-bucket/curated/orders/", "partitionKeys": ["order_year"]},
    format="parquet"
)

Query the cataloged table straight away with Athena:

SELECT region, SUM(amount) AS total_sales
FROM sales_db.curated_orders
WHERE order_year = 2026
GROUP BY region
ORDER BY total_sales DESC;

Remember the schema-evolution rule from §8: keep new CSV/TSV columns appended at the end (Athena reads by index); Parquet tolerates reordering/removal but not renaming (Athena reads by name). Re-run the crawler, or use its schedule, whenever upstream files change shape.

5. IAM & Access

6. Global Infrastructure

Best practice: spread workloads across at least two AZs in a Region for high availability — RDS Multi-AZ, for example, keeps a synchronously replicated standby in a second AZ. Data is not copied between Regions unless you explicitly configure it to be, which is what keeps data-residency commitments intact.

7. Cloud Economics

Capital → variable expense
Pay only for what you consume, instead of buying capacity up front.
Economies of scale
Shared infrastructure across many customers drives pay-as-you-go prices down.
Stop guessing capacity
Scale up or down within minutes instead of over- or under-provisioning for the future.
Speed and agility
New resources are minutes away, so experiments cost little to try.
No data-center upkeep
Avoid the undifferentiated heavy lifting of running facilities; focus on what differentiates the business.
Go global in minutes
Deploy close to customers worldwide for lower latency and easier compliance.

8. Data Lake vs Data Warehouse

Data LakeData Warehouse
UsersData scientistsBusiness users & IT
DataRaw, native formatProcessed, structured
UsageNot yet defined — discovery, EDA, MLSpecific, ready-to-use reporting
TechnologyS3, Glue Data Catalog, Athena, EMRRelational database (e.g. Redshift)

A warehouse feeds two needs: operational (one record at a time, no long history) and analytical (thousands of records at once, fast queries, historical context) — the ETL pipeline moves data from source systems through a staging area into the warehouse's core, then out to department-specific data marts.

Glue Catalog schema evolution depends on file format: Athena reads CSV/TSV by column index, so columns must stay in order (new columns only appended at the end; removing a column breaks the mapping) but can be freely renamed in the catalog. Parquet is read by column name, so columns can be reordered, added, or removed safely — but renaming a column in the catalog orphans the old data instead of finding it.

9. Networking (VPC)

10. Databases

ServiceModelFits when
RDSManaged relational (MySQL, PostgreSQL, etc.)Familiar SQL workloads without managing the engine yourself
AuroraMySQL/PostgreSQL-compatible, AWS-built storage engineRDS workloads needing higher throughput/availability at similar operational cost
DynamoDBServerless key-value / document NoSQLSingle-digit-millisecond lookups at massive, elastic scale
RedshiftColumnar MPP warehouseAnalytical queries across large historical datasets (see the Data Warehouse reference doc)

Multi-AZ keeps a synchronously replicated standby in a second AZ for failover; read replicas are asynchronous copies that offload read traffic and can be promoted, but aren't meant for automatic failover.

11. Serverless (Lambda)

AWS Lambda runs code in response to an event without provisioning servers — billed per invocation and per millisecond of execution.

import json

def handler(event, context):
    for record in event["Records"]:
        body = json.loads(record["body"])
        process(body)
    return {"statusCode": 200}

Common triggers: S3 object-created events, SQS/SNS messages, API Gateway requests, Kinesis/DynamoDB streams, and scheduled EventBridge rules. Watch for cold starts (first invocation after idle time pays initialization cost) and the default 15-minute max execution time — longer jobs belong on ECS/Fargate, Batch, or EMR instead.

12. Monitoring

Exam shorthand: "who changed this security group" → CloudTrail. "Alert when CPU exceeds 80%" → CloudWatch. "Is this resource compliant with our tagging policy" → Config.

13. Well-Architected Framework

Operational Excellence
Run and monitor systems, and continually improve processes.
Security
Protect data, systems, and assets through risk assessment and mitigation.
Reliability
Recover from failure and dynamically meet demand — multi-AZ design lives here.
Performance Efficiency
Use resources efficiently and keep up with evolving technology.
Cost Optimization
Avoid unneeded costs — right-sizing, storage classes, lifecycle rules.
Sustainability
Minimize environmental impact of running workloads.

14. Exam Domains & Sample Questions

The Solutions Architect Associate (SAA-C02) exam weights four domains: Resilient Architectures (30%), High-Performing Architectures (28%), Secure Applications (24%), Cost-Optimized Architectures (18%). Passing score is 720 of 1,000; unanswered questions count as incorrect, so always guess rather than skip.

Cost-optimized long-term storage with no instant access requirement → S3 Glacier Deep Archive + a lifecycle rule to delete after the retention period.

Shared storage across many EC2 instances → EFS, not EBS (single-instance) or S3 (not a mountable block/file device).

Persistent disk for one instance (e.g. a self-hosted server) → EBS, not Instance Store (ephemeral) or EFS (multi-instance, unneeded here).

"Automatically move objects to cheaper storage over time" → Lifecycle Rules, not Versioning (which only protects against overwrite/delete).

Private-subnet instances need outbound internet for patches, but must stay unreachable from it → a NAT Gateway in a public subnet, with the private subnet's route table pointing to it.

Stopped instances must resume with in-memory state intact → EC2 hibernation, not a plain stop/start (which drops RAM) or an EBS snapshot (which only covers disk).

Data must stay encrypted at rest with keys kept on-premises → SSE-C (customer-provided keys) or client-side encryption — not SSE-S3/SSE-KMS, which use AWS-managed key material.

15. SAS to AWS Migration

SAS componentMoves to on AWS
Programs (DATA steps, PROCs), DI Studio / EG flowsPySpark / Spark SQL on Glue or EMR
MacrosPython functions + config
Datasets (.sas7bdat)Parquet / Delta / Iceberg on S3
LIBNAMEs to Oracle / TeradataJDBC from Spark, or AWS DMS
PROC FORMATLookup tables + joins
Schedules (LSF, cron)Step Functions / MWAA / EventBridge
ReportsQuickSight, Athena views
Statistical modelsSageMaker / Spark ML

Phases

SAS-specific traps

TrapFix
Dates are days since 1960-01-01; datetimes are seconds since 1960Add the 1960 offset
Missing . and special missings .A–.ZNULL (plus a flag if the code is meaningful)
Missing is smaller than any number in comparisonsHandle isNull explicitly
Missing sorts firstasc_nulls_first()
User-defined formatsExport to lookup tables
latin1 / wlatin1 encodingConvert to UTF-8
8-byte floats for moneyDECIMAL; compare with tolerances
Trailing blanks ignored in comparisonstrim() before joins and comparisons

Conversion patterns

SASPySpark
data out; set in; where …; new = …;filter() + withColumn()
proc sqlspark.sql()
proc sort nodupkey; by id;dropDuplicates(["id"])
merge a(in=x) b(in=y); by id; if x and y;a.join(b, "id", "inner")
by id; if first.id;row_number() over a window = 1
retain total 0; total + amt;sum over a window with rowsBetween(unboundedPreceding, 0)
proc means / proc freqgroupBy().agg() / groupBy().count()
proc transposepivot() / stack()
%macroPython function
Arrays / hash objectsColumn-list comprehensions / broadcast joins
w = Window.partitionBy("account_id").orderBy("txn_date")
acct_summary = (txn
    .withColumn("running_total",
                F.sum("amount").over(w.rowsBetween(Window.unboundedPreceding, 0)))
    .withColumn("rn", F.row_number().over(w.orderBy(F.col("txn_date").desc())))
    .filter("rn = 1").drop("rn"))      # SAS RETAIN + LAST. by account

Typical causes of mismatches: missing-value semantics, rounding, implicit sort order, many-to-many MERGE, truncation, timezone offsets. Define "done" per program as reconciliation PASS + code review + scheduled.

16. AWS Services for Data Engineering

PriorityServices
Must knowS3, IAM, Glue, EMR, Athena, Redshift, Lambda, Step Functions
Should knowMWAA, DMS, Lake Formation, CloudWatch, EventBridge, KMS, Secrets Manager
Good to knowDataSync, Snowball, Transfer Family, SNS/SQS, Kinesis/MSK, QuickSight, SageMaker, CloudFormation/Terraform
ServiceKey points
S3Buckets/prefixes, strong consistency, storage classes + lifecycle, SSE-KMS, versioning, partitioned Parquet, events → Lambda
IAMRoles assumed by services (Glue/EMR execution roles), least privilege
GlueData Catalog (Hive-compatible), crawlers, Spark jobs in DPUs (1 DPU = 4 vCPU / 16 GB), DynamicFrame vs DataFrame, job bookmarks, Glue Data Quality, workflows
EMRPrimary / core / task nodes, spot for task nodes, steps, transient clusters, EMR Serverless, EMR on EKS
AthenaTrino on S3, pay per TB scanned; Parquet + partitions + compression; CTAS / UNLOAD; partition projection; Iceberg
RedshiftMPP, RA3, Serverless; distribution KEY/EVEN/ALL/AUTO; sort keys; COPY/UNLOAD; Spectrum; SCD2 with MERGE
LambdaEvent triggers, 15-minute limit; starts Glue or Step Functions; not for heavy ETL
Step FunctionsState machines (Task, Choice, Parallel, Map, Retry/Catch); native Glue/EMR/Athena integrations; Standard vs Express
MWAAManaged Airflow: DAGs, GlueJobOperator, EmrAddStepsOperator, sensors, backfills
DMS + SCTFull load + CDC; schema conversion (Oracle/Teradata → Redshift)
Lake FormationTable/column permissions, row filters, LF-Tags, cross-account sharing
Step FunctionsAirflow (MWAA)
ModelServerless state machine (JSON / ASL)Python DAGs
Best forAWS-native, event-driven pipelinesComplex schedules, backfills, many external systems
CostPer state transitionAlways-on environment

Reference pipeline

On-prem files ──DataSync──► S3 raw/      Oracle ──DMS (full load + CDC)──► S3 raw/
EventBridge → Step Functions:
  1 Glue job raw → curated
  2 Data quality + reconciliation   (FAIL → SNS, stop)
  3 Redshift COPY (star schema, SCD2 MERGE)
  4 Update catalog partitions → Athena
  5 SNS: done
Cross-cutting: Lake Formation · KMS · CloudWatch · QuickSight

Four-week study plan

WeekFocusHands-on
1S3, IAM, Glue Catalog, crawlers, AthenaCrawl Parquet and query it; compare CSV vs Parquet scan cost
2Glue jobs + EMR ServerlessConvert one batch program; run it on both; add a job bookmark
3Redshift, modelling, DMSStar schema, COPY, SCD2 MERGE
4Lambda, Step Functions, MWAA, reconciliationS3 → Lambda → Step Functions → Glue → reconcile → SNS

Set a budget alert, prefer serverless options and delete resources after each session. Relevant certification: AWS Certified Data Engineer – Associate (DEA-C01).

17. Workloads Longer Than Lambda's 15 Minutes

The 15-minute Lambda limit is fixed. Keep Lambda for short, event-driven steps and either hand long work to another service or split it into smaller units.

OptionHowBest for
Lambda starts a long-running serviceLambda or EventBridge starts Glue, EMR Serverless, a Databricks job, ECS Fargate, AWS Batch or SageMaker Processing, then returnsIndivisible heavy work
Step Functions orchestrationA Standard workflow (up to 1 year) waits on .sync integrations, with Retry/Catch and SNS alertsMulti-step pipelines
Split the workDistributed Map over S3 objects or lines; SQS fan-out to many Lambdas with a DLQ; Kinesis/MSK batchesIndependent units
Make it fasterMore memory (which also adds CPU), parallel I/O, columnar readsJobs only slightly over the limit
"RunSettlementLoad": {
  "Type": "Task",
  "Resource": "arn:aws:states:::glue:startJobRun.sync",
  "Parameters": {
    "JobName": "settlement-load",
    "Arguments": { "--business_date.$": "$.business_date" }
  },
  "Retry": [{ "ErrorEquals": ["States.ALL"], "MaxAttempts": 2, "IntervalSeconds": 300 }],
  "Catch": [{ "ErrorEquals": ["States.ALL"], "Next": "NotifyFailure" }],
  "Next": "Reconcile"
}
ServiceTime limitBest for
GlueConfigurable (default 48 h)Serverless Spark ETL
EMR / EMR ServerlessNoneLarge Spark jobs, tuning, spot
ECS Fargate taskNoneLong Python or container jobs
AWS BatchConfigurableQueues and array jobs
Databricks jobConfigurableDatabricks platforms

Example: a 20 GB settlement file lands → EventBridge → Lambda validates it (seconds) → Step Functions runs Glue/EMR/Databricks with .sync (40 min) → Lambda writes a reconciliation record → SNS. Fan-out workers must be idempotent; cap concurrency to protect downstream systems; never make a Lambda call itself in a loop (AWS stops recursive loops), so loop with Step Functions instead.