Skip to content
ExponaBLOG
AWS FOR DEVELOPERS · DAY 086 / 100

The Well-Architected Framework: best practices explained

Six pillars for reviewing any system.

Expona Admin7 min read

After 86 days building systems on AWS, you've probably felt the friction: a service scales beautifully but costs balloon, security gets tight and operational overhead explodes, or one component fails and brings everything down. The Well-Architected Framework is AWS's structured answer to that chaos—not a rulebook, but a systematic way to review any system and make trade-off decisions that stick.

The Six Pillars: A Practical Comparison

The Well-Architected Framework organizes design thinking into six pillars, each answering a critical question about your architecture.

Pillar Core Question What It Protects
Operational Excellence Can we run and improve it? Runbooks, observability, CI/CD, deployment velocity
Security Is it protected? Data, access, compliance, secrets, audit trails
Reliability Does it recover? Failover, redundancy, timeouts, circuit breakers
Performance Efficiency Is it efficient? Latency, throughput, caching, resource selection
Cost Optimization Is spend optimized? Right-sizing, reserved capacity, data transfer
Sustainability Is waste minimized? Energy use, resource utilization, idle cleanup

I've seen teams focus solely on Security or Performance and ignore Operational Excellence—then struggle to deploy anything without breaking production. The framework forces you to ask all six questions before you ship.

Operational Excellence: Can We Run and Improve It?

Operational excellence is about infrastructure as code, monitoring, and the ability to update systems without guessing what's happening. It's the difference between a 30-minute deployment and a 3-hour incident investigation.

In a real e-commerce platform I built, we had solid services but terrible visibility. Adding CloudWatch custom metrics and structured logging transformed debugging from hunting logs to understanding flow in seconds.

bash
aws cloudwatch put-metric-data \
  --namespace "MyApp/Orders" \
  --metric-name "OrderProcessingTime" \
  --value 245 \
  --unit Milliseconds \
  --dimensions Environment=prod,Service=order-service

Questions to ask:

  • Can you deploy without manual steps?
  • Do you have dashboards showing system health?
  • Can the on-call engineer understand what went wrong in under 5 minutes?
  • Is your infrastructure defined in code, not console clicks?

Security: Is It Protected?

Security cuts across all pillars, but as a dedicated pillar it forces you to think about defense in depth: identity, network, data, and compliance.

I once inheritted a CRM system where database credentials were in environment variables committed to Git. We moved to AWS Secrets Manager, rotated credentials automatically, and added IAM policies that granted least-privilege access. The blast radius of a compromised key dropped from "entire database" to "one service, one role."

bash
aws secretsmanager create-secret \
  --name prod/db/password \
  --secret-string '{"username":"admin","password":"'$(openssl rand -base64 32)'"}' \
  --add-replica-regions RegionCode=eu-west-1

Key areas:

  • Identity and access management: IAM roles, not keys; resource-based policies; MFA.
  • Data protection: Encryption in transit (TLS) and at rest (KMS).
  • Detection: CloudTrail logs, GuardDuty for anomalies, VPC Flow Logs.
  • Compliance: Know your regulatory baseline—GDPR, PCI-DSS, SOC2.

Reliability: Does It Recover?

A reliable system doesn't prevent all failures—it recovers from them gracefully. Think redundancy, timeouts, circuit breakers, and graceful degradation.

I built a ride-hailing platform where one payment provider going down would crash the entire booking flow. We added a circuit breaker: after three failed calls, we'd queue the payment asynchronously and let the ride proceed. When the provider recovered, we retried from the queue. Availability went from 98% to 99.95%.

bash
aws autoscaling create-auto-scaling-group \
  --auto-scaling-group-name prod-api-asg \
  --launch-template LaunchTemplateName=prod-api-template \
  --min-size 3 \
  --max-size 10 \
  --desired-capacity 5 \
  --vpc-zone-identifier "subnet-12345,subnet-67890,subnet-abcde" \
  --health-check-type ELB \
  --health-check-grace-period 300

Reliability checklist:

  • Multi-AZ deployment for stateful services.
  • Load balancers with health checks and connection draining.
  • Timeouts on all external calls; don't let a slow third-party hang your request.
  • Database backups and point-in-time recovery.
  • Chaos engineering: intentionally break things in dev to find gaps.

Performance Efficiency: Is It Efficient?

Performance isn't just about speed—it's about meeting user expectations at minimum resource cost. A 500ms API is fine for a batch job; it's a nightmare for a search autocomplete.

On a travel platform, search was taking 3 seconds because we queried the full inventory every time. We added Redis caching for popular routes and ElastiCache cluster mode for horizontal scale. Same latency SLA, half the database load.

bash
aws elasticache create-cache-cluster \
  --cache-cluster-id travel-search-cache \
  --cache-node-type cache.r6g.xlarge \
  --engine redis \
  --num-cache-nodes 3 \
  --parameter-group-name default.redis7

Performance levers:

  • Right-size compute: don't run a t2.micro for a production database.
  • Cache aggressively: Redis, CloudFront, query result caching.
  • Use managed services: RDS auto-failover, Aurora read replicas, DynamoDB on-demand.
  • Monitor P99 and P95 latencies, not just averages.

Cost Optimization: Is Spend Optimized?

Cost optimization isn't about spending less—it's about getting more value per dollar. A $50k/month bill is fine if it generates $500k in revenue; it's disaster if revenue is $5k.

I worked with a SaaS product that left 40+ EC2 instances running for "just in case." We right-sized to on-demand for baseline load, added Auto Scaling for spikes, and bought Reserved Instances for the predictable floor. Monthly compute bill dropped 65% with zero performance impact.

bash
aws ec2 describe-instances \
  --query 'Reservations[].Instances[].[InstanceId,InstanceType,State.Name,LaunchTime]' \
  --output table | grep stopped

Cost optimization strategies:

  • Use AWS Compute Optimizer to find overprovisioned instances.
  • Buy Reserved Instances or Savings Plans for predictable baseline.
  • Use Spot Instances for fault-tolerant batch work.
  • Enable S3 Intelligent-Tiering to auto-transition cold data.
  • Set up budget alerts; don't discover surprises in the bill.

Sustainability: Is Waste Minimized?

The newest pillar, sustainability is about minimizing environmental impact. For most of us, that means efficient code and right-sized infrastructure—which also saves money.

Run idle workloads on graviton-based instances (Graviton3 uses ~60% less energy than comparable x86), schedule non-critical jobs during off-peak hours, and retire old infrastructure. I migrated a batch processing pipeline from m5 to c7g instances and cut energy use 40%; AWS paid for the migration in three months.

Sustainability considerations:

  • Choose energy-efficient instance types and architectures.
  • Shut down non-production environments outside business hours.
  • Use managed services: less operational overhead often means better utilization.
  • Monitor data transfer; egress costs add up fast and represent wasted energy.

Using the Framework as a Checklist, Not a Certification

The Well-Architected Framework isn't a pass/fail exam. It's a conversation starter—a way to systematically review trade-offs and surface blind spots before they become incidents.

When I review a system, I go pillar by pillar and ask: What's our 2-3 biggest gaps? A startup burning cash might prioritize Cost Optimization first. A healthcare platform puts Security and Reliability front and center. An early-stage SaaS might lean hard on Operational Excellence to unblock deployment velocity.

Use the AWS Well-Architected Tool—it's a free workload review checklist in the console. Answer 50-60 questions, and AWS flags risk items by pillar and severity. It's not judgmental; it's a structured way to document decisions.

In practice, I use it like this:

  1. Schedule a 90-minute review with architecture and ops teams.
  2. Go through each pillar and note high-risk gaps.
  3. Prioritize by business impact and effort.
  4. Assign owners and timelines.
  5. Re-review quarterly as the system evolves.

Prioritize Risks: Fix High-Risk Items First

Every system has gaps. The trick is knowing which ones matter.

A high-risk item has two traits: high impact (if it fails, serious damage) and high probability (likely to happen). A low-risk item might be technically interesting but won't move the needle.

I worked on a trading platform where we had Security configured perfectly—but Reliability was weak. One database replica failure caused 30 minutes of downtime and cost the company $50k in lost trades. We fixed the replica failover config within a week. Meanwhile, we deferred a "nice to have" security hardening for three months because the impact-to-effort ratio was poor.

Practical prioritization:

  • High impact, high effort: Break into smaller chunks; start early.
  • High impact, low effort: Do immediately.
  • Low impact, low effort: Nice to have; do in parallel if capacity exists.
  • Low impact, high effort: Defer or kill.

Ask your team: If this pillar fails, how bad is the blast radius? If the answer is "we lose customer data" or "we're down for hours," that's high-risk. If the answer is "our bill is slightly higher," that's medium.

Common Mistakes

Treating it as a checklist to complete, not a framework to revisit. The Well-Architected Framework is a living conversation, not a one-time audit. Your system changes, your business needs change, and new threats emerge. Review every 6–12 months.

Ignoring trade-offs. Perfect security means slower deployments. Perfect reliability costs more. You're not optimizing for all six pillars equally—you're making explicit trade-off decisions. Document them.

Focusing only on one pillar. I've seen teams obsess over Security and deploy nothing for months. Others chase Performance and ignore Cost until the bill arrives. The framework works because it forces you to balance.

Waiting for a crisis to review. The best time to review architecture is when things are calm, not when you're in a firefight at 2 AM. Use the framework proactively.

Key Takeaways

  • The six pillars—Operational Excellence, Security, Reliability, Performance, Cost, and Sustainability—are a systematic way to review any AWS workload.
  • Use the framework as a conversation, not a certification. It surfaces gaps and forces trade-off discussions.
  • Prioritize high-impact, high-probability risks first. Not every gap deserves immediate attention.
  • Balance all six pillars; ignoring one is often what causes production incidents.
  • Review quarterly or when the system changes significantly. The framework is living, not static.
  • AWS Well-Architected Tool is free and practical; use it to structure your review process.
  • Document your trade-off decisions so the next person understands why you made each choice.
ShareXLinkedInReddit

Found this useful? Support the writing.

Buy me a coffee
Written by
Expona Admin
Site administrator

Comments

Loading comments…

Leave a comment

Comments are reviewed before they appear. Be kind and stay on topic.

Related articles