Evaluate cloud services against explicit criteria, select compute, data, messaging and integration services per workload, validate with proofs of concept, balance a curated platform catalogue with team autonomy, and document selections in ADRs
Cloud service selection is the disciplined process of choosing, for each capability a system needs, the cloud service (or combination) that best satisfies its drivers — functional fit, quality attributes, cost, security, operations and exit options — rather than defaulting to the familiar or the fashionable. With hundreds of services and overlapping options, selection is a core architect skill.
Figure 1 — Service evaluation criteria
Figure 2 — Compute selection path
Vocabulary
Meaning
Paved road
Curated, supported set of services and patterns
Service quota
Limit on usage (adjustable or hard)
PoC
Proof of concept validating assumptions
Service maturity
Feature completeness, stability, ecosystem
Table 1 — Terms
2Why It Exists
Poor selection
Consequence
DynamoDB for complex relational reporting
Painful scans, costly GSIs
Aurora for massive key-value at 1M rps
Over-provisioning
Lambda for long-running steady workloads
High cost, timeouts
Self-built queues instead of SQS
Operational burden
Service unavailable in required region
Late redesign
Table 2 — Why
3Core Concepts — Service Selection
Criterion
Questions
Functional fit
Does it support needed features (transactions, ordering, query patterns)?
// PoC harness: measure DynamoDB conditional-write latency with the Java SDK v2var latencies = new ConcurrentLinkedQueue<Long>();try (var exec = Executors.newVirtualThreadPerTaskExecutor()) { for (int i = 0; i < 200_000; i++) { exec.submit(() -> { long t = System.nanoTime();try { ddb.updateItem(reserve(randomSku(), 1)); }catch (ConditionalCheckFailedException ignored) { } latencies.add((System.nanoTime() - t) / 1_000); }); }}System.out.println("p99 µs = " + percentile(latencies, 99));
HCL
# Paved-road module usage: new services get secure defaults and observabilitymodule "orders_queue" { source = "git::https://github.com/shopnow/tf-modules//sqs-standard?ref=v2.3.0" name = "order-notifications" owner = "team-orders" max_receive_count = 5 alarm_on_dlq = true}
6Practical Examples
6.1 Wrong store corrected
A team used DynamoDB for seller reporting and spent heavily on scans and GSIs. Moving reporting to Athena on S3 (fed by DynamoDB exports) cut cost 70% and simplified queries.
6.2 PoC changed the decision
A team assumed Lambda would be cheapest for a new pricing API; the PoC showed steady 2,000 rps traffic made EKS on Graviton 3× cheaper.
6.3 Region availability check
PayGrid's EU plan needed a service not yet available in a target region; selection criteria caught it before design finalisation.
At least three options incl. "do nothing/simplest"
Avoid anchoring
Table 32 — Better decisions
7Common Problems & Mistakes
Mistake
Fix
Familiarity bias
Criteria
Late limits discovery
Early review
Unvalidated assumptions
PoC
Sprawl
Paved road
Table 33 — Mistakes and fixes
Selection mistakes are mostly cognitive rather than technical. Familiarity bias picks the service the team used last time, and resume-driven choices add complex services nobody needs; a written set of weighted criteria and at least three options, including the simplest, counters both. Limits are discovered late, after design, when a 256 KB message size, a 400 KB item size or a 15-minute timeout forces rework, so review limits during shortlisting. Critical assumptions about latency or cost go untested until production; run a time-boxed proof of concept for anything on the critical path. Finally, without governance, teams adopt overlapping services for the same job, multiplying operational and security burden; a paved road with an exception process keeps the estate manageable.
8Performance & Production Considerations
Consideration
Practice
Quotas
Monitor
Cost drift
Re-evaluate
Service changes
Roadmap tracking
Table 34 — Operating selections
A selection decision has to be operated after it is made. Monitor service quotas and usage against limits, with alarms well before thresholds, and request increases ahead of peak events, because some quotas take days to raise and others are hard limits. Track cost per service and per unit of business volume, so drift towards a pricing crossover is visible early. Follow provider roadmaps and announcements: new services, regional launches or deprecations can change the best answer, and preview features should stay out of tier-0 paths until they are generally available. Check that every selected service is integrated into observability, with its metrics flowing to the shared monitoring stack. Set explicit re-selection triggers and revisit decisions when they fire.
9Architecture & Design Considerations
Guideline
Detail
Workload-driven
Profiles
Evidence-based
PoCs
Governed flexibility
Paved road + trail
Table 35 — Design guidance
10Interview Questions & Answers
Q1BasicConcept
What is cloud service selection?
Cloud service selection is the disciplined process of choosing, for each capability a system needs, the cloud service or combination of services that best satisfies its drivers, rather than defaulting to what the team knows or what is fashionable. AWS alone offers several ways to run compute, store data and move messages, each with different limits, pricing dimensions and operational models. Selection starts from the workload's characteristics, such as traffic shape, access patterns, state, latency and growth, then evaluates candidates against weighted criteria, validates critical assumptions with proofs of concept, and records the decision and exit path in an ADR. Done well, it prevents expensive redesigns once the system is in production.
Q2BasicConcept
Name key criteria.
Functional fit comes first: does the service support the features you need, such as transactions, ordering or your query patterns? Then limits and quotas, including item sizes, throughput, connections and timeouts, because hard limits force redesigns. Quality covers latency, availability SLA, durability and multi-AZ or multi-region options. The operational model asks who patches, scales and backs it up. Cost means the pricing dimensions applied to your workload profile at expected scale. Security and compliance cover encryption, IAM, audit, certifications and data residency. Ecosystem means the Java SDK, IaC provider and observability integration. Skills means team experience and hiring. Exit means data export, open protocols and alternatives. Weight these per decision.
Q3IntermediateTrade-off
When would you pick DynamoDB over Aurora?
Pick DynamoDB when access patterns are known in advance and key-based, scale is very large or very spiky, and you need predictable single-digit-millisecond latency without managing capacity or connections. Shopping carts, sessions, inventory reservations and idempotency records fit well: you design the table and keys around the queries, and the service scales almost without limit. Choose Aurora PostgreSQL when you need joins, multi-row transactions, ad-hoc queries, reporting or a data model that will keep evolving. The classic mistake is using DynamoDB for complex relational reporting, which leads to expensive scans and secondary indexes; ShopNow moved such reporting to Athena on S3 and cut its cost by 70%. Many systems use both.
Q4IntermediateTrade-off
When would you pick Lambda over EKS?
Pick Lambda when work is event-driven, short-lived and spiky, with low steady utilisation: S3 upload processing, queue consumers with bursty traffic, webhook fan-out, scheduled glue and small APIs with modest traffic. You pay per invocation, scale to zero and manage no capacity. Choose EKS when traffic is steady and high, latency must be consistently low, processes run for a long time, or you already run many services on a shared platform with a service mesh and common tooling. Cost often decides it. ShopNow assumed Lambda would be cheapest for a new pricing API, but a proof of concept showed that steady 2,000 requests per second made EKS on Graviton three times cheaper.
Q5Senior EngineerConcept
Why run a PoC?
Because the decisions that hurt most rest on assumptions that documentation and feature lists cannot confirm. A proof of concept validates the critical ones with your own workload, data and code: latency at target load, such as DynamoDB conditional writes at 50,000 per second with a p99 of 8 milliseconds; limits, like MSK partitions per broker at the planned throughput; cost at projected traffic, for instance Lambda against Fargate; integration with the Java SDK, IAM authentication and observability; and failure behaviour, such as failover time through the JDBC wrapper. Keep it narrow and time-boxed, with pass criteria agreed before starting. The results become evidence in the ADR and sometimes reverse the expected choice.
Q6Senior EngineerTrade-off
How do you choose among SQS, SNS, EventBridge and MSK?
Match the service to the interaction pattern. SQS is a work queue: point-to-point decoupling, buffering and retries with dead-letter queues, where each message is handled by one consumer. SNS is pub/sub fan-out, pushing each message to many subscribers such as SQS queues, Lambda functions or HTTP endpoints. EventBridge is an event bus with content-based routing rules, schema discovery, archive and replay, and native integration with AWS and SaaS event sources. MSK is managed Kafka, for high-throughput streams ordered per partition key, long retention, replay by consumer groups and the Kafka ecosystem, at the cost of more operations. Avoid overkill: ShopNow rejected MSK for a simple notification queue and chose SQS.
Q7Technical ArchitectConcept
What is a paved road?
A paved road is a curated, supported catalogue of services and patterns that teams can use with minimal friction, because the platform team has already done the hard work. Each service on it comes with IaC modules containing secure defaults, observability integration, runbooks, cost tagging and support, so a team creating an SQS queue gets encryption, a dead-letter queue and alarms automatically. It is the easy path, not the only path. The benefits are consistency, faster delivery, a smaller security surface and less operational sprawl; the risk is slowing innovation if it becomes rigid. ShopNow's paved road holds about 35 services, with six exceptions approved through its trail process.
Q8Technical ArchitectDesign
How do you add a service outside the paved road?
Through a lightweight but explicit trail process, rather than either free choice or a blanket ban. The team writes an ADR explaining the need, which paved-road options were considered and why they do not fit, the evaluation results and the exit plan. A security review covers IAM, encryption, data classification and compliance. Before production, the service gets a named owning team that will operate it, an IaC module with secure defaults and tagging, observability integration and runbooks. If the service proves widely useful, the platform team may adopt it into the paved road. This leaves teams room to innovate while keeping every new service supportable, secure and visible to the organisation.
Q9Solution ArchitectTrade-off
How does scale change selection?
Pricing models favour different services at different volumes, so the best choice at launch may be the wrong one at ten times the traffic. Per-request pricing, as with Lambda and API Gateway, is cheap at low volume and expensive under high, steady load, where provisioned capacity on EKS or an ALB costs far less. DynamoDB on-demand suits unpredictable traffic, while provisioned capacity with autoscaling is cheaper for steady patterns. Scale also reaches limits, such as partition throughput, connection counts or account quotas. So model cost at current, expected and peak volume during selection, identify the crossover points, and set re-selection triggers such as cost growth or limits being approached.
Q10Solution ArchitectDesign
Why assess exit at selection time?
Because lock-in is cheapest to reduce before data, integrations and team habits are built around a service. At selection time you can prefer open protocols or compatible APIs, such as PostgreSQL-compatible Aurora or Kafka-compatible MSK, put repository or adapter layers around proprietary APIs, and confirm that data can be exported in usable formats, for example DynamoDB export to S3. Two years later the same change costs a migration project. Assessing exit does not mean avoiding managed services; it means knowing the cost and path of leaving and accepting lock-in deliberately where the benefit is worth it. Record the exit path in the ADR and test the export at least once.
Newsletter
Get new tutorials every week
New ArchitectMind tutorials and interview questions, once a week. No spam, unsubscribe anytime.
Your subscription could not be saved. Please try again.
Almost done! Check your inbox and click the confirmation link to complete your subscription.
Keep going in Book 9
Cloud, Containers, DevOps & Production Architecture