{"id":1167,"date":"2026-03-31T10:00:00","date_gmt":"2026-03-31T09:00:00","guid":{"rendered":"https:\/\/wade.one\/blog\/?p=1167"},"modified":"2026-03-31T10:00:00","modified_gmt":"2026-03-31T09:00:00","slug":"serverless-is-great-until-you-need-to-debug-it-at-2-a-m","status":"publish","type":"post","link":"https:\/\/wade.one\/blog\/2026\/03\/31\/serverless-is-great-until-you-need-to-debug-it-at-2-a-m\/","title":{"rendered":"Serverless Is Great Until You Need to Debug It at 2 a.m."},"content":{"rendered":"<p>I still like serverless. I use it because it keeps a lot of infrastructure out of the way, and for the right kind of team that is a real advantage.<\/p>\n<p>But serverless has a sharp edge that people gloss over when they are selling the idea or drawing the architecture diagram. It is easy to build something that looks clean and feels fast to ship. It is much less fun when a production issue lands at 2 a.m. and you need to figure out where the failure actually happened.<\/p>\n<p>That is usually where the architecture stops being abstract.<\/p>\n<h2>The happy path is not the real problem<\/h2>\n<p>On a good day, serverless is excellent.<\/p>\n<p>You deploy a function, wire it to an event, and let managed services do the boring work. Scaling is handled. Capacity planning gets smaller. You do not spend much time thinking about servers, patches, or idle time. For small teams, that is a good trade.<\/p>\n<p>The problem is not the happy path. The problem is everything around it.<\/p>\n<p>When something fails in a serverless system, the failure is often spread across too many places. Maybe the API call succeeded but the downstream Lambda timed out. Maybe the queue has retries and dead letters. Maybe the log entry you want is in a different service, a different account, or a different region. Maybe the real issue is not even in the function you are staring at. It is in the event shape, the permission boundary, or the assumption that some other service would always behave.<\/p>\n<p>That is when &#8220;simple&#8221; starts to look less simple.<\/p>\n<h2>Debugging needs context, not just code<\/h2>\n<p>The big lesson for me is that debugging serverless is mostly a context problem.<\/p>\n<p>If you cannot trace a request from edge to backend to storage to retry queue, you are going to waste time. If your logs are too sparse, too noisy, or too disconnected, you will end up guessing. And guessing at 2 a.m. is a bad way to run production.<\/p>\n<p>I have found that the boring stuff matters more than people expect:<\/p>\n<ul>\n<li>structured logs with a request id that actually follows the work<\/li>\n<li>enough metrics to see failure patterns before somebody opens a ticket<\/li>\n<li>clear alarms on the right failure modes, not just &#8220;something is red&#8221;<\/li>\n<li>dead-letter queues that are treated as real operational surfaces<\/li>\n<li>explicit timeouts and retry behavior, not defaults you never revisited<\/li>\n<\/ul>\n<p>None of that is glamorous. All of it is useful.<\/p>\n<h2>Serverless still wins for a lot of teams<\/h2>\n<p>I am not arguing against serverless. I am arguing against pretending it removes operational responsibility.<\/p>\n<p>For small teams, serverless is often still the right choice because it lowers the amount of infrastructure you need to own directly. That matters. It is often the difference between shipping and getting stuck in platform work that nobody really wanted.<\/p>\n<p>What I would say is this: choose serverless because you want less undifferentiated work, not because you want less thinking.<\/p>\n<p>If the system has important workflows, payment paths, messaging, or anything that needs reliable recovery, you still need to design for failure. You still need to know where the state lives. You still need to understand how retries behave. You still need to make the debugging path obvious enough that a tired person can follow it.<\/p>\n<p>That is the part that gets missed when people describe serverless as if it were magically simpler.<\/p>\n<h2>My practical rule<\/h2>\n<p>My rule is pretty simple.<\/p>\n<p>Use serverless when it reduces ownership and lets a small team move faster. Keep it when the observability is good enough that you can understand failures quickly. Be honest when the architecture is drifting into a pile of event handlers nobody can reason about without a whiteboard and a long coffee.<\/p>\n<p>The architecture is fine.<\/p>\n<p>The problem is usually the 2 a.m. version of it.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I still like serverless, but the tradeoff is obvious when something breaks at 2 a.m. The architecture is easy to ship and harder to reason about when you need logs, context, and a fast path to the real failure.<\/p>\n","protected":false},"author":0,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[13,25],"tags":[52,54,56,55,53],"class_list":["post-1167","post","type-post","status-publish","format-standard","hentry","category-programming","category-software-engineer","tag-aws","tag-debugging","tag-lambda","tag-observability","tag-serverless"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Serverless Is Great Until You Need to Debug It at 2 a.m. - wade.one<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/wade.one\/blog\/2026\/03\/31\/serverless-is-great-until-you-need-to-debug-it-at-2-a-m\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Serverless Is Great Until You Need to Debug It at 2 a.m. - wade.one\" \/>\n<meta property=\"og:description\" content=\"I still like serverless, but the tradeoff is obvious when something breaks at 2 a.m. The architecture is easy to ship and harder to reason about when you need logs, context, and a fast path to the real failure.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wade.one\/blog\/2026\/03\/31\/serverless-is-great-until-you-need-to-debug-it-at-2-a-m\/\" \/>\n<meta property=\"og:site_name\" content=\"wade.one\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-31T09:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/Wade-Logo-cropped.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1518\" \/>\n\t<meta property=\"og:image:height\" content=\"1506\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@wadewomersley\" \/>\n<meta name=\"twitter:site\" content=\"@wadewomersley\" \/>\n<meta name=\"twitter:label1\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/03\\\/31\\\/serverless-is-great-until-you-need-to-debug-it-at-2-a-m\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/03\\\/31\\\/serverless-is-great-until-you-need-to-debug-it-at-2-a-m\\\/\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Serverless Is Great Until You Need to Debug It at 2 a.m.\",\"datePublished\":\"2026-03-31T09:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/03\\\/31\\\/serverless-is-great-until-you-need-to-debug-it-at-2-a-m\\\/\"},\"wordCount\":652,\"publisher\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/8b4739f8f8bb2cff5d792d4b8779fcc3\"},\"keywords\":[\"aws\",\"debugging\",\"lambda\",\"observability\",\"serverless\"],\"articleSection\":[\"Programming\",\"Software Engineer\"],\"inLanguage\":\"en-GB\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/03\\\/31\\\/serverless-is-great-until-you-need-to-debug-it-at-2-a-m\\\/\",\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/03\\\/31\\\/serverless-is-great-until-you-need-to-debug-it-at-2-a-m\\\/\",\"name\":\"Serverless Is Great Until You Need to Debug It at 2 a.m. - wade.one\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#website\"},\"datePublished\":\"2026-03-31T09:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/03\\\/31\\\/serverless-is-great-until-you-need-to-debug-it-at-2-a-m\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/03\\\/31\\\/serverless-is-great-until-you-need-to-debug-it-at-2-a-m\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/03\\\/31\\\/serverless-is-great-until-you-need-to-debug-it-at-2-a-m\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/wade.one\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Serverless Is Great Until You Need to Debug It at 2 a.m.\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/\",\"name\":\"wade.one\",\"description\":\"wade womersley - york based software engineer\",\"publisher\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/8b4739f8f8bb2cff5d792d4b8779fcc3\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/wade.one\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/8b4739f8f8bb2cff5d792d4b8779fcc3\",\"name\":\"Wade Womersley\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\",\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\",\"contentUrl\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\",\"width\":202,\"height\":200,\"caption\":\"Wade Womersley\"},\"logo\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Serverless Is Great Until You Need to Debug It at 2 a.m. - wade.one","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/wade.one\/blog\/2026\/03\/31\/serverless-is-great-until-you-need-to-debug-it-at-2-a-m\/","og_locale":"en_GB","og_type":"article","og_title":"Serverless Is Great Until You Need to Debug It at 2 a.m. - wade.one","og_description":"I still like serverless, but the tradeoff is obvious when something breaks at 2 a.m. The architecture is easy to ship and harder to reason about when you need logs, context, and a fast path to the real failure.","og_url":"https:\/\/wade.one\/blog\/2026\/03\/31\/serverless-is-great-until-you-need-to-debug-it-at-2-a-m\/","og_site_name":"wade.one","article_published_time":"2026-03-31T09:00:00+00:00","og_image":[{"width":1518,"height":1506,"url":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/Wade-Logo-cropped.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_creator":"@wadewomersley","twitter_site":"@wadewomersley","twitter_misc":{"Estimated reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/wade.one\/blog\/2026\/03\/31\/serverless-is-great-until-you-need-to-debug-it-at-2-a-m\/#article","isPartOf":{"@id":"https:\/\/wade.one\/blog\/2026\/03\/31\/serverless-is-great-until-you-need-to-debug-it-at-2-a-m\/"},"author":{"name":"","@id":""},"headline":"Serverless Is Great Until You Need to Debug It at 2 a.m.","datePublished":"2026-03-31T09:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/wade.one\/blog\/2026\/03\/31\/serverless-is-great-until-you-need-to-debug-it-at-2-a-m\/"},"wordCount":652,"publisher":{"@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/8b4739f8f8bb2cff5d792d4b8779fcc3"},"keywords":["aws","debugging","lambda","observability","serverless"],"articleSection":["Programming","Software Engineer"],"inLanguage":"en-GB"},{"@type":"WebPage","@id":"https:\/\/wade.one\/blog\/2026\/03\/31\/serverless-is-great-until-you-need-to-debug-it-at-2-a-m\/","url":"https:\/\/wade.one\/blog\/2026\/03\/31\/serverless-is-great-until-you-need-to-debug-it-at-2-a-m\/","name":"Serverless Is Great Until You Need to Debug It at 2 a.m. - wade.one","isPartOf":{"@id":"https:\/\/wade.one\/blog\/#website"},"datePublished":"2026-03-31T09:00:00+00:00","breadcrumb":{"@id":"https:\/\/wade.one\/blog\/2026\/03\/31\/serverless-is-great-until-you-need-to-debug-it-at-2-a-m\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wade.one\/blog\/2026\/03\/31\/serverless-is-great-until-you-need-to-debug-it-at-2-a-m\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/wade.one\/blog\/2026\/03\/31\/serverless-is-great-until-you-need-to-debug-it-at-2-a-m\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/wade.one\/blog\/"},{"@type":"ListItem","position":2,"name":"Serverless Is Great Until You Need to Debug It at 2 a.m."}]},{"@type":"WebSite","@id":"https:\/\/wade.one\/blog\/#website","url":"https:\/\/wade.one\/blog\/","name":"wade.one","description":"wade womersley - york based software engineer","publisher":{"@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/8b4739f8f8bb2cff5d792d4b8779fcc3"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/wade.one\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":["Person","Organization"],"@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/8b4739f8f8bb2cff5d792d4b8779fcc3","name":"Wade Womersley","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png","url":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png","contentUrl":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png","width":202,"height":200,"caption":"Wade Womersley"},"logo":{"@id":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png"}}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":1168,"url":"https:\/\/wade.one\/blog\/2026\/04\/01\/why-i-still-like-serverless-for-small-teams\/","url_meta":{"origin":1167,"position":0},"title":"Why I Still Like Serverless for Small Teams","author":"","date":"April 1, 2026","format":false,"excerpt":"Serverless has real tradeoffs, but for small teams I still think it usually wins. The operational overhead stays low, the first version ships faster, and the mistakes are easier to afford early on.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1180,"url":"https:\/\/wade.one\/blog\/2026\/04\/12\/the-hardest-part-of-serverless-is-not-the-code\/","url_meta":{"origin":1167,"position":1},"title":"The Hardest Part of Serverless Is Not the Code","author":"","date":"April 12, 2026","format":false,"excerpt":"The hard part of serverless is usually not writing the handler. It is understanding what failed, what the event looked like, and why the system changed underneath you.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1171,"url":"https:\/\/wade.one\/blog\/2026\/04\/04\/i-trust-boring-infrastructure-more-than-clever-infrastructure\/","url_meta":{"origin":1167,"position":2},"title":"I Trust Boring Infrastructure More Than Clever Infrastructure","author":"","date":"April 4, 2026","format":false,"excerpt":"Clever infrastructure looks impressive in diagrams. Boring infrastructure is usually easier to operate, easier to debug, and much easier to keep alive once real users depend on it.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1169,"url":"https:\/\/wade.one\/blog\/2026\/04\/02\/the-problem-with-simple-aws-architectures\/","url_meta":{"origin":1167,"position":3},"title":"The Problem With &#8220;Simple&#8221; AWS Architectures","author":"","date":"April 2, 2026","format":false,"excerpt":"AWS diagrams love to look simple. The problem is that the operational reality behind them is usually doing a lot more work than the picture admits.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1189,"url":"https:\/\/wade.one\/blog\/2026\/04\/21\/the-difference-between-a-prototype-and-a-system\/","url_meta":{"origin":1167,"position":4},"title":"The Difference Between a Prototype and a System","author":"","date":"April 21, 2026","format":false,"excerpt":"Prototypes are allowed to be clever and disposable. Systems are not. The difference shows up when something grows, someone new has to own it, or you need to debug it under pressure.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1183,"url":"https:\/\/wade.one\/blog\/2026\/04\/15\/the-real-cost-of-fancy-cloud-abstractions\/","url_meta":{"origin":1167,"position":5},"title":"The Real Cost of Fancy Cloud Abstractions","author":"","date":"April 15, 2026","format":false,"excerpt":"Fancy cloud abstractions often look like they remove complexity, but a lot of the time they just move it somewhere harder to see. That matters when something breaks and you need to debug it or hand it over to someone else.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts\/1167","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/comments?post=1167"}],"version-history":[{"count":1,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts\/1167\/revisions"}],"predecessor-version":[{"id":1191,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts\/1167\/revisions\/1191"}],"wp:attachment":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/media?parent=1167"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/categories?post=1167"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/tags?post=1167"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}