Your completed labs
4 hands-on labs completed — key operational skills mapped to SOA-C03 exam domains.
Exam domains & weightings SOA-C03 — 5 domains (effective Sep 30 2025)
Click any domain to open an AI-powered deep-dive. SOA-C03 removed the Cost domain and merged performance optimization into Domain 1. Reliability jumped from 16% → 22%.
Study activity progress
Course section tracker
Tick off sections as you complete them. The AI Tutor and Generate Notes tabs automatically scope responses to your completed material only.
Study Notes & Exam Gotchas
Your personal notes per section, pre-loaded with exam traps and elimination strategies. Notes auto-save as you type.
Deep-dive any topic
Every button generates a structured AI response inline — no redirect required.
These 6 modules address the gaps that remain after finishing a structured course. Each generates a real-world + exam hybrid deep-dive.
Flashcards
Click a card to reveal the answer. Filter by category or generate AI-powered cards for your completed sections.
Exam-grade practice questions
Built to real SOA-C03 difficulty. Select your answer — correct and incorrect options are highlighted with full explanations.
Real Exam Simulator SOA-C03 — sourced from GitHub (Ditectrev)
Answers are hidden. Select your answer then click Reveal to check. Your score is tracked below.
Production operational scenarios
Real-world incidents that mirror SOA-C03 question patterns. Expand each for root cause and step-by-step remediation.
Executive cheat sheet
High-yield numbers, defaults, and must-know facts. Study these the night before the exam.
Service Decision Framework
For each pair, learn the ONE criterion that splits the decision. Signal words in exam questions are bolded.
| Criteria | SSM Parameter Store | Secrets Manager |
|---|---|---|
| Rotation | None (manual) | Built-in (RDS, Redshift, DocumentDB) |
| Cost | Free (standard) / $0.05/10k API (advanced) | $0.40/secret/month + $0.05/10k API |
| Config values | Yes — ideal use case | Overkill |
| Cross-account | Same account only (natively) | Supported via resource policy |
Choose Parameter Store when: "configuration values", "feature flags", "no rotation needed", "cost-sensitive".
| Criteria | Lambda | SSM Automation |
|---|---|---|
| Primary use | Custom code, event-driven logic | Multi-step AWS API orchestration |
| On-instance work | No (use Run Command via SDK) | Yes (via runCommand step) |
| AWS API calls | Yes (via SDK) | Yes (natively, no code) |
| Operational overhead | High — code + deploy + maintain | Low — document-based, managed |
| Approval steps | Must build manually | Built-in (aws:approve step) |
| Retry / wait | Must code manually | Built-in step behavior |
Choose Lambda when: "custom business logic", "third-party API", "non-AWS integration", "real-time event processing".
| Criteria | Run Command | SSM Automation | Lambda |
|---|---|---|---|
| Runs on | EC2 instances (shell) | AWS API + instances | Serverless (not on instance) |
| Best for | Restart service, install pkg, run script | Snapshot → copy → tag workflows | Custom logic, event handler |
| Target | Instance IDs, tags | AWS resources + instances | Event source |
| SSH/RDP needed | No — SSM Agent | No | No |
Automation: "create snapshot and wait", "multi-step with AWS APIs", "Config remediation document".
Lambda: "respond to S3 event", "custom logic", "webhook handler".
| Policy | When to Use | Overhead |
|---|---|---|
| Target Tracking | Keep a metric at a target (CPU at 60%, request count at 1000/sec). ASG calculates capacity automatically. | Lowest — set and forget |
| Step Scaling | Different responses at different threshold levels (70% CPU → +2, 90% → +5). | Medium |
| Simple Scaling | One action per alarm. Old approach — avoid in new designs. | Medium |
| Scheduled | Predictable traffic patterns (scale up Mon–Fri 8am, down at 6pm). | Low — time-based |
Step Scaling: "add 2 when CPU 70-90%, add 5 when 90%+".
Scheduled: "known peak hours", "business hours only".
| Service | Answers | Primary Data |
|---|---|---|
| CloudTrail | WHO did WHAT and WHEN (API history) | API call logs — who, from where, at what time |
| AWS Config | IS this resource COMPLIANT? What did it look like before? | Resource configuration snapshots over time |
| CloudWatch | IS this service HEALTHY right now? | Metrics, logs, alarms — real-time operational data |
Config: "is encryption enabled on all buckets", "detect when SG changes", "compliance over time".
CloudWatch: "CPU above 80%", "error rate in logs", "alarm when latency exceeds".
| Criteria | Multi-AZ | Read Replica |
|---|---|---|
| Purpose | High availability / automatic failover | Read scaling + cross-region DR |
| Replication | Synchronous (zero data loss) | Asynchronous (replication lag possible) |
| Readable? | No — standby not accessible | Yes — offload read traffic |
| Scope | Same region, different AZ | Same or different region |
| Failover | Automatic (~1 min, DNS flip) | Manual promotion (irreversible) |
| Cost | 2× single instance | Per replica instance |
Read Replica: "offload read traffic", "cross-region DR", "reporting workload", "read-heavy application".
| Criteria | Gateway Endpoint | Interface Endpoint (PrivateLink) |
|---|---|---|
| Services | S3 and DynamoDB ONLY | All other AWS services (SSM, SQS, ECR…) |
| Cost | Free | $0.01/hr per AZ + $0.01/GB |
| Mechanism | Route table entry | ENI with private IP + DNS |
| DNS change | None required | Private DNS resolves to ENI IP |
| On-premises access | No (route table only) | Yes (via Direct Connect / VPN) |
Interface: "private access to SSM / SQS / ECR / any non-S3 service", "on-premises to AWS service via Direct Connect".
| Service | What it detects / does | Data source |
|---|---|---|
| GuardDuty | Threat detection — compromised instances, crypto mining, C2 calls, unusual API patterns | VPC Flow Logs, CloudTrail, DNS logs |
| Inspector v2 | Vulnerability scanning — CVEs on EC2 OS packages and ECR container images | SSM Agent, ECR registry |
| Macie | Sensitive data discovery — PII, credentials in S3 objects | S3 object content |
| Security Hub | Aggregates findings from GuardDuty, Inspector, Macie, Config — cross-account single pane | All above + Config rules |
| IAM Access Analyzer | Identifies resources accessible from outside the account or trust zone | Resource policies |
| Criteria | CloudFront | Global Accelerator |
|---|---|---|
| Layer | Layer 7 (HTTP/HTTPS) | Layer 3/4 (TCP, UDP) |
| Caching | Yes — primary feature | No — pure routing |
| Static IP | Dynamic IP / domain | 2 static anycast IPs (whitelist-friendly) |
| Protocol | HTTP/HTTPS only | TCP, UDP (gaming, VoIP, IoT) |
| Failover | Based on origin health | Sub-minute automatic endpoint failover |
Global Accelerator: "static IP required", "non-HTTP protocol", "gaming", "sub-minute failover", "whitelist IP addresses".
| Strategy | RTO | RPO | Cost | Description |
|---|---|---|---|---|
| Backup & Restore | Hours | Hours | Lowest | Restore from S3/Backup on failure |
| Pilot Light | Minutes–Hours | Minutes | Low | Core DB running, app off — scale up on failover |
| Warm Standby | Minutes | Near-zero | Medium | Scaled-down environment running, scale up on failover |
| Multi-Site Active-Active | Near-zero | Zero | Highest | Full capacity in both regions simultaneously |
| Criteria | Security Group | NACL |
|---|---|---|
| Level | Instance / ENI | Subnet |
| State | Stateful — return traffic auto-allowed | Stateless — must explicitly allow both directions |
| Rule type | Allow only (no deny) | Allow AND deny |
| Rule evaluation | All rules evaluated, most permissive wins | Lowest rule number wins (first match) |
| Use to block an IP | Cannot deny specific IPs | Yes — add explicit deny rule |
Use SG when: "allow traffic to instances", "referencing another SG", "stateful control". Remember: NACL rules are numbered — lower = evaluated first.
| Criteria | OAI (Origin Access Identity) | OAC (Origin Access Control) |
|---|---|---|
| Status | Legacy — being replaced | Current recommended approach |
| SSE-KMS support | No — hard limitation | Yes |
| HTTP methods | GET, HEAD, OPTIONS only | All methods (PUT, POST, DELETE) |
| Signing | Uses legacy S3 ACL identity | SigV4 signing |
OAI trap: If a question says OAI + SSE-KMS = AccessDenied, the fix is always to replace OAI with OAC.
Generate study notes
Select a mode — the AI generates structured content scoped to your completed sections using the CloudOps Study Engine master prompt.
Lab 5 — ECS Fargate + EFS Multi-tenant Hosting
Deploy two isolated websites using Amazon ECS Fargate containers, each mounting a dedicated EFS access point for persistent, tenant-isolated storage.
ecsTaskExecutionRole IAM role with AmazonECSTaskExecutionRolePolicy.Step-by-step guide
Name:
lab5-efs | VPC: Default VPC | Click Create.Wait ~30 seconds for it to become Available. Note the File system ID (e.g.,
fs-0abc12345) — needed in Steps 5 & 6.
- EFS automatically creates mount targets in each AZ of the default VPC
- Storage class: Standard (sufficient for this lab)
Access Point 1 — /website1:
- Root directory path:
/website1 - POSIX user UID:
1001, GID:1001 - Root directory owner UID:
1001, GID:1001, Permissions:755
- Root directory path:
/website2 - POSIX user UID:
1002, GID:1002 - Root directory owner UID:
1002, GID:1002, Permissions:755
Key concept: each access point enforces an isolated root directory — website1 tasks cannot access /website2 data.
EC2 Console → Security Groups → find the SG attached to your EFS mount targets (usually the default VPC SG).
Add inbound rule:
Type: NFS | Port: 2049 | Source: default security groupAlso create (or note) a SG for your ECS tasks with inbound
TCP 80 (HTTP) open for browser access.
- Fargate tasks use awsvpc mode — each task gets its own ENI and uses its own security groups
- The task SG must allow outbound 2049 to reach EFS, and inbound 80 for HTTP
Cluster name:
lab5-clusterInfrastructure: AWS Fargate (serverless) — no EC2 instances to manage
Click Create.
- A Fargate cluster is a logical grouping — all compute is on-demand, billed per task second
- Enable Container Insights for CloudWatch monitoring (optional for this lab)
Configuration:
- Family:
lab5-website1| Launch type: Fargate - CPU:
0.25 vCPU| Memory:0.5 GB - Task execution role:
ecsTaskExecutionRole - Container image:
public.ecr.aws/docker/library/httpd:latest - Port mapping:
80/tcp
- Add volume → Name:
website1-data→ Type: EFS - File system ID:
[your fs-xxxxxxxx] - Access point ID:
[access-point-1 for /website1] - Enable transit encryption: Yes
/usr/local/apache2/htdocs → volume website1-dataApache HTTPD serves from /usr/local/apache2/htdocs — mounting EFS here makes web content persist beyond the task lifecycle.
- Family:
lab5-website2 - Volume name:
website2-data - Access point ID:
[access-point-2 for /website2] - Same image (
httpd:latest), same CPU/memory, same port 80
Service 1 (Website 1):
- Task definition:
lab5-website1:1| Desired tasks:1 - VPC: default | Subnets: select a public subnet
- Security group: one that allows inbound TCP 80
- Auto-assign public IP: ENABLED (required — Fargate needs internet access to pull
httpdfrom ECR Public)
lab5-website2:1.Wait ~2–3 minutes for both services to show RUNNING (1/1 tasks).
Test in browser:
http://[website1-task-ip]→ Apache default page (content from /website1 access point)http://[website2-task-ip]→ Apache default page (content from /website2 access point)
- Launch a temporary EC2 instance, mount the EFS file system
- Write
index.htmlinto/website1/and a different one into/website2/ - Refresh browser — each container serves its own tenant's content from EFS
- ECS: set each service desired count to 0 → delete services → delete cluster
- EFS: delete access points → delete file system
- Security groups: remove the NFS inbound rule added in Step 3
- Task definitions: deregister task definition revisions (optional)
AI study tutor