Amazon Site Reliability Engineer (SRE) Mid-Level Interview Preparation Guide
This guide is based on industry-standard SRE interview practices for mid-level candidates at large-scale technology companies. Specific Amazon SRE interview process details from official company sources were not available during research. The guide incorporates AWS-specific knowledge relevant to Amazon's infrastructure and emphasizes principles applicable to Amazon's scale and engineering culture.
Amazon's SRE interview process for mid-level candidates typically consists of a recruiter screening phase, followed by a technical phone screening, and multiple onsite interviews focusing on system design, infrastructure expertise, operational excellence, and cultural alignment. The process evaluates technical depth in distributed systems and cloud infrastructure, alongside soft skills including collaboration, ownership, and alignment with Amazon Leadership Principles.
Interview Rounds
Recruiter Screening
What to Expect
Initial phone call with recruiter followed by a second discussion after technical screens are scheduled. This round focuses on validating your background, understanding your motivation for the SRE role at Amazon, assessing cultural fit, and confirming your experience with reliability engineering and on-call responsibilities. The recruiter will discuss team structure, role expectations, compensation, and organizational context.
Tips & Advice
Research Amazon's leadership principles before the call and reference them when discussing your experience. Be honest about your on-call experience and comfort level with incident response. Clearly articulate why you want to transition to an SRE role and why Amazon specifically appeals to you. Ask thoughtful questions about the team's current reliability challenges and how SRE is positioned within the organization. Emphasize automation projects you've led independently and quantify their impact on system reliability or operational efficiency.
Focus Topics
Automation Philosophy and Infrastructure as Code Expertise
Demonstrate your philosophy about automating repetitive operational work and reducing toil through code. Provide concrete examples of large automation or Infrastructure as Code projects you've owned, tools used (Terraform, CloudFormation, Ansible), and quantified business impact.
Practice Interview
Study Questions
Cross-Functional Collaboration and Influence
Share examples of effective collaboration with development teams, product managers, and other engineers. Discuss times you've advocated for reliability investments, educated teams about SRE practices, or influenced architecture decisions to improve reliability.
Practice Interview
Study Questions
Motivation for SRE Role and Amazon
Articulate your genuine interest in reliability engineering as a discipline, why you're excited about the SRE role specifically (versus pure development), and what attracts you to Amazon. Connect your motivation to Amazon's customer obsession principle and the criticality of uptime for customer experience.
Practice Interview
Study Questions
Your SRE Background and Hands-On Experience
Discuss your practical experience with system reliability engineering, incident response, monitoring architecture, and automation projects. Highlight specific, quantifiable achievements: systems you've stabilized, MTTR improvements, automation projects that reduced operational toil. For mid-level, focus on projects you've owned end-to-end and areas where you made independent decisions.
Practice Interview
Study Questions
On-Call Experience and Operational Culture Fit
Discuss your comfort with on-call rotations, typical page frequency, your experience responding to critical incidents at 3 AM, and your perspective on blameless culture and continuous learning from failures. Share specific, concrete examples of high-pressure situations you've navigated.
Practice Interview
Study Questions
Technical Phone Screen
What to Expect
A 60-minute technical phone screen conducted by an SRE or senior engineer. This assesses your foundational systems knowledge, systematic troubleshooting approach, understanding of core infrastructure concepts, and problem-solving ability. You'll be asked questions spanning networking, Linux systems administration, monitoring and observability principles, and basic infrastructure automation. Some questions may involve live troubleshooting scenarios or short scripting tasks. The interviewer expects clear thinking, asking good clarifying questions, and explaining your reasoning.
Tips & Advice
Think out loud when troubleshooting - explain your mental model and reasoning. Use shared whiteboards or tools to draw diagrams for networking questions. Be honest about technologies you haven't used, but explain how you'd approach learning them. Focus on demonstrating strong fundamentals and your systematic problem-solving approach. For coding/scripting tasks, prioritize correctness and clarity over cleverness. Have a notebook nearby to work through problems. Ask clarifying questions before diving into solutions. Explain trade-offs when applicable.
Focus Topics
Infrastructure Automation and Scripting
Practical ability to write automation scripts (Python, Bash, etc.) to solve operational problems. You may write a script to parse logs, manage configuration, or automate deployment tasks. Prioritize clean, maintainable code that others could understand and modify.
Practice Interview
Study Questions
Service-Level Objectives (SLOs) and Error Budgets
Understanding of how SLOs are defined, measured, and used to guide decision-making. Knowledge of error budgets and their relationship to feature development velocity vs. reliability work. Ability to explain SLOs, SLIs, and SLAs and their distinct purposes.
Practice Interview
Study Questions
Networking Fundamentals and Troubleshooting
Deep understanding of TCP/IP networking, DNS resolution process, ports, sockets, and network connectivity. Practical troubleshooting using netstat, ss, tcpdump, ping, traceroute, nslookup, and understanding of routing, firewalls, and network protocols. Ability to diagnose connectivity issues systematically.
Practice Interview
Study Questions
Systematic Troubleshooting Methodology
Your approach to diagnosing unknown problems: gathering baseline information, forming hypotheses, testing systematically, and iterating. Be prepared for scenario-based questions like 'CPU usage spiked on this server - what do you check first?' Walk through your thinking.
Practice Interview
Study Questions
Linux and Unix Systems Administration
Strong working knowledge of Linux command-line tools, file systems, process management, permissions, and system monitoring. Comfort with tools like ps, top, iostat, vmstat, df, du, and understanding of system resource allocation. Ability to read and interpret system logs, understand process states, and diagnose common system issues.
Practice Interview
Study Questions
Monitoring, Observability, and Alerting Principles
Conceptual understanding of metrics, logs, traces, and how monitoring systems function. Knowledge of SLOs (Service Level Objectives), SLIs (Service Level Indicators), and alert design principles. Understanding the difference between monitoring and observability, and how to design effective alerting that minimizes false positives.
Practice Interview
Study Questions
System Design Interview - Onsite
What to Expect
A 75-90 minute onsite interview where you design a large-scale system emphasizing reliability, operational excellence, and scalability. You may design a distributed system architecture, define monitoring and alerting strategy, plan disaster recovery, or design a CI/CD pipeline for reliability. The focus is on thinking holistically about systems, considering failure scenarios, planning for scale, and making well-reasoned trade-offs. You should ask clarifying questions, engage in discussion, and iterate on your design based on feedback.
Tips & Advice
For mid-level, design systems that scale but avoid over-engineering. Start by clarifying requirements and scale assumptions. Draw clear architecture diagrams showing components, communication patterns, and data flow. Always consider reliability: redundancy, failover mechanisms, monitoring, and incident response. Discuss trade-offs openly (consistency vs. availability, latency vs. reliability, simplicity vs. features). Mention specific AWS services where appropriate. Justify your architectural choices and be open to the interviewer's challenges and alternative suggestions. Think about operational aspects: how would you monitor this? How would you deploy changes? What happens when components fail?
Focus Topics
Disaster Recovery, Failover, and Business Continuity Planning
Plan for major failure scenarios: service outages, data center failures, cascading failures, or data corruption. Define Recovery Time Objective (RTO) and Recovery Point Objective (RPO). Discuss backup strategies, replication approaches, and failover procedures. Consider automation for recovery.
Practice Interview
Study Questions
AWS Services for Reliability and Operational Excellence
Incorporate relevant AWS services into your design: RDS or DynamoDB for databases, S3 for storage, CloudWatch for monitoring, ECS/EKS for containers, load balancers, auto-scaling groups, multi-region strategies, and managed disaster recovery services. Show familiarity with AWS operational tools.
Practice Interview
Study Questions
Designing Scalable and Resilient Distributed Systems
Design systems that scale horizontally, handle partial failures gracefully, and maintain availability during failures. Understand load balancing strategies, data replication, caching layers, circuit breakers, retry mechanisms, and graceful degradation patterns. For mid-level, focus on practical, proven patterns rather than experimental approaches.
Practice Interview
Study Questions
Comprehensive Monitoring, Alerting, and Observability Architecture
Design the monitoring strategy: what metrics to collect, log aggregation strategy, distributed tracing for request flows, and alerting thresholds. Discuss how to detect incidents quickly while avoiding alert fatigue. Plan for post-incident analysis and observability of system behavior.
Practice Interview
Study Questions
Defining Service-Level Objectives and Reliability Metrics
In your system design, define meaningful SLOs (e.g., 99.9% availability, P99 latency < 100ms), explain SLIs you'd measure to track these objectives, and discuss how error budgets guide decision-making. Connect reliability metrics to business impact and customer experience.
Practice Interview
Study Questions
AWS & Infrastructure Technical Interview - Onsite
What to Expect
A 60-minute deep technical interview on AWS services, infrastructure management, and operational practices. Expect practical questions about AWS service selection for specific use cases, troubleshooting real infrastructure problems, optimizing databases and compute resources, container orchestration, Infrastructure as Code, and security practices. Scenario-based questions might include troubleshooting RDS performance issues, designing multi-region failover, or securing container images. Expect to draw architecture diagrams and explain trade-offs.
Tips & Advice
Demonstrate deep, practical AWS knowledge grounded in real experience. For each AWS service you mention, be ready to explain your use case reasoning and trade-offs versus alternatives. Draw clear architecture diagrams. When presented with troubleshooting scenarios, follow a systematic approach: gather metrics from CloudWatch, check CloudTrail logs, form hypotheses, and test. Discuss security best practices (encryption, IAM policies, secrets management). Show familiarity with IaC tools and infrastructure versioning. Be ready to discuss performance optimization strategies for databases (indexing, query analysis, read replicas) and compute (right-sizing, reserved instances, auto-scaling policies).
Focus Topics
Infrastructure as Code and Configuration Management
Practical experience with Terraform or CloudFormation for infrastructure provisioning and management. Version control for infrastructure, testing infrastructure changes, managing state files, handling secrets, and rollback strategies. Understanding of IaC best practices and how to prevent configuration drift.
Practice Interview
Study Questions
Database Performance, Scaling, and Reliability
Database scaling strategies including read replicas, sharding, partitioning, and multi-region replication. Performance tuning (indexing, query optimization, connection pooling). Backup and recovery strategies, point-in-time restore capabilities, and RPO/RTO planning. Both relational (RDS/Aurora) and NoSQL (DynamoDB) approaches.
Practice Interview
Study Questions
Container Orchestration (ECS/EKS) and Containerized Deployments
Practical experience with containerized deployments using ECS or EKS, including deployment strategies, auto-scaling policies, health checks, rolling updates, rollback procedures, and container monitoring. Understanding of Docker fundamentals, container networking, and Kubernetes concepts if applicable.
Practice Interview
Study Questions
Troubleshooting AWS Infrastructure Issues
Practical troubleshooting of common AWS problems: RDS high CPU or I/O issues (using Performance Insights), EC2 connectivity failures, EKS cluster issues (pod failures, resource contention), load balancer misconfiguration, and networking problems (security groups, NACLs, routing). Use CloudWatch metrics, CloudTrail logs, and AWS-specific tools systematically.
Practice Interview
Study Questions
AWS Service Architecture and Selection Decisions
Deep knowledge of AWS services relevant to SRE: RDS (including Aurora, performance insights), DynamoDB, S3, EC2, ECS, EKS, Lambda, CloudWatch, CloudTrail, VPC, networking (load balancers, NAT gateways), and managed services. Understand when to use each service, trade-offs (e.g., RDS vs. DynamoDB, EC2 vs. ECS vs. EKS), cost implications, and operational characteristics.
Practice Interview
Study Questions
Operational Excellence & Incident Management - Onsite
What to Expect
A 60-minute interview focused on your operational mindset, real-world incident response experience, and how you drive reliability improvements. You'll discuss specific incidents you've handled (diagnosis, response, resolution, and learning), your approach to post-incident reviews and blameless culture, how you use error budgets to balance development velocity with reliability work, and your strategies for automating operational toil. Expect behavioral questions grounded in operational scenarios that reveal your judgment and leadership.
Tips & Advice
Use the STAR method (Situation, Task, Action, Result) for all examples. Focus on incidents where you took meaningful ownership, systematically debugged the problem, and drove improvements afterward. Discuss your understanding of blameless culture and how you approach post-mortems without blame or finger-pointing. Give quantifiable results when possible (reduced MTTR by 60%, automated manual process affecting 20 incidents per year, etc.). Demonstrate your continuous improvement mindset and how you've grown from failures. Show your reasoning about prioritizing reliability vs. feature development using error budgets. Be humble about knowledge gaps but confident in your ability and willingness to learn.
Focus Topics
Cross-Team Collaboration and Influencing Development Teams
Discuss how you partner with development teams to improve reliability. Share examples of educating developers about SRE practices, advocating for reliability improvements, or collaborating to resolve conflicts between velocity and reliability. Demonstrate your communication and influence skills.
Practice Interview
Study Questions
Identifying and Automating Operational Toil
Describe your approach to identifying repetitive, manual operational work (toil) and systematically automating it. Share examples of significant automation projects you've owned: what problem they solved, how much time they saved, and how that freed you to focus on higher-impact work.
Practice Interview
Study Questions
Error Budgets and Prioritization of Reliability Work
Discuss how error budgets guide prioritization between reliability improvements and new features. Give specific examples of times you've advocated for reliability investments, communicated their necessity to development teams or management, and influenced resource allocation decisions.
Practice Interview
Study Questions
Blameless Culture and Post-Incident Reviews
Explain your understanding of why blameless culture matters and how it drives organizational learning. Discuss your approach to conducting post-incident reviews focused on systemic issues, not individual blame. Share examples of insights gained from post-mortems and how they led to systemic improvements.
Practice Interview
Study Questions
Real Incident Response and Crisis Management
Walk through a significant production incident you personally handled: what failed, how you diagnosed it, actions you took under pressure, how quickly you restored service, and what you learned. Be specific and honest about challenges and mistakes. For mid-level, focus on incidents where you led or made key contributions to resolution.
Practice Interview
Study Questions
Behavioral & Amazon Leadership Principles - Onsite
What to Expect
A 60-minute behavioral interview with an Amazon manager or senior leader assessing cultural fit and alignment with Amazon Leadership Principles. You'll be asked about your problem-solving approach, collaboration style, learning mindset, ownership philosophy, and customer focus. Expect questions like 'Tell me about a time you failed and what you learned' or 'Describe a situation where you had to influence someone without direct authority.' The interviewer evaluates evidence of Amazon Leadership Principles including Customer Obsession, Ownership, Invent and Simplify, Are Right, A Lot, Learn and Be Curious, Think Big, and others.
Tips & Advice
Research and deeply internalize Amazon's Leadership Principles before the interview. Weave concrete examples demonstrating these principles throughout your responses. Use the STAR method for all behavioral questions. Focus on specific, quantifiable outcomes and business impact. Be genuine and authentic - Amazon values sincerity over polish. Show your customer-centric thinking by connecting reliability improvements to customer experience and business outcomes. Demonstrate ownership by describing problems you've owned end-to-end, even across team boundaries. Ask thoughtful questions about team structure, current challenges, and opportunities to grow. Be prepared to discuss long-term career goals and how the role aligns with them.
Focus Topics
Amazon Leadership Principle: Invent and Simplify
Your approach to finding creative solutions while keeping them simple and elegant. Share examples where you've challenged the status quo, questioned why something is done a certain way, found simpler approaches to complex problems, or invented novel solutions to operational challenges.
Practice Interview
Study Questions
Amazon Leadership Principle: Earn Trust
How you build and maintain trust within teams through reliability, communication, transparency, and listening. Share examples of strong relationships you've built across teams, situations where you've demonstrated integrity, and how you handle mistakes.
Practice Interview
Study Questions
Amazon Leadership Principle: Customer Obsession
How you prioritize customer impact in technical and operational decisions. For SRE, demonstrate how you connect reliability improvements to customer experience. Share examples of times you've deeply considered customer impact, advocated for reliability improvements because of customer benefit, or made trade-offs with customer value as the primary consideration.
Practice Interview
Study Questions
Amazon Leadership Principle: Ownership
Your approach to ownership: taking responsibility for outcomes regardless of setbacks, thinking long-term rather than short-term, acting on behalf of the business without being asked. Share examples where you've owned problems end-to-end, acted beyond your initial scope, stepped up when needed, and took responsibility for both successes and failures.
Practice Interview
Study Questions
Amazon Leadership Principle: Learn and Be Curious
Your commitment to continuous learning and intellectual curiosity. Discuss new technologies or practices you've learned, how you stay current in your field, and how you've taught others. Share examples of times you admitted knowledge gaps, asked for help, or sought feedback to improve.
Practice Interview
Study Questions
Frequently Asked Site Reliability Engineer (SRE) Interview Questions
Describe operational uses for VPC Flow Logs. Explain how you'd configure destinations (CloudWatch Logs vs S3), sampling vs full logs, retention policies, parsing challenges, and integration with SIEM or analytics pipelines for use cases like security detections and cost analysis.
Sample Answer
Direct answer
Treat Flow Logs as an operational data pipeline you have to design, not a checkbox you enable once: pick a destination that matches how you'll actually query the data, decide up front whether you need every flow or a representative slice, set a retention policy that matches your compliance and cost tolerance, and plan for the parsing effort before the first incident forces you to do it under pressure.
Structured elaboration
Destinations: CloudWatch Logs versus S3. CloudWatch Logs is the right choice when you need near-real-time metric filters and alarms (for example, alerting the moment REJECT records spike on a sensitive subnet), because CloudWatch Logs Insights can query recent data with low latency and integrate directly with CloudWatch Alarms. Amazon S3 (Simple Storage Service) is the right choice for high-volume, long-retention, or batch-analytical use, because it's dramatically cheaper per gigabyte at scale and pairs naturally with Amazon Athena for SQL-style ad hoc querying or with a SIEM (Security Information and Event Management) ingestion pipeline. Many mature setups use both: a short CloudWatch Logs retention window for live alerting, with the same logs (or the S3-destined copy) retained far longer in S3 for forensics and compliance.
Sampling versus full logs. Full logging (every flow, every network interface) gives complete visibility but generates real volume, especially in a busy production VPC (Virtual Private Cloud), translating directly into ingestion and storage cost. A narrower approach, logging REJECT-only traffic, or only specific subnets carrying sensitive workloads, cuts cost significantly while preserving the highest-value signal (most day-to-day debugging and security monitoring cares more about what got blocked than about the sea of normal ACCEPT traffic), at the cost of losing full traffic-volume visibility for cost or capacity-planning use cases that specifically need the ACCEPT records too.
Retention policies. Set retention deliberately at both layers: the CloudWatch Logs group's retention setting (which otherwise defaults to "never expire" and silently grows forever) and the S3 bucket's lifecycle policy (transitioning older data to cheaper storage classes, or expiring it, on a schedule matched to your actual compliance requirement, commonly 90 days to a year for general operational use and longer for regulated environments).
Parsing challenges. The default record format is a whitespace-delimited flat string, not JSON, which means most ingestion pipelines need an explicit parser or a custom log format with fields you've pre-selected; get the field order and format right at flow-log creation time, because you cannot change an existing flow log's format after the fact, only delete it and create a new one, which loses continuity in your historical data.
Integration with SIEM and analytics pipelines. Streaming through Amazon Data Firehose into a SIEM lets security teams correlate network flow data with other signals (authentication logs, application logs) in one place, which is where flow logs earn their keep for detections like lateral movement (an internal host suddenly talking to hosts it's never talked to before) or data exfiltration (an unusual, sustained high-byte-count flow to an external destination). For cost analysis, the same data, queried via Athena against the S3 destination, lets you attribute cross-AZ or NAT gateway data-processing charges to the specific flows generating them, which billing data alone cannot do.
Worked example
A security team wants to detect a specific pattern: an internal host suddenly initiating outbound connections to a large number of distinct external IPs in a short window, a common exfiltration or scanning signature. They configure flow logs on the relevant VPCs to stream to Data Firehose into their SIEM, with a custom format that includes pkt-dstaddr in addition to the version-2 default fields (needed because the destination might be behind a NAT gateway, whose flow log entry shows the NAT's own address in the standard dstaddr field rather than the packet's true destination). The SIEM rule counts distinct dstaddr values per srcaddr per 5-minute window and alerts above a threshold; the same underlying data, retained in S3 for a year under a lifecycle policy, later gets queried through Athena during a retrospective audit to confirm no prior instance of the same pattern had been missed.
Trade-offs and pitfalls
Enabling full logging everywhere without a sampling or scoping decision is the most common way this gets expensive fast, particularly in a high-throughput production VPC. The second common mistake is choosing a destination based on what's easiest to set up rather than how the data will actually be used, landing everything in CloudWatch Logs and only later discovering that months of forensic data are prohibitively costly to store there long-term compared to S3. Finally, remember that a flow log's format is fixed at creation, so retrofitting a needed field (like pkt-dstaddr for NAT gateway visibility) means starting a new flow log going forward, not recovering the field from history you already collected.
What's the difference between declarative and imperative infrastructure automation, and where does a tool like Terraform sit? Walk through a scenario where you'd deliberately reach for the imperative style instead.
Sample Answer
Declarative infrastructure automation means you describe the desired end state and the tool computes the steps to get there; imperative automation means you specify the exact ordered steps yourself and the tool just executes them. Terraform sits firmly on the declarative side: you write HCL describing the resources you want, and terraform plan/apply diff that against the current state and work out the create, update, or destroy operations needed. Reaching for imperative is still the right call for genuinely one-off, ordered, side-effecting operations, like a database master-credential rotation, where forcing the sequence into a declarative resource graph adds complexity without buying you anything.
Core distinction
| Aspect | Declarative | Imperative |
|---|---|---|
| What you specify | Desired end state | Exact steps to execute |
| Who computes the diff | The tool, by comparing state to config | You, by hand |
| Idempotency | Built in by design, from the state comparison | Must be coded deliberately, check-then-act |
| State tracking | Explicit, a state file or provider API | Usually none, the script just runs |
| Typical tools | Terraform, CloudFormation, Kubernetes manifests | Shell scripts, ad hoc cloud CLI automation, most Ansible task usage |
Idempotency and state, briefly
Idempotency is what makes repeated runs safe: running the same declarative config twice produces the same result the second time, a no-op plan, because the tool diffs desired state against tracked current state before acting. An imperative script has no such guarantee unless you write the check yourself, for example testing whether a file already contains a line before appending it.
A short side-by-side
Declarative (desired state):
resource "aws_iam_user" "svc" {
name = "svc-payments"
}
Imperative (ordered steps, pseudo-code):
if user "svc-payments" does not exist:
create user "svc-payments"
The declarative version says nothing about "if it doesn't exist"; that check is implicit in how the tool reconciles state. The imperative version has to spell it out, or it isn't idempotent.
When to deliberately reach for imperative
Rotating a database master password is a good example: create the new user, migrate application connections over, verify, then drop the old user. That's an inherently ordered, stateful sequence with a verification step in the middle, not "resources that should exist." Modeling it as declarative resources with dependency ordering either fights the tool or hides the verification step it can't express. A short imperative script, used sparingly, is more honest about what's actually happening, while the infrastructure around it (the user that should exist afterward) can still stay declarative.
Trade-offs & pitfalls
For an SRE on call, the split matters most for rollback. Reverting a declarative change is "revert the config, re-apply," which is auditable and repeatable under pressure. An imperative fix made live during an incident, a console edit or an ad hoc script, is faster to execute in the moment but leaves no record the declarative tool knows about, so it either gets back-ported into code afterward or becomes drift the next plan will flag. Treat imperative break-glass actions as debt to reconcile, not as the steady state. Loosely, the properties most IaC systems care about are a desired-state description, idempotent operations, version-controlled definitions, and repeatability across environments; declarative tooling gets you most of those for free, imperative tooling needs deliberate discipline to earn the same guarantees.
You need an RDS backup and restore plan for a multi-terabyte database with a one-hour recovery-time target. Walk through automated vs manual snapshots, point-in-time recovery, cross-region snapshot copy, and how you'd cut restore time to hit that target.
Sample Answer
Direct answer
For a multi-terabyte database with a one-hour recovery-time target, the fastest realistic path is promoting an already-running, already-caught-up read replica, not restoring from a snapshot: RDS snapshot restores create a new instance whose storage is lazily loaded from S3 in the background, so a large database becomes usable almost immediately but runs with degraded I/O on not-yet-loaded data until that background hydration finishes, which is very hard to bound to under an hour for a multi-terabyte volume. Layer automated backups with point-in-time recovery (PITR) for the "restore to any second" requirement, manual snapshots before risky changes, and cross-region snapshot copy plus a warm cross-region read replica for the disaster-recovery leg, with promotion of that replica as the actual one-hour recovery mechanism.
Structured elaboration
The building blocks
- Automated backups plus PITR: RDS takes a daily storage snapshot and continuously captures transaction logs, letting you restore to any point within the retention window, up to 35 days, not just to a snapshot boundary. This is your "restore to right before the bad deploy" tool, not your one-hour RTO (recovery time objective, the maximum time allowed to restore service after a failure) tool by itself, since restoring still means creating a new instance from that point.
- Manual snapshots: user-triggered, retained until you delete them, useful immediately before a risky schema change or deployment as a known-good rollback point.
- Cross-region snapshot copy: automates copying snapshots to a DR region on a schedule; this protects against a regional event, but a snapshot restore is still a new-instance-plus-lazy-load operation, the same restore-time problem as above, just in a different region.
- Read replica promotion: a replica that has been continuously replicating is, by definition, already restored; promotion just repoints the endpoint and stops replication. This is the only one of these mechanisms whose recovery time does not scale with database size, which is exactly what a multi-terabyte, one-hour RTO needs.
Why snapshot restore struggles to hit a one-hour RTO at multi-terabyte scale
When you restore an RDS DB instance from a snapshot, the new instance becomes available and usable right away, but RDS documents this as lazy loading: data not yet pulled from the snapshot's backing storage is fetched on first access, with the rest loading in the background. For a multi-terabyte database, that background load can run well past an hour, and any query touching not-yet-loaded pages pays a real-time fetch penalty in the meantime. The documented mitigation is to force the load explicitly, running full-table-scan operations against your critical tables right after restore to pull their data down before real traffic depends on it, rather than assuming "available" means "fully warm."
Recommended design for a one-hour RTO
- Multi-AZ primary with automated backups (PITR) enabled.
- At least one same-region read replica kept caught up; promote this first for anything short of a full regional outage, this is normally minutes, not the full hour budget.
- A warm cross-region read replica for actual DR, continuously replicating, monitored for replication lag; promote this if the primary region is unavailable.
- Hourly, or tighter depending on RPO (recovery point objective, the maximum data loss you can tolerate, measured as time since the last recoverable point) tolerance, cross-region snapshot copy as a second line of defense, for scenarios where even the warm replica is unusable, for example if replication had already broken before the incident.
- Automated, tested runbooks, not manual click-through, for promotion, since a one-hour clock includes detection and decision time, not just the technical promotion step.
- Before cutting over, the runbook must pin the correct private subnet group and security group for the restored or promoted instance and re-verify that IAM database authentication is turned back on: restoring or recreating a DB instance re-applies the default VPC, subnet group, and security group unless you explicitly specify otherwise, so a DR event is exactly the wrong moment to discover the replacement instance landed in the wrong subnet or lost IAM authentication.
- Quarterly, or more frequent, DR drills that actually promote a replica or restore a snapshot end-to-end and measure the real elapsed time and cost of that exercise, rather than trusting the design on paper.
Worked example
Say a 4 TB primary has one same-region read replica, typically promotable in minutes since it is already caught up, and one cross-region read replica with an observed replication lag averaging 30 seconds. If the primary region has a full outage, promoting the cross-region replica means accepting up to roughly that lag window of data loss, an RPO consideration, not RTO, and a promotion operation that, unlike a snapshot restore, does not scale with the 4 TB size, because the replica already holds the data, it just stops replicating and starts accepting writes. That is the concrete reason the design leads with replica promotion instead of restoring the cross-region snapshot: a snapshot restore of a fresh 4 TB volume, with its lazy-loading warm-up, is the mechanism most likely to blow through a one-hour budget, not the one most likely to meet it.
Trade-offs and pitfalls
- A warm cross-region replica costs real money around the clock to be ready in under an hour; if your actual RTO tolerance is looser, say four to eight hours, cross-region snapshot copy without a standing replica is materially cheaper and may be the right trade.
- Do not assume "snapshot restored, status available" means the database is at full performance; run explicit warm-up queries, or better, avoid depending on snapshot restore as the primary RTO mechanism at multi-terabyte scale in the first place.
- Replica promotion accepts some data loss bounded by replication lag; if the requirement is genuinely zero data loss, that pushes you toward synchronous Multi-AZ within a region rather than asynchronous cross-region replication, and reshapes what disaster scenarios you can actually protect against.
- DR drills that only test the happy path, a clean promotion with nothing else going wrong, do not validate the harder case where the replica itself has silently fallen behind or broken before the incident, or where the restored instance's subnet, security group, or IAM authentication settings were not re-verified; drill the fallback path too, not just the primary one.
Your service has burned through its error budget for the month, and product leadership wants to ship a risky new feature tomorrow anyway. How do you handle the pressure to make an exception to the error-budget policy, and how do you explain your decision to both leadership and your own team?
Sample Answer
Direct answer
An error budget is the amount of allowed unreliability within a service's SLO (service-level objective, the target for how reliably a service should perform) before the standard practice is to pause risky changes. I would not treat "we already blew the budget" as a reason to blow it further, but I also would not treat the policy as an excuse to give leadership a flat no. I would quantify the actual incremental risk of shipping and offer a scoped path that does not compound the exposure.
Structured elaboration
- Get precise about the number: how far over budget are we, what is the current error-rate trend, is it recovering.
- Quantify the incremental risk of the new feature specifically, not the budget breach as a whole: what does it touch, has it been through the same testing as everything else that is on the freeze.
- Bring options, not only a veto: ship behind a flag to a small percentage of traffic, ship with a rollback path already prepared, or ship after a short reliability push that brings the budget back to healthy.
- If leadership overrules and wants a full rollout anyway, get that decision and its owner in writing, and treat it explicitly as a named, accepted risk exception, not a quiet policy override.
- With your own team, be transparent about whether the policy held or was overridden, and why, so it does not look arbitrary either way.
Worked example
Say the service has an SLO of 99.9 percent monthly availability, which allows roughly 43 minutes of downtime a month, and the team has used all of it by the 20th day. Leadership wants to ship a new checkout flow tomorrow. Instead of a flat refusal, I would propose shipping to 5 percent of traffic behind a flag with automatic rollback on an error-rate spike, which gives leadership real production signal tomorrow without risking the whole customer base. I would frame it to leadership as: full rollout waits until the budget resets or recovers, but you get a validated data point right away. I would tell the team that the freeze policy stands for full rollout, and that this is a bounded exception with a rollback trigger already defined, not a precedent.
Trade-offs and pitfalls
The pitfall is treating the error budget as a rule to defend for its own sake rather than a proxy for actual user harm: a low-risk, flagged rollout is a different risk profile than a full release, and a rigid no without that distinction reads as bureaucratic. The opposite pitfall is caving to pressure and letting exceptions become routine, which erodes the whole practice, since each exception makes the next one easier to ask for.
Explain the difference between a symptom, a root cause, and a contributing factor, and between a proximate cause and a systemic cause. Walk through a concrete incident and classify each of these for it.
Sample Answer
Direct answer
A symptom is the observable effect users or dashboards notice, such as elevated error rates. A root cause is the underlying condition that, if it had been different, the incident would not have happened. A contributing factor made the incident more likely, larger, or slower to resolve, but would not by itself have caused it. Root cause and contributing factors are also sometimes described as systemic versus proximate: the proximate cause is the immediate trigger right before the failure, while the systemic cause is the deeper condition that made that trigger dangerous in the first place.
Structured elaboration
These distinctions matter because they point to different fixes. Fixing a symptom (restarting a crashed process) restores service but changes nothing about recurrence. Fixing the root cause prevents the class of failure from happening again. Fixing only a contributing factor reduces the odds or blast radius without eliminating the underlying risk.
A practical way to separate them: ask 'if I undo only this one thing, does the incident still happen?' If removing it would have prevented the incident outright, it's a strong candidate for root cause. If removing it would have made the incident smaller, shorter, or less likely, but the incident could still have happened some other way, it's a contributing factor. Multiple contributing factors lining up is far more common in real incidents than a single clean root cause, which is exactly why a rigid, single-cause framing (like a naive application of Five Whys) can mislead you into stopping the investigation too early.
Worked example
An e-commerce checkout service goes down for two hours. Symptom: checkout returns 500 errors and cart-abandonment spikes. Proximate cause: a database connection pool exhausted because a recently deployed feature opened a connection per request without releasing it. Systemic (root) cause: the codebase has no linting or code-review checklist item that catches unreleased database connections, so this class of bug can ship again in a different service tomorrow. Contributing factors: (1) the connection pool's exhaustion alert had a threshold set so high it fired only after service was already degraded, delaying detection by 20 minutes; (2) the on-call engineer was unfamiliar with this particular service's connection-pooling library, adding another 10 minutes to diagnosis. None of the contributing factors alone caused the outage, and even a perfectly-set alert would not have prevented the leak, but each one made the incident worse or longer, and each deserves its own action item.
Trade-offs and pitfalls
The most common mistake is treating the first plausible-sounding cause as THE root cause and closing the investigation, especially under time pressure to produce a tidy narrative. A second is conflating 'the last thing that changed before the incident' (the trigger) with the systemic cause: the trigger is often just the first domino, and stopping there produces a fix that only prevents that exact trigger, not the underlying fragility.
A cross-functional project you're on has a standing weekly meeting, but people are saying the meetings are unproductive and decisions keep stalling. What would you change?
Sample Answer
Direct answer
First diagnose why the meeting is stalling: usually it's because status-sharing and decision-making are mixed together, and no one is clearly accountable for closing a decision when people disagree. The fix separates the two (status moves async, meeting time is reserved for decisions), names a decision owner per topic, and tracks decisions in writing so they don't get relitigated the next week.
How to redesign it
Step 1: diagnose before redesigning. Ask whether people are status-updating instead of deciding, whether it's unclear whose call something is, or whether decisions do get made but aren't tracked so they resurface. Each cause has a different fix.
Step 2: separate status from decisions.
| Before | After |
|---|---|
| Round-robin status updates eat most of the meeting | Status posted async in a short template before the meeting |
| Decisions surface late, with little time left | Meeting time is reserved for items flagged as needing a live decision |
| Unclear who has the final call | Each agenda item has a named decision owner |
Step 3: track decisions so they don't restall. Keep a lightweight decision log: what was decided, who owns it, and the date. If an item can't close live, name a follow-up owner and a deadline instead of letting it silently carry over.
Step 4: reconsider the cadence. If most items now resolve async, a lower-frequency decision meeting paired with a written weekly status may serve the group better than a fixed weekly sync for everything.
Worked example
Situation: a cross-functional project with design, engineering, and data has a standing 60-minute weekly sync. Status updates take up 45 minutes, decisions surface in the last 15, and things 'decided' in the room get revisited the following week.
Action: introduced a pre-read posted 24 hours ahead covering status and any open decisions that need a live call; restructured the meeting to skip status entirely and spend the full time on flagged decisions, each with a named owner; started a shared decision log so a closed decision has a record to point back to.
Result: the meeting shortened from 60 to 30 minutes because status moved out of the room, and decisions stopped resurfacing because there was now a written record of what was actually agreed and by whom.
Trade-offs and pitfalls
- Cutting the meeting without giving people another outlet just moves the stalling into chat threads. Live time is still needed for genuine disagreement, don't eliminate it entirely.
- Naming a decision owner can feel like taking authority away from the group. Frame it as who is accountable if the call turns out wrong, not as a power grab.
- Async pre-reads fail without a light enforcement habit. If nobody protects the norm, it quietly reverts to status-in-the-room within a few weeks.
- Adding a decision log and a template is itself process. If it isn't paired with removing something (like the status round-robin), it just adds overhead on top of the original problem.
A customer runs a monolithic Java application on VMs with local disk and wants to move to Kubernetes. Propose a migration plan that minimizes downtime: containerization approach, handling local disk state, session management, database migration strategies, incremental rollout (strangler pattern), and rollback strategy. Identify primary risks and mitigation steps.
Sample Answer
The core risk in this migration is not containerization itself, it is state: a monolith on VMs with local disk and in-process sessions has state living in three places, local disk, in-memory sessions, and the database, that Kubernetes' pod model does not preserve across restarts, rescheduling, or rolling updates. The plan externalizes each of those in turn, in order of risk, before extracting pieces of the monolith into separate services with the strangler pattern, so the system never depends on a single big-bang cutover.
1. Containerize the monolith as-is first
Build an image for the existing Java monolith with externalized configuration (environment variables, ConfigMaps and Secrets instead of files baked into the VM), add liveness and readiness probes so Kubernetes can tell a hung JVM (the Java Virtual Machine, the runtime the monolith executes in) from a healthy one, and handle SIGTERM correctly (the termination signal Kubernetes sends a container before killing it): drain in-flight requests before exit, matching the JVM's shutdown hook to Kubernetes' terminationGracePeriodSeconds so a rolling update does not drop in-flight traffic. Get this version running and stable on Kubernetes before touching architecture.
2. Externalize local disk state
Kubernetes pods are ephemeral and can be rescheduled to a different node at any time, so anything the monolith wrote to local disk and expected to still be there tomorrow has to move:
- Transient, pod-lifetime-only files: an EmptyDir volume, deleted with the pod, is fine.
- Durable files the application actually needs to persist: a networked or object store. Blob-shaped data (uploads, reports) moves to an object store; anything requiring POSIX file semantics moves to a ReadWriteMany-capable networked filesystem.
- Migrate existing files with a one-time copy job, verify with checksums, and cut reads and writes over behind a feature flag so a bad migration can be reverted without a second migration.
3. Externalize session state
The same ephemeral-pod problem applies to in-process HTTP sessions: a session held only in the JVM's memory on one pod disappears the moment that pod is rescheduled, evicted, or replaced during a rolling update, which shows up to a user as an unexplained logout. The fix at the workload-design level is to externalize sessions to an external store, Redis is the common choice, so any pod can serve any request. Routing a user's requests back to the same pod is a different, ingress-layer session-affinity technique with its own trade-offs; it does not solve the underlying problem that a rescheduled pod still loses in-process state, so it is not a substitute for externalizing it.
4. Database migration strategy
Move the database carefully, since it is both the hardest state to externalize and the one most likely to be gotten wrong:
- Add logical replication (change-data-capture tooling such as Debezium, or the database's native replication) from the source to the target so the target stays current while the application still writes to the source.
- Use the expand-contract pattern for schema changes so old and new code can both run correctly during the transition: expand (add new columns or tables without touching old ones), migrate and backfill data, dual-write or dual-read as needed, then only after the new code path is validated in production, contract (stop writing the old shape, then drop it).
- Cut writes over in a single, short, controlled window once replication lag is at or near zero and read paths have already been validated against the target; keep the source writable-but-idle for a defined rollback window before decommissioning it.
5. Incremental rollout: the strangler pattern
Rather than extracting everything at once, put a facade, typically at the ingress layer, in front of the monolith that can route specific paths to a newly extracted service while everything else still goes to the monolith unchanged. Extract modules with low fan-in first, not the highest-traffic module first, because fan-in (how many other parts of the system call into a module) is what determines how much of the system breaks if the extraction has a bug, independent of how much traffic the module carries.
Worked example: choosing extraction order
Say three candidate modules have the following measured properties:
| Module | Downstream callers (fan-in) | Share of total request volume |
|---|---|---|
| Auth | 2 | 15% |
| Reporting | 1 | 5% |
| Checkout | 10 | 40% |
Using a simple priority heuristic of request share divided by fan-in, favoring modules that matter but are not deeply entangled:
Auth: 215=7.5
Reporting: 15=5
Checkout: 1040=4
Auth extracts first (highest score), Reporting second, and Checkout last, despite carrying the most traffic, because its fan-in of 10 means a bug in the extraction has ten times the blast radius of Reporting's. This is the general shape of the reasoning a strangler-pattern plan should show, not a fixed formula: traffic volume alone is the wrong axis to sequence on.
6. Rollback strategy
Rollback needs to work at three independent layers, because a single "revert" button does not exist across all of them:
- Code: Kubernetes Deployments keep revision history, so
kubectl rollout undoreverts to the previous ReplicaSet; tunemaxSurgeandmaxUnavailableso a bad rollout is caught by readiness probes before it receives significant traffic. - Data: because schema changes were expand-contract, the previous code version still works against the current schema right up until the contract step, so a code rollback does not also force an emergency schema rollback.
- Extracted services: keep the facade able to route a given path back to the monolith if the newly extracted service misbehaves, for as long as the monolith still contains that functionality; do not delete monolith code paths the moment a service is extracted, retire them on a delay after the extraction is proven.
Primary risks and mitigations
| Risk | Mitigation |
|---|---|
| Data loss during file migration to object storage | Checksummed copy, dual-read validation window, retained backups before cutover |
| Replication lag causing stale reads on the target database | Monitor lag explicitly; do not cut writes over until lag is at or near zero for a sustained period |
| Session loss appearing as random logouts | Externalize sessions before the first production rollout, not after |
| A rolling update drops in-flight requests | Correct SIGTERM handling plus readiness-gated rollout parameters |
| Extracted-service bug with a large blast radius | Sequence extraction by fan-in, not traffic share; keep the facade able to route back to the monolith |
Given a Prometheus histogram metric http_request_duration_seconds_bucket{job='api',route='/checkout',le='0.2'}, write PromQL expressions to compute (a) the fraction of requests under 200ms over the last 5 minutes, and (b) an approximation of p95 latency over the last 1 hour. Explain limitations of your queries.
Sample Answer
Prometheus histograms let you compute both a fraction-under-threshold metric and a full percentile from the same underlying bucket counters, using two different query patterns.
Structured elaboration
The fraction-under-200ms is simply the rate of the le="0.2" cumulative bucket divided by the rate of the le="+Inf" (total) bucket, since Prometheus histogram buckets are cumulative by construction. An approximate p95, by contrast, uses histogram_quantile, which linearly interpolates within whichever bucket the target quantile falls into; its accuracy is bounded by how many bucket boundaries exist near that quantile; a coarse bucket layout with few boundaries near p95 gives a much rougher estimate than one with several closely-spaced boundaries there.
Worked example (executed; promtool unit test against a real Prometheus binary)
sum(rate(http_request_duration_seconds_bucket{job="api",route="/checkout",le="0.2"}[5m]))
/
sum(rate(http_request_duration_seconds_bucket{job="api",route="/checkout",le="+Inf"}[5m]))
histogram_quantile(0.95,
sum(rate(http_request_duration_seconds_bucket{job="api",route="/checkout"}[1h])) by (le)
)
Run against synthetic cumulative bucket counters (80/95/99/100 cumulative observations at le=0.1/0.2/0.5/+Inf respectively), the fraction-under-200ms query correctly returned 0.95 (95 of 100 total observations fall at or under 200ms), and histogram_quantile returned approximately 0.2 seconds, correctly landing right at the 0.2-second bucket boundary where the 95th percentile actually sits in this synthetic distribution.
Trade-offs and pitfalls
histogram_quantile's accuracy degrades badly if your bucket boundaries are sparse near the quantile you care about; if most of your buckets are clustered below 100ms but your real p95 lives up around 800ms, the interpolation between two far-apart boundaries can be wildly wrong, so bucket boundaries should be chosen with the SLO's target percentile in mind, not just convenient round numbers. Both queries here also aggregate ACROSS all instances of the job via the outer sum(); if you need per-instance visibility (e.g. to find one bad pod dragging down the aggregate), you must keep the instance label in the by () clause instead of summing it away.
Design a set of guardrails, at the instrumentation, ingestion, and query layers, that prevent cardinality explosions before they happen rather than reacting to one after the fact. How would you automatically detect a metric that's about to blow up cardinality, and decide whether to throttle it, reject it, or aggregate it away?
Sample Answer
Guardrails have to exist at all three layers because each one catches a different failure mode. Instrumentation-layer guardrails prevent bad label design from ever shipping; ingestion-layer guardrails catch what slips through in real time before it damages the shared backend; query-layer guardrails contain the blast radius of whatever cardinality already exists.
The three layers
flowchart LR
A[Instrumentation: SDK label schema] --> B[Ingestion: cardinality meter]
B --> C{Growth above threshold?}
C -->|no| D[Accept]
C -->|yes| E{Decision}
E -->|reduce signal value| F[Aggregate away]
E -->|protect budget, keep signal| G[Throttle]
E -->|hard limit exceeded| H[Reject]
D --> I[Query Layer]
F --> I
G --> I
- Instrumentation layer: require a metric schema/template before a new metric name can ship (declared label keys and, ideally, an expected cardinality bound per key); flag or reject at code-review/CI time any label key with an obviously unbounded domain (request IDs, raw user IDs, full URLs with path parameters unreplaced).
- Ingestion layer: maintain a live, low-memory estimate of distinct series per metric/tenant so growth can be detected within minutes, not after the backend already OOMs.
- Query layer: enforce query-time cost limits (max series a single query can touch, regex-predicate cost estimation) so that even cardinality that did get ingested can't be turned into a denial-of-service against shared query compute.
Detecting a metric about to blow up
The right tool is a HyperLogLog (HLL) sketch per metric name (or per metric x tenant), because it estimates distinct-count cardinality in fixed, small memory regardless of how many series actually exist. HLL's standard error and memory cost are both direct functions of its precision parameter $p$, where the sketch has $m = 2^p$ registers:
RSE=m1.04,memory≈86m bytes (6-bit registers)import math
for p in (10, 14):
m = 2 ** p
se = 1.04 / math.sqrt(m)
mem = m * 6 / 8
print(p, m, se, mem)
Result: p=10 gives 1,024 registers, 3.25% standard error, 0.77 KB memory; p=14 gives 16,384 registers, 0.81% standard error, 12.29 KB memory. Running one p=14 sketch per metric name across even 10,000 distinct metric names costs about 123 MB of memory total, cheap enough to keep live for every metric in the system, which is what makes real-time growth detection practical.
With a live baseline and a rolling-window estimate, growth-rate detection is a simple ratio check: if a metric's baseline series count is 5,000 and a 10-minute window shows 500,000, that's a 100x growth ratio against a chosen threshold of, say, 5x, which trips the guardrail well before the metric reaches an operationally dangerous size.
Deciding throttle vs. reject vs. aggregate
| Signal | Action | Why |
|---|---|---|
| Growth is gradual and the metric is below the hard tenant quota | Accept, but flag for the owning team | No immediate risk; early warning is enough |
Growth is caused by one specific label key going unbounded (e.g., request_id added to a previously-bounded metric) | Aggregate away: drop or bucket that one label key, keep the rest of the series | Preserves most of the signal's value; this is usually a mistake, not malice, and the metric is still useful without the offending label |
| Growth is broad-based and close to the tenant's hard quota, but the metric still has legitimate value | Throttle: apply sampling or rate-limit new series admission | Buys time and protects the shared backend without discarding an entire signal outright |
| Growth exceeds a hard ceiling with no clear single offending label | Reject: refuse new series for that metric until the owner fixes it | Protects everyone else sharing the backend; a soft response at this point is not enough |
A useful mechanism for the "which label is the culprit" question: if a metric normally has a bounded combinatorial cardinality (e.g., endpoint × status × pod = 50 × 6 × 500 = 150,000 possible series, computed by multiplying each label's distinct-value count) and observed cardinality is far above that bound, the excess growth is coming from a label outside that expected set, and the ingestion layer can pinpoint it by comparing per-label-key distinct-value growth rates rather than only the aggregate metric-level count.
Trade-offs and pitfalls
- A pure hard-reject policy at the ingestion layer is the easiest to build and the worst for reliability: it turns a labeling mistake in one service into a total metrics outage for that service (including its SLO-relevant metrics), which is why aggregate-away and throttle need to exist as intermediate responses.
- HLL is probabilistic; at low precision (small $p$) the standard error is large enough that near-threshold decisions can flap. Pick $p$ based on how close to the threshold you need confident decisions, not just "the default."
- Guardrails without an audit trail (which decision was applied, to which metric, when) make it impossible to tell a team why their metric got throttled, which erodes trust in the guardrail system and encourages people to route around it (e.g., renaming a metric to dodge a quota).
- The instrumentation-layer guardrail is the cheapest one to enforce and the one most often skipped; catching an unbounded label at CI time costs nothing compared to catching it after it has already damaged the shared backend.
How would you quantify and present the technical risk and business cost of having many microservices with overlapping responsibilities, versus consolidating some of them into fewer services? Describe the metrics you would gather (deployment coordination overhead, on-call load, infra cost per service, cross-service change frequency), any lightweight experiments you might run, and how you would present the trade-off to executives who are not engineers.
Sample Answer
Direct answer
To quantify the cost of too many overlapping-responsibility microservices, measure deployment coordination overhead (how often a single logical change requires touching multiple services in lockstep), on-call and incident load per service, infrastructure cost per service (even a nearly-idle service carries a fixed baseline cost), and cross-service change frequency (how often a change to one service requires a corresponding change to another); present the trend in those numbers to executives rather than an architectural opinion about service count.
Structured elaboration
Deployment coordination overhead is measurable directly: track how many recent releases required coordinating changes across two or more services that, if consolidated, would have been a single deploy, and how much calendar time that coordination added compared to a single-service change. On-call load is measurable from incident data: total pages per service per month, and specifically how many of those incidents were caused by an inter-service contract mismatch (a caller and callee disagreeing about a field's meaning or an API version) rather than a genuine bug in one service's own logic, since contract mismatches are a direct symptom of over-decomposition. Infrastructure cost is measurable from the cloud bill: baseline compute, monitoring, and logging cost per service, multiplied by the number of services that could plausibly be consolidated without losing a real scaling or ownership benefit. Cross-service change frequency is measurable from version-control history: how often a pull request in one service's repo is immediately followed by a corresponding pull request in another service's repo within a short window, a proxy for services that are more tightly coupled in practice than their separate deployability suggests.
Worked example
A lightweight experiment to gather this evidence without a large upfront investment: instrument the deploy pipeline to tag any release that required a coordinated multi-service change, and run that for a month before making a consolidation recommendation, rather than relying on anecdotes about "it feels like everything requires touching three services." Present the finding to executives in business terms: "N% of releases in the last quarter required coordinating three or more services, adding an average of X days to the release; consolidating these two specific services would remove that coordination cost for roughly Y% of those releases," rather than a purely technical argument about service-count aesthetics.
Trade-offs and pitfalls
The risk of presenting this case poorly is framing it as "we have too many microservices" in the abstract, which invites a debate about architectural philosophy instead of a decision grounded in measured cost; naming the SPECIFIC services with the worst coordination and incident numbers, and proposing a targeted consolidation of just those, is both more persuasive and less risky than a broad "let's reduce our service count" initiative. The countervailing risk is consolidating services that look similar on paper but actually have a real, measured difference in scaling or team ownership; the same data-gathering discipline that justifies a consolidation should also be used to rule one out when the signals don't actually support it.
Recommended Additional Resources
- Site Reliability Engineering Book by Google (O'Reilly) - Free online version available
- The Phoenix Project by Gene Kim, Kevin Behr, George Spafford - DevOps culture and principles
- AWS Well-Architected Framework - Reliability Pillar (Free AWS documentation)
- Designing Data-Intensive Applications by Martin Kleppmann - Distributed systems concepts
- AWS Certified Solutions Architect certification study materials
- Linux Academy, A Cloud Guru, Coursera - AWS and Linux systems courses
- Kubernetes Official Documentation - For EKS expertise
- Terraform and CloudFormation documentation - Infrastructure as Code
- Amazon Leadership Principles - Memorize from Amazon careers website
- Gremlin's Chaos Engineering resources and scenarios
- PagerDuty and incident.io documentation - Incident management practices
- Blind, Glassdoor, LeetCode Discuss - Real Amazon SRE interview experiences and questions
Search Results
SRE interview questions and job descriptions - Gremlin
Sample Site Reliability Engineer Interview Questions · What is an SLO? · Follow up: What is an SLA? · What is a linked list? · Name some other data structures.
SRE(Site Reliability Engineer) Interview Questions (2025)
This article covers everything you need to know about becoming a Site Reliability Engineer, also some SRE Interview Questions, and answers
50 Site Reliability Engineer (SRE) Interview Questions 2025
Download the SRE Interview Q&A Guide – 2025 Edition. Master 50+ real questions asked at Google, Netflix, Amazon & Meta. Download Now!
Site Reliability Engineering AWS Interview Questions | MindMajix
Are you preparing for a Site Reliability Engineering (SRE) interview with AWS skills? This video covers AWS SRE interview questions and ...
Top 50 AWS Interview Questions and Answers For 2025 - DataCamp
A complete guide to exploring the basic, intermediate, and advanced AWS interview questions, along with questions based on real-world situations.
Real SRE (Site Reliability Engineer) Interview Questions & Answers ...
Q1. How would you deploy an application to AWS? · Q2. What measures have you taken to secure your EKS clusters? · Q3. What is the toughest ...
Site Reliability Engineer (SRE) Interview Preparation Guide - GitHub
A collection of questions to practice with for SRE interviews · SRE Interview Questions · Sysadmin Test Questions · Kubernetes job interview questions · DevOps ...
Commonly Asked Amazon Interview Questions
Master Amazon interview questions with answers to technical and behavioral questions and learn the top tips to ace the interviews at Amazon.
This interview preparation guide was generated using AI-powered research from the sources listed above. While we strive for accuracy, we recommend verifying critical information from official company sources.
Want to create your own tailored preparation guide using our deep research?
Get Started for FreeInterview-Ready Courses
Visual-first, interactive, structured learning paths
Browse Site Reliability Engineer (SRE) jobs
AI-enriched listings across hundreds of company career pages
Explore Jobs