<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>theburningmonk.com</title>
	<atom:link href="https://theburningmonk.com/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>Learn to build production-ready serverless applications on AWS</description>
	<lastBuildDate>Tue, 23 Jun 2026 22:22:20 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://theburningmonk.com/wp-content/uploads/2018/03/favicon-150x150.png</url>
	<title>theburningmonk.com</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>What you need to know about Lambda MicroVMs</title>
		<link>https://theburningmonk.com/2026/06/what-you-need-to-know-about-lambda-microvms/</link>
		
		<dc:creator><![CDATA[Yan Cui]]></dc:creator>
		<pubDate>Tue, 23 Jun 2026 21:57:52 +0000</pubDate>
				<category><![CDATA[AWS]]></category>
		<category><![CDATA[Lambda]]></category>
		<category><![CDATA[Serverless]]></category>
		<guid isPermaLink="false">https://theburningmonk.com/?p=15910</guid>

					<description><![CDATA[<p>AWS just launched Lambda MicroVMs, which gives you dedicated Firecracker VMs per user/session, has near-instant boot time, and offers stateful executions for up to 8 hours with automated suspend &#038; resume based on activity.</p>
<p>It's the perfect building block for applications that require sandboxes for safely executing AI-generated or user-supplied code, such as coding assistants or interactive notebooks.</p>
<p>The post <a href="https://theburningmonk.com/2026/06/what-you-need-to-know-about-lambda-microvms/">What you need to know about Lambda MicroVMs</a> appeared first on <a href="https://theburningmonk.com">theburningmonk.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">AWS launched Lambda MicroVMs this week, and it solves the very timely problem of &#8220;how to create sandboxed environments so we can safely run AI-generated or user-supplied code?&#8221;</span></p>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">It offers a unique combination of properties amongst AWS&#8217;s compute services:</span></p>
<ul class="ck-unordered-list" data-slate-node="element">
<li data-slate-node="element"><span data-slate-node="element">Strong isolation guarantees.</span></li>
<li data-slate-node="element"><span data-slate-node="element">Fast boot time.</span></li>
<li data-slate-node="element"><span data-slate-node="element">Stateful executions.</span></li>
</ul>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">and is suitable for multi-tenant applications that require per-user or per-session execution environments without a shared kernel.</span></p>
<h3 data-slate-node="element"><span data-slate-node="text">The Problem</span></h3>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">Imagine you&#8217;re building a product where users or AI agents need to execute arbitrary code. A coding assistant, an AI notebook, or perhaps a platform where users can run custom scripts.</span></p>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">The requirements are simple enough, but none of the existing compute services is an exact fit:</span></p>
<ul class="ck-unordered-list" data-slate-node="element">
<li data-slate-node="element"><span data-slate-node="element">VMs provide strong isolation, but take minutes to boot.</span></li>
<li data-slate-node="element"><span data-slate-node="element">Containers have a fast boot time, but the shared kernel makes it difficult to create truly sandboxed environments.</span></li>
<li data-slate-node="element"><span data-slate-node="element">Lambda functions have great isolation (thanks to Firecracker MicroVMs), but their 15-minute max timeout is not suited for long-running environments.</span></li>
</ul>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">So teams end up duct-taping solutions together. EC2 with a custom lifecycle manager, ECS with heavy isolation config, or running Firecracker directly on bare metal.</span></p>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">Meanwhile, Lambda already has the right isolation guarantee, but its invocation-based model is a showstopper.</span></p>
<h3 data-slate-node="element"><span data-slate-node="text">What Lambda MicroVMs changes</span></h3>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">Lambda MicroVMs combines important properties from each of the options above:</span></p>
<ul class="ck-unordered-list" data-slate-node="element">
<li data-slate-node="element"><span data-slate-node="element"><strong data-slate-leaf="true">VM-level isolation</strong> via Firecracker: no shared kernel between execution environments, same as Lambda functions.</span></li>
<li data-slate-node="element"><span data-slate-node="element"><strong data-slate-leaf="true">Fast startup</strong> (in seconds) from pre-initialized snapshots. The same technology behind <a class="ck-link" href="https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html" target="_blank" rel="noopener" data-slate-node="element" data-slate-inline="true">Lambda SnapStart</a> is used here.</span></li>
<li data-slate-node="element"><span data-slate-node="element"><strong data-slate-leaf="true">Stateful sessions</strong>: memory and disk persist for up to 8 hours, with automatic suspend/resume when idle.</span></li>
</ul>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">The use cases are pretty clear &#8211; coding assistants that need to run AI-generated code safely, interactive AI notebooks, agent sandboxes, vulnerability scanners, etc.</span></p>
<h4 data-slate-node="element"><span data-slate-node="text">A completely different mental model</span></h4>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">Lambda MicroVMs isn&#8217;t request/response at all.</span></p>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">Instead, you spin up a persistent VM per user or session, and it gets a dedicated HTTPS endpoint.</span></p>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">Clients connect over HTTP/2, gRPC or WebSockets. Every inbound connection is authenticated using bearer tokens (which you can generate using the </span><a class="ck-link" href="https://docs.aws.amazon.com/lambda/latest/microvm-api/API_CreateMicrovmAuthToken.html" target="_blank" rel="noopener" data-slate-node="element" data-slate-inline="true"><span data-slate-node="text">CreateMicrovmAuthToken</span></a><span data-slate-node="text"> API).</span></p>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">The VM automatically suspends when idle (no compute charges) and resumes when traffic arrives. The practical unit is a session, not an invocation.</span></p>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">Scaling is different too.</span></p>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">Vertical scaling within a MicroVM is automated. It can burst to 4× its configured baseline CPU and memory.</span></p>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">But there&#8217;s no automatic horizontal scaling. You call &#8220;run-microvm&#8221; to create new environments as needed. Your application manages the fleet &#8211; which VM belongs to which tenant, when to spin up, when to clean up, etc. That&#8217;s the real engineering work you don&#8217;t have with Lambda functions.</span></p>
<h4 data-slate-node="element"><span data-slate-node="text">Things to know</span></h4>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">Aidan Steele did some hands-on exploration on launch day and gave us some useful details not in the launch posts (</span><a class="ck-link" href="https://awsteele.com/blog/2026/06/23/some-notes-on-lambda-microvms.html" target="_blank" rel="noopener" data-slate-node="element" data-slate-inline="true"><span data-slate-node="text">source</span></a><span data-slate-node="text">):</span></p>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">Shell access is first-class. &#8220;/dev/ptmx&#8221; (pseudo-terminal) is supported, and there&#8217;s a </span><a class="ck-link" href="https://docs.aws.amazon.com/lambda/latest/microvm-api/API_CreateMicrovmShellAuthToken.html" target="_blank" rel="noopener" data-slate-node="element" data-slate-inline="true"><span data-slate-node="text">CreateMicrovmShellAuthToken</span></a><span data-slate-node="text"> API to connect directly to a shell inside the VM. No reverse-shell workarounds needed. </span><span data-slate-node="text">This is what tools like Claude Code and OpenCode use to give you a real terminal experience. And it means you can build the same thing for your users.</span></p>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">Docker works inside MicroVMs. Full OS capabilities are available, including running containers inside your MicroVM. One gotcha: all outbound UDP is blocked by default, which breaks DNS inside containers. See Aidan&#8217;s post for the fix.</span></p>
<h4 data-slate-node="element"><span data-slate-node="text">Caveats</span></h4>
<ul class="ck-unordered-list" data-slate-node="element">
<li data-slate-node="element"><span data-slate-node="element">ARM64 only at launch.</span></li>
<li data-slate-node="element"><span data-slate-node="element">Only five regions: N. Virginia, Ohio, Oregon, Ireland and Tokyo.</span></li>
<li data-slate-node="element"><span data-slate-node="element">Pricing is per vCPU-second + per Memory GB-second + snapshot read/write charges. This is closer to Fargate than Lambda.</span></li>
<li data-slate-node="element"><span data-slate-fragment="JTVCJTdCJTIydHlwZSUyMiUzQSUyMmRvY3VtZW50JTIyJTJDJTIydGhlbWUlMjIlM0ElN0IlMjJkb2N1bWVudCUyMiUzQSU3QiUyMmJhY2tncm91bmRDb2xvciUyMiUzQSUyMiUyM0ZGRkZGRiUyMiU3RCU3RCUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMnVub3JkZXJlZC1saXN0JTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIybGlzdC1pdGVtJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIybGlzdC1pdGVtLWNoaWxkJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0ZXh0JTIyJTNBJTIyWW91J3JlJTIwYmlsbGVkJTIwcGVyJTIwc2Vjb25kJTJDJTIwbm90JTIwcGVyJTIwbWlsbGlzZWNvbmQlMjAoYXMlMjB3aXRoJTIwTGFtYmRhJTIwZnVuY3Rpb25zKS4lMjBBZ2FpbiUyQyUyMHRoaXMlMjBpcyUyMGNsb3NlciUyMHRvJTIwRmFyZ2F0ZSUyMHRoYW4lMjBMYW1iZGEuJTIyJTdEJTVEJTdEJTVEJTdEJTVEJTdEJTVEJTdEJTVE">You&#8217;re billed per second, not per millisecond (as with Lambda functions). Again, this is closer to Fargate than Lambda.</span></li>
</ul>
<h3 data-slate-node="element"><span data-slate-node="text">Compared with AgentCore Runtime</span></h3>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">If you&#8217;re building AI agents, you might have also looked at AgentCore Runtime, a managed platform for running agent workloads.</span></p>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">Both run on Firecracker MicroVMs and support up to 8 hours of total runtime. Both now have PTY/shell access (AgentCore added the InvokeAgentRuntimeCommandShell API in early June).</span></p>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">They look similar on paper, but I think the difference lies in the level of abstraction and who&#8217;s running the code.</span></p>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">AgentCore is a managed agent platform. You deploy your agent code (LangGraph, CrewAI, Strands, whatever), and AWS manages the fleet. This includes routing sessions to VMs, scaling and tearing down idle sessions. It has built-in inbound/outbound auth, MCP and A2A protocol support, versioning, and endpoints. Your users talk to your agent, and you don&#8217;t even think about VMs.</span></p>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">Lambda MicroVMs, on the other hand, is a low-level compute primitive. You call &#8220;run-microvm&#8221; to create environments, track which VM belongs to which tenant, and decide when to clean up, etc. There is no fleet management, no built-in auth, no protocol support.</span></p>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">There are overlaps in capabilities. For example, AgentCore Runtime also recently </span><a class="ck-link" href="https://aws.amazon.com/about-aws/whats-new/2026/06/amazon-bedrock-agentcore-runtime/" target="_blank" rel="noopener" data-slate-node="element" data-slate-inline="true"><span data-slate-node="text">added support for interactive shells</span></a><span data-slate-node="text">. But ultimately, I think they&#8217;re designed for different use cases:</span></p>
<ul class="ck-unordered-list" data-slate-node="element">
<li data-slate-node="element"><span data-slate-node="element">AgentCore Runtime &#8211; run my agent so users can talk to it.</span></li>
<li data-slate-node="element"><span data-slate-node="element">Lambda MicroVMs &#8211; give each user their own isolated VM so they can run arbitrary code in it.</span></li>
</ul>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">As such, AgentCore Runtime&#8217;s execution environment is more locked down, whereas Lambda MicroVMs gives you full rein of the VM.</span></p>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">A good analogy is that AgentCore Runtime is to Lambda MicroVMs what Fargate is to EC2. Fargate runs your container in a microVM but constrains what you can do within it. EC2 gives you the full machine.</span></p>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">AgentCore gives you managed container hosting in a microVM. Lambda MicroVMs gives you the VM itself. The isolation boundary is the same (Firecracker), but what you can do inside it is not.</span></p>
<h3 data-slate-node="element"><span data-slate-node="text"><strong data-slate-leaf="true">Links</strong></span></h3>
<ul class="ck-unordered-list" data-slate-node="element" data-slate-fragment="JTVCJTdCJTIydHlwZSUyMiUzQSUyMmRvY3VtZW50JTIyJTJDJTIydGhlbWUlMjIlM0ElN0IlMjJkb2N1bWVudCUyMiUzQSU3QiUyMmJhY2tncm91bmRDb2xvciUyMiUzQSUyMiUyM0ZGRkZGRiUyMiU3RCU3RCUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMkFXUyUyMGxhdW5jaGVkJTIwTGFtYmRhJTIwTWljcm9WTXMlMjB0aGlzJTIwd2VlayUyQyUyMGFuZCUyMGl0JTIwc29sdmVzJTIwdGhlJTIwdmVyeSUyMHRpbWVseSUyMHByb2JsZW0lMjBvZiUyMCU1QyUyMmhvdyUyMHRvJTIwY3JlYXRlJTIwc2FuZGJveGVkJTIwZW52aXJvbm1lbnRzJTIwc28lMjB3ZSUyMGNhbiUyMHNhZmVseSUyMHJ1biUyMEFJLWdlbmVyYXRlZCUyMG9yJTIwdXNlci1zdXBwbGllZCUyMGNvZGUlM0YlNUMlMjIlMjIlN0QlNUQlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIycGFyYWdyYXBoJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0ZXh0JTIyJTNBJTIySXQlMjBvZmZlcnMlMjBhJTIwdW5pcXVlJTIwY29tYmluYXRpb24lMjBvZiUyMHByb3BlcnRpZXMlMjBhbW9uZ3N0JTIwQVdTJ3MlMjBjb21wdXRlJTIwc2VydmljZXMlM0ElMjIlN0QlNUQlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIydW5vcmRlcmVkLWxpc3QlMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJsaXN0LWl0ZW0lMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJsaXN0LWl0ZW0tY2hpbGQlMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJTdHJvbmclMjBpc29sYXRpb24lMjBndWFyYW50ZWVzLiUyMiU3RCU1RCU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJsaXN0LWl0ZW0lMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJsaXN0LWl0ZW0tY2hpbGQlMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJGYXN0JTIwYm9vdCUyMHRpbWUuJTIyJTdEJTVEJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmxpc3QtaXRlbSUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmxpc3QtaXRlbS1jaGlsZCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMlN0YXRlZnVsJTIwZXhlY3V0aW9ucy4lMjIlN0QlNUQlN0QlNUQlN0QlNUQlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIycGFyYWdyYXBoJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0ZXh0JTIyJTNBJTIyYW5kJTIwaXMlMjBzdWl0YWJsZSUyMGZvciUyMG11bHRpLXRlbmFudCUyMGFwcGxpY2F0aW9ucyUyMHRoYXQlMjByZXF1aXJlJTIwcGVyLXVzZXIlMjBvciUyMHBlci1zZXNzaW9uJTIwZXhlY3V0aW9uJTIwZW52aXJvbm1lbnRzJTIwd2l0aG91dCUyMGElMjBzaGFyZWQlMjBrZXJuZWwuJTIyJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmhlYWRpbmctdHdvJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0ZXh0JTIyJTNBJTIyVGhlJTIwUHJvYmxlbSUyMiU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJwYXJhZ3JhcGglMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJJbWFnaW5lJTIweW91J3JlJTIwYnVpbGRpbmclMjBhJTIwcHJvZHVjdCUyMHdoZXJlJTIwdXNlcnMlMjBvciUyMEFJJTIwYWdlbnRzJTIwbmVlZCUyMHRvJTIwZXhlY3V0ZSUyMGFyYml0cmFyeSUyMGNvZGUuJTIwQSUyMGNvZGluZyUyMGFzc2lzdGFudCUyQyUyMGFuJTIwQUklMjBub3RlYm9vayUyQyUyMG9yJTIwcGVyaGFwcyUyMGElMjBwbGF0Zm9ybSUyMHdoZXJlJTIwdXNlcnMlMjBjYW4lMjBydW4lMjBjdXN0b20lMjBzY3JpcHRzLiUyMiU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJwYXJhZ3JhcGglMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJUaGUlMjByZXF1aXJlbWVudHMlMjBhcmUlMjBzaW1wbGUlMjBlbm91Z2glMkMlMjBidXQlMjBub25lJTIwb2YlMjB0aGUlMjBleGlzdGluZyUyMGNvbXB1dGUlMjBzZXJ2aWNlcyUyMGlzJTIwYW4lMjBleGFjdCUyMGZpdCUzQSUyMiU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJ1bm9yZGVyZWQtbGlzdCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmxpc3QtaXRlbSUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmxpc3QtaXRlbS1jaGlsZCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMlZNcyUyMHByb3ZpZGUlMjBzdHJvbmclMjBpc29sYXRpb24lMkMlMjBidXQlMjB0YWtlJTIwbWludXRlcyUyMHRvJTIwYm9vdC4lMjIlN0QlNUQlN0QlNUQlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIybGlzdC1pdGVtJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIybGlzdC1pdGVtLWNoaWxkJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0ZXh0JTIyJTNBJTIyQ29udGFpbmVycyUyMGhhdmUlMjBhJTIwZmFzdCUyMGJvb3QlMjB0aW1lJTJDJTIwYnV0JTIwdGhlJTIwc2hhcmVkJTIwa2VybmVsJTIwbWFrZXMlMjBpdCUyMGRpZmZpY3VsdCUyMHRvJTIwY3JlYXRlJTIwdHJ1bHklMjBzYW5kYm94ZWQlMjBlbnZpcm9ubWVudHMuJTIyJTdEJTVEJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmxpc3QtaXRlbSUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmxpc3QtaXRlbS1jaGlsZCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMkxhbWJkYSUyMGZ1bmN0aW9ucyUyMGhhdmUlMjBncmVhdCUyMGlzb2xhdGlvbiUyMCh0aGFua3MlMjB0byUyMEZpcmVjcmFja2VyJTIwTWljcm9WTXMpJTJDJTIwYnV0JTIwdGhlaXIlMjAxNS1taW51dGUlMjBtYXglMjB0aW1lb3V0JTIwaXMlMjBub3QlMjBzdWl0ZWQlMjBmb3IlMjBsb25nLXJ1bm5pbmclMjBlbnZpcm9ubWVudHMuJTIyJTdEJTVEJTdEJTVEJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMlNvJTIwdGVhbXMlMjBlbmQlMjB1cCUyMGR1Y3QtdGFwaW5nJTIwc29sdXRpb25zJTIwdG9nZXRoZXIuJTIwRUMyJTIwd2l0aCUyMGElMjBjdXN0b20lMjBsaWZlY3ljbGUlMjBtYW5hZ2VyJTJDJTIwRUNTJTIwd2l0aCUyMGhlYXZ5JTIwaXNvbGF0aW9uJTIwY29uZmlnJTJDJTIwb3IlMjBydW5uaW5nJTIwRmlyZWNyYWNrZXIlMjBkaXJlY3RseSUyMG9uJTIwYmFyZSUyMG1ldGFsLiUyMiU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJwYXJhZ3JhcGglMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJNZWFud2hpbGUlMkMlMjBMYW1iZGElMjBhbHJlYWR5JTIwaGFzJTIwdGhlJTIwcmlnaHQlMjBpc29sYXRpb24lMjBndWFyYW50ZWUlMkMlMjBidXQlMjBpdHMlMjBpbnZvY2F0aW9uLWJhc2VkJTIwbW9kZWwlMjBpcyUyMGElMjBzaG93c3RvcHBlci4lMjIlN0QlNUQlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyaGVhZGluZy10d28lMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJXaGF0JTIwTGFtYmRhJTIwTWljcm9WTXMlMjBjaGFuZ2VzJTIyJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMkxhbWJkYSUyME1pY3JvVk1zJTIwY29tYmluZXMlMjBpbXBvcnRhbnQlMjBwcm9wZXJ0aWVzJTIwZnJvbSUyMGVhY2glMjBvZiUyMHRoZSUyMG9wdGlvbnMlMjBhYm92ZSUzQSUyMiU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJ1bm9yZGVyZWQtbGlzdCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmxpc3QtaXRlbSUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmxpc3QtaXRlbS1jaGlsZCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMlZNLWxldmVsJTIwaXNvbGF0aW9uJTIyJTJDJTIyYm9sZCUyMiUzQXRydWUlN0QlMkMlN0IlMjJ0ZXh0JTIyJTNBJTIyJTIwdmlhJTIwRmlyZWNyYWNrZXIlM0ElMjBubyUyMHNoYXJlZCUyMGtlcm5lbCUyMGJldHdlZW4lMjBleGVjdXRpb24lMjBlbnZpcm9ubWVudHMlMkMlMjBzYW1lJTIwYXMlMjBMYW1iZGElMjBmdW5jdGlvbnMuJTIyJTdEJTVEJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmxpc3QtaXRlbSUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmxpc3QtaXRlbS1jaGlsZCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMkZhc3QlMjBzdGFydHVwJTIyJTJDJTIyYm9sZCUyMiUzQXRydWUlN0QlMkMlN0IlMjJ0ZXh0JTIyJTNBJTIyJTIwKGluJTIwc2Vjb25kcyklMjBmcm9tJTIwcHJlLWluaXRpYWxpemVkJTIwc25hcHNob3RzLiUyMFRoZSUyMHNhbWUlMjB0ZWNobm9sb2d5JTIwYmVoaW5kJTIwJTIyJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmxpbmslMjIlMkMlMjJocmVmJTIyJTNBJTIyaHR0cHMlM0ElMkYlMkZkb2NzLmF3cy5hbWF6b24uY29tJTJGbGFtYmRhJTJGbGF0ZXN0JTJGZGclMkZzbmFwc3RhcnQuaHRtbCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMkxhbWJkYSUyMFNuYXBTdGFydCUyMiU3RCU1RCU3RCUyQyU3QiUyMnRleHQlMjIlM0ElMjIlMjBpcyUyMHVzZWQlMjBoZXJlLiUyMiU3RCU1RCU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJsaXN0LWl0ZW0lMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJsaXN0LWl0ZW0tY2hpbGQlMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJTdGF0ZWZ1bCUyMHNlc3Npb25zJTIyJTJDJTIyYm9sZCUyMiUzQXRydWUlN0QlMkMlN0IlMjJ0ZXh0JTIyJTNBJTIyJTNBJTIwbWVtb3J5JTIwYW5kJTIwZGlzayUyMHBlcnNpc3QlMjBmb3IlMjB1cCUyMHRvJTIwOCUyMGhvdXJzJTJDJTIwd2l0aCUyMGF1dG9tYXRpYyUyMHN1c3BlbmQlMkZyZXN1bWUlMjB3aGVuJTIwaWRsZS4lMjIlN0QlNUQlN0QlNUQlN0QlNUQlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIycGFyYWdyYXBoJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0ZXh0JTIyJTNBJTIyVGhlJTIwdXNlJTIwY2FzZXMlMjBhcmUlMjBwcmV0dHklMjBjbGVhciUyMC0lMjBjb2RpbmclMjBhc3Npc3RhbnRzJTIwdGhhdCUyMG5lZWQlMjB0byUyMHJ1biUyMEFJLWdlbmVyYXRlZCUyMGNvZGUlMjBzYWZlbHklMkMlMjBpbnRlcmFjdGl2ZSUyMEFJJTIwbm90ZWJvb2tzJTJDJTIwYWdlbnQlMjBzYW5kYm94ZXMlMkMlMjB2dWxuZXJhYmlsaXR5JTIwc2Nhbm5lcnMlMkMlMjBldGMuJTIyJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmhlYWRpbmctdGhyZWUlMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJBJTIwY29tcGxldGVseSUyMGRpZmZlcmVudCUyMG1lbnRhbCUyMG1vZGVsJTIyJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMkxhbWJkYSUyME1pY3JvVk1zJTIwaXNuJ3QlMjByZXF1ZXN0JTJGcmVzcG9uc2UlMjBhdCUyMGFsbC4lMjIlN0QlNUQlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIycGFyYWdyYXBoJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0ZXh0JTIyJTNBJTIySW5zdGVhZCUyQyUyMHlvdSUyMHNwaW4lMjB1cCUyMGElMjBwZXJzaXN0ZW50JTIwVk0lMjBwZXIlMjB1c2VyJTIwb3IlMjBzZXNzaW9uJTJDJTIwYW5kJTIwaXQlMjBnZXRzJTIwYSUyMGRlZGljYXRlZCUyMEhUVFBTJTIwZW5kcG9pbnQuJTIyJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMkNsaWVudHMlMjBjb25uZWN0JTIwb3ZlciUyMEhUVFAlMkYyJTJDJTIwZ1JQQyUyMG9yJTIwV2ViU29ja2V0cy4lMjBFdmVyeSUyMGluYm91bmQlMjBjb25uZWN0aW9uJTIwaXMlMjBhdXRoZW50aWNhdGVkJTIwdXNpbmclMjBiZWFyZXIlMjB0b2tlbnMlMjAod2hpY2glMjB5b3UlMjBjYW4lMjBnZW5lcmF0ZSUyMHVzaW5nJTIwdGhlJTIwJTIyJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmxpbmslMjIlMkMlMjJocmVmJTIyJTNBJTIyaHR0cHMlM0ElMkYlMkZkb2NzLmF3cy5hbWF6b24uY29tJTJGbGFtYmRhJTJGbGF0ZXN0JTJGbWljcm92bS1hcGklMkZBUElfQ3JlYXRlTWljcm92bUF1dGhUb2tlbi5odG1sJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0ZXh0JTIyJTNBJTIyQ3JlYXRlTWljcm92bUF1dGhUb2tlbiUyMiU3RCU1RCU3RCUyQyU3QiUyMnRleHQlMjIlM0ElMjIlMjBBUEkpLiUyMiU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJwYXJhZ3JhcGglMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJUaGUlMjBWTSUyMGF1dG9tYXRpY2FsbHklMjBzdXNwZW5kcyUyMHdoZW4lMjBpZGxlJTIwKG5vJTIwY29tcHV0ZSUyMGNoYXJnZXMpJTIwYW5kJTIwcmVzdW1lcyUyMHdoZW4lMjB0cmFmZmljJTIwYXJyaXZlcy4lMjBUaGUlMjBwcmFjdGljYWwlMjB1bml0JTIwaXMlMjBhJTIwc2Vzc2lvbiUyQyUyMG5vdCUyMGFuJTIwaW52b2NhdGlvbi4lMjIlN0QlNUQlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIycGFyYWdyYXBoJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0ZXh0JTIyJTNBJTIyU2NhbGluZyUyMGlzJTIwZGlmZmVyZW50JTIwdG9vLiUyMiU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJwYXJhZ3JhcGglMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJWZXJ0aWNhbCUyMHNjYWxpbmclMjB3aXRoaW4lMjBhJTIwTWljcm9WTSUyMGlzJTIwYXV0b21hdGVkLiUyMEl0JTIwY2FuJTIwYnVyc3QlMjB0byUyMDQlQzMlOTclMjBpdHMlMjBjb25maWd1cmVkJTIwYmFzZWxpbmUlMjBDUFUlMjBhbmQlMjBtZW1vcnkuJTIyJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMkJ1dCUyMHRoZXJlJ3MlMjBubyUyMGF1dG9tYXRpYyUyMGhvcml6b250YWwlMjBzY2FsaW5nLiUyMFlvdSUyMGNhbGwlMjAlNUMlMjJydW4tbWljcm92bSU1QyUyMiUyMHRvJTIwY3JlYXRlJTIwbmV3JTIwZW52aXJvbm1lbnRzJTIwYXMlMjBuZWVkZWQuJTIwWW91ciUyMGFwcGxpY2F0aW9uJTIwbWFuYWdlcyUyMHRoZSUyMGZsZWV0JTIwLSUyMHdoaWNoJTIwVk0lMjBiZWxvbmdzJTIwdG8lMjB3aGljaCUyMHRlbmFudCUyQyUyMHdoZW4lMjB0byUyMHNwaW4lMjB1cCUyQyUyMHdoZW4lMjB0byUyMGNsZWFuJTIwdXAlMkMlMjBldGMuJTIwVGhhdCdzJTIwdGhlJTIwcmVhbCUyMGVuZ2luZWVyaW5nJTIwd29yayUyMHlvdSUyMGRvbid0JTIwaGF2ZSUyMHdpdGglMjBMYW1iZGElMjBmdW5jdGlvbnMuJTIyJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmhlYWRpbmctdGhyZWUlMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJUaGluZ3MlMjB0byUyMGtub3clMjIlN0QlNUQlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIycGFyYWdyYXBoJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0ZXh0JTIyJTNBJTIyQWlkYW4lMjBTdGVlbGUlMjBkaWQlMjBzb21lJTIwaGFuZHMtb24lMjBleHBsb3JhdGlvbiUyMG9uJTIwbGF1bmNoJTIwZGF5JTIwYW5kJTIwZ2F2ZSUyMHVzJTIwc29tZSUyMHVzZWZ1bCUyMGRldGFpbHMlMjBub3QlMjBpbiUyMHRoZSUyMGxhdW5jaCUyMHBvc3RzJTIwKCUyMiU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJsaW5rJTIyJTJDJTIyaHJlZiUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGYXdzdGVlbGUuY29tJTJGYmxvZyUyRjIwMjYlMkYwNiUyRjIzJTJGc29tZS1ub3Rlcy1vbi1sYW1iZGEtbWljcm92bXMuaHRtbCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMnNvdXJjZSUyMiU3RCU1RCU3RCUyQyU3QiUyMnRleHQlMjIlM0ElMjIpJTNBJTIyJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMlNoZWxsJTIwYWNjZXNzJTIwaXMlMjBmaXJzdC1jbGFzcy4lMjAlNUMlMjIlMkZkZXYlMkZwdG14JTVDJTIyJTIwKHBzZXVkby10ZXJtaW5hbCklMjBpcyUyMHN1cHBvcnRlZCUyQyUyMGFuZCUyMHRoZXJlJ3MlMjBhJTIwJTIyJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmxpbmslMjIlMkMlMjJocmVmJTIyJTNBJTIyaHR0cHMlM0ElMkYlMkZkb2NzLmF3cy5hbWF6b24uY29tJTJGbGFtYmRhJTJGbGF0ZXN0JTJGbWljcm92bS1hcGklMkZBUElfQ3JlYXRlTWljcm92bVNoZWxsQXV0aFRva2VuLmh0bWwlMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJDcmVhdGVNaWNyb3ZtU2hlbGxBdXRoVG9rZW4lMjIlN0QlNUQlN0QlMkMlN0IlMjJ0ZXh0JTIyJTNBJTIyJTIwQVBJJTIwdG8lMjBjb25uZWN0JTIwZGlyZWN0bHklMjB0byUyMGElMjBzaGVsbCUyMGluc2lkZSUyMHRoZSUyMFZNLiUyME5vJTIwcmV2ZXJzZS1zaGVsbCUyMHdvcmthcm91bmRzJTIwbmVlZGVkLiUyMiU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJwYXJhZ3JhcGglMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJUaGlzJTIwaXMlMjB3aGF0JTIwdG9vbHMlMjBsaWtlJTIwQ2xhdWRlJTIwQ29kZSUyMGFuZCUyME9wZW5Db2RlJTIwdXNlJTIwdG8lMjBnaXZlJTIweW91JTIwYSUyMHJlYWwlMjB0ZXJtaW5hbCUyMGV4cGVyaWVuY2UuJTIwQW5kJTIwaXQlMjBtZWFucyUyMHlvdSUyMGNhbiUyMGJ1aWxkJTIwdGhlJTIwc2FtZSUyMHRoaW5nJTIwZm9yJTIweW91ciUyMHVzZXJzLiUyMiU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJwYXJhZ3JhcGglMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJEb2NrZXIlMjB3b3JrcyUyMGluc2lkZSUyME1pY3JvVk1zJTIwJUYwJTlGJTk4JTgyLiUyMEZ1bGwlMjBPUyUyMGNhcGFiaWxpdGllcyUyMGFyZSUyMGF2YWlsYWJsZSUyQyUyMGluY2x1ZGluZyUyMHJ1bm5pbmclMjBjb250YWluZXJzJTIwaW5zaWRlJTIweW91ciUyME1pY3JvVk0uJTIwT25lJTIwZ290Y2hhJTNBJTIwYWxsJTIwb3V0Ym91bmQlMjBVRFAlMjBpcyUyMGJsb2NrZWQlMjBieSUyMGRlZmF1bHQlMkMlMjB3aGljaCUyMGJyZWFrcyUyMEROUyUyMGluc2lkZSUyMGNvbnRhaW5lcnMuJTIwU2VlJTIwQWlkYW4ncyUyMHBvc3QlMjBmb3IlMjB0aGUlMjBmaXguJTIyJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmhlYWRpbmctdGhyZWUlMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJDYXZlYXRzJTIyJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMnVub3JkZXJlZC1saXN0JTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIybGlzdC1pdGVtJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIybGlzdC1pdGVtLWNoaWxkJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0ZXh0JTIyJTNBJTIyQVJNNjQlMjBvbmx5JTIwYXQlMjBsYXVuY2guJTIyJTdEJTVEJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmxpc3QtaXRlbSUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmxpc3QtaXRlbS1jaGlsZCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMk9ubHklMjBmaXZlJTIwcmVnaW9ucyUzQSUyME4uJTIwVmlyZ2luaWElMkMlMjBPaGlvJTJDJTIwT3JlZ29uJTJDJTIwSXJlbGFuZCUyMGFuZCUyMFRva3lvLiUyMiU3RCU1RCU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJsaXN0LWl0ZW0lMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJsaXN0LWl0ZW0tY2hpbGQlMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJQcmljaW5nJTIwaXMlMjBwZXIlMjB2Q1BVLXNlY29uZCUyMCUyQiUyMHBlciUyME1lbW9yeSUyMEdCLXNlY29uZCUyMCUyQiUyMHNuYXBzaG90JTIwcmVhZCUyRndyaXRlJTIwY2hhcmdlcy4lMjBUaGlzJTIwaXMlMjBjbG9zZXIlMjB0byUyMEZhcmdhdGUlMjB0aGFuJTIwTGFtYmRhLiUyMiU3RCU1RCU3RCU1RCU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJoZWFkaW5nLXR3byUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMkNvbXBhcmVkJTIwd2l0aCUyMEFnZW50Q29yZSUyMFJ1bnRpbWUlMjIlN0QlNUQlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIycGFyYWdyYXBoJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0ZXh0JTIyJTNBJTIySWYlMjB5b3UncmUlMjBidWlsZGluZyUyMEFJJTIwYWdlbnRzJTJDJTIweW91JTIwbWlnaHQlMjBoYXZlJTIwYWxzbyUyMGxvb2tlZCUyMGF0JTIwQWdlbnRDb3JlJTIwUnVudGltZSUyQyUyMGElMjBtYW5hZ2VkJTIwcGxhdGZvcm0lMjBmb3IlMjBydW5uaW5nJTIwYWdlbnQlMjB3b3JrbG9hZHMuJTIyJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMkJvdGglMjBydW4lMjBvbiUyMEZpcmVjcmFja2VyJTIwTWljcm9WTXMlMjBhbmQlMjBzdXBwb3J0JTIwdXAlMjB0byUyMDglMjBob3VycyUyMG9mJTIwdG90YWwlMjBydW50aW1lLiUyMEJvdGglMjBub3clMjBoYXZlJTIwUFRZJTJGc2hlbGwlMjBhY2Nlc3MlMjAoQWdlbnRDb3JlJTIwYWRkZWQlMjB0aGUlMjBJbnZva2VBZ2VudFJ1bnRpbWVDb21tYW5kU2hlbGwlMjBBUEklMjBpbiUyMGVhcmx5JTIwSnVuZSkuJTIyJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMlRoZXklMjBsb29rJTIwc2ltaWxhciUyMG9uJTIwcGFwZXIlMkMlMjBidXQlMjBJJTIwdGhpbmslMjB0aGUlMjBkaWZmZXJlbmNlJTIwbGllcyUyMGluJTIwdGhlJTIwbGV2ZWwlMjBvZiUyMGFic3RyYWN0aW9uJTIwYW5kJTIwd2hvJ3MlMjBydW5uaW5nJTIwdGhlJTIwY29kZS4lMjIlN0QlNUQlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIycGFyYWdyYXBoJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0ZXh0JTIyJTNBJTIyQWdlbnRDb3JlJTIwaXMlMjBhJTIwbWFuYWdlZCUyMGFnZW50JTIwcGxhdGZvcm0uJTIwWW91JTIwZGVwbG95JTIweW91ciUyMGFnZW50JTIwY29kZSUyMChMYW5nR3JhcGglMkMlMjBDcmV3QUklMkMlMjBTdHJhbmRzJTJDJTIwd2hhdGV2ZXIpJTJDJTIwYW5kJTIwQVdTJTIwbWFuYWdlcyUyMHRoZSUyMGZsZWV0LiUyMFRoaXMlMjBpbmNsdWRlcyUyMHJvdXRpbmclMjBzZXNzaW9ucyUyMHRvJTIwVk1zJTJDJTIwc2NhbGluZyUyMGFuZCUyMHRlYXJpbmclMjBkb3duJTIwaWRsZSUyMHNlc3Npb25zLiUyMEl0JTIwaGFzJTIwYnVpbHQtaW4lMjBpbmJvdW5kJTJGb3V0Ym91bmQlMjBhdXRoJTJDJTIwTUNQJTIwYW5kJTIwQTJBJTIwcHJvdG9jb2wlMjBzdXBwb3J0JTJDJTIwdmVyc2lvbmluZyUyQyUyMGFuZCUyMGVuZHBvaW50cy4lMjBZb3VyJTIwdXNlcnMlMjB0YWxrJTIwdG8lMjB5b3VyJTIwYWdlbnQlMkMlMjBhbmQlMjB5b3UlMjBkb24ndCUyMGV2ZW4lMjB0aGluayUyMGFib3V0JTIwVk1zLiUyMiU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJwYXJhZ3JhcGglMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJMYW1iZGElMjBNaWNyb1ZNcyUyQyUyMG9uJTIwdGhlJTIwb3RoZXIlMjBoYW5kJTJDJTIwaXMlMjBhJTIwbG93LWxldmVsJTIwY29tcHV0ZSUyMHByaW1pdGl2ZS4lMjBZb3UlMjBjYWxsJTIwJTVDJTIycnVuLW1pY3Jvdm0lNUMlMjIlMjB0byUyMGNyZWF0ZSUyMGVudmlyb25tZW50cyUyQyUyMHRyYWNrJTIwd2hpY2glMjBWTSUyMGJlbG9uZ3MlMjB0byUyMHdoaWNoJTIwdGVuYW50JTJDJTIwYW5kJTIwZGVjaWRlJTIwd2hlbiUyMHRvJTIwY2xlYW4lMjB1cCUyQyUyMGV0Yy4lMjBUaGVyZSUyMGlzJTIwbm8lMjBmbGVldCUyMG1hbmFnZW1lbnQlMkMlMjBubyUyMGJ1aWx0LWluJTIwYXV0aCUyQyUyMG5vJTIwcHJvdG9jb2wlMjBzdXBwb3J0LiUyMiU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJwYXJhZ3JhcGglMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJUaGVyZSUyMGFyZSUyMG92ZXJsYXBzJTIwaW4lMjBjYXBhYmlsaXRpZXMuJTIwRm9yJTIwZXhhbXBsZSUyQyUyMEFnZW50Q29yZSUyMFJ1bnRpbWUlMjBhbHNvJTIwcmVjZW50bHklMjAlMjIlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIybGluayUyMiUyQyUyMmhyZWYlMjIlM0ElMjJodHRwcyUzQSUyRiUyRmF3cy5hbWF6b24uY29tJTJGYWJvdXQtYXdzJTJGd2hhdHMtbmV3JTJGMjAyNiUyRjA2JTJGYW1hem9uLWJlZHJvY2stYWdlbnRjb3JlLXJ1bnRpbWUlMkYlMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJhZGRlZCUyMHN1cHBvcnQlMjBmb3IlMjBpbnRlcmFjdGl2ZSUyMHNoZWxscyUyMiU3RCU1RCU3RCUyQyU3QiUyMnRleHQlMjIlM0ElMjIuJTIwQnV0JTIwdWx0aW1hdGVseSUyQyUyMEklMjB0aGluayUyMHRoZXkncmUlMjBkZXNpZ25lZCUyMGZvciUyMGRpZmZlcmVudCUyMHVzZSUyMGNhc2VzJTNBJTIyJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMnVub3JkZXJlZC1saXN0JTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIybGlzdC1pdGVtJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIybGlzdC1pdGVtLWNoaWxkJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0ZXh0JTIyJTNBJTIyQWdlbnRDb3JlJTIwUnVudGltZSUyMC0lMjBydW4lMjBteSUyMGFnZW50JTIwc28lMjB1c2VycyUyMGNhbiUyMHRhbGslMjB0byUyMGl0LiUyMiU3RCU1RCU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJsaXN0LWl0ZW0lMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJsaXN0LWl0ZW0tY2hpbGQlMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJMYW1iZGElMjBNaWNyb1ZNcyUyMC0lMjBnaXZlJTIwZWFjaCUyMHVzZXIlMjB0aGVpciUyMG93biUyMGlzb2xhdGVkJTIwVk0lMjBzbyUyMHRoZXklMjBjYW4lMjBydW4lMjBhcmJpdHJhcnklMjBjb2RlJTIwaW4lMjBpdC4lMjIlN0QlNUQlN0QlNUQlN0QlNUQlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIycGFyYWdyYXBoJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0ZXh0JTIyJTNBJTIyQXMlMjBzdWNoJTJDJTIwQWdlbnRDb3JlJTIwUnVudGltZSdzJTIwZXhlY3V0aW9uJTIwZW52aXJvbm1lbnQlMjBpcyUyMG1vcmUlMjBsb2NrZWQlMjBkb3duJTJDJTIwd2hlcmVhcyUyMExhbWJkYSUyME1pY3JvVk1zJTIwZ2l2ZXMlMjB5b3UlMjBmdWxsJTIwcmVpbiUyMG9mJTIwdGhlJTIwVk0uJTIyJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMkElMjBnb29kJTIwYW5hbG9neSUyMGlzJTIwdGhhdCUyMEFnZW50Q29yZSUyMFJ1bnRpbWUlMjBpcyUyMHRvJTIwTGFtYmRhJTIwTWljcm9WTXMlMjB3aGF0JTIwRmFyZ2F0ZSUyMGlzJTIwdG8lMjBFQzIuJTIwRmFyZ2F0ZSUyMHJ1bnMlMjB5b3VyJTIwY29udGFpbmVyJTIwaW4lMjBhJTIwbWljcm9WTSUyMGJ1dCUyMGNvbnN0cmFpbnMlMjB3aGF0JTIweW91JTIwY2FuJTIwZG8lMjB3aXRoaW4lMjBpdC4lMjBFQzIlMjBnaXZlcyUyMHlvdSUyMHRoZSUyMGZ1bGwlMjBtYWNoaW5lLiUyMiU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJwYXJhZ3JhcGglMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJBZ2VudENvcmUlMjBnaXZlcyUyMHlvdSUyMG1hbmFnZWQlMjBjb250YWluZXIlMjBob3N0aW5nJTIwaW4lMjBhJTIwbWljcm9WTS4lMjBMYW1iZGElMjBNaWNyb1ZNcyUyMGdpdmVzJTIweW91JTIwdGhlJTIwVk0lMjBpdHNlbGYuJTIwVGhlJTIwaXNvbGF0aW9uJTIwYm91bmRhcnklMjBpcyUyMHRoZSUyMHNhbWUlMjAoRmlyZWNyYWNrZXIpJTJDJTIwYnV0JTIwd2hhdCUyMHlvdSUyMGNhbiUyMGRvJTIwaW5zaWRlJTIwaXQlMjBpcyUyMG5vdC4lMjIlN0QlNUQlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyaGVhZGluZy10d28lMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJMaW5rcyUyMiUyQyUyMmJvbGQlMjIlM0F0cnVlJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMnVub3JkZXJlZC1saXN0JTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIybGlzdC1pdGVtJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIybGlzdC1pdGVtLWNoaWxkJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0ZXh0JTIyJTNBJTIyJTIyJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmxpbmslMjIlMkMlMjJocmVmJTIyJTNBJTIyaHR0cHMlM0ElMkYlMkZhd3MuYW1hem9uLmNvbSUyRmFib3V0LWF3cyUyRndoYXRzLW5ldyUyRjIwMjYlMkYwNiUyRmF3cy1sYW1iZGEtbWljcm92bXMlMkYlMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJBbm5vdW5jZW1lbnQlMjIlN0QlNUQlN0QlMkMlN0IlMjJ0ZXh0JTIyJTNBJTIyJTIyJTdEJTVEJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmxpc3QtaXRlbSUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmxpc3QtaXRlbS1jaGlsZCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMiUyMiU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJsaW5rJTIyJTJDJTIyaHJlZiUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGYXdzLmFtYXpvbi5jb20lMkZibG9ncyUyRmF3cyUyRnJ1bi1pc29sYXRlZC1zYW5kYm94ZXMtd2l0aC1mdWxsLWxpZmVjeWNsZS1jb250cm9sLWF3cy1sYW1iZGEtaW50cm9kdWNlcy1taWNyb3ZtcyUyRiUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMkxhdW5jaCUyMGJsb2clMjBwb3N0JTIyJTdEJTVEJTdEJTJDJTdCJTIydGV4dCUyMiUzQSUyMiUyMiU3RCU1RCU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJsaXN0LWl0ZW0lMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJsaXN0LWl0ZW0tY2hpbGQlMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjIlMjIlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIybGluayUyMiUyQyUyMmhyZWYlMjIlM0ElMjJodHRwcyUzQSUyRiUyRmRvY3MuYXdzLmFtYXpvbi5jb20lMkZsYW1iZGElMkZsYXRlc3QlMkZkZyUyRmxhbWJkYS1taWNyb3Ztcy1ndWlkZS5odG1sJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0ZXh0JTIyJTNBJTIyRGV2ZWxvcGVyJTIwZ3VpZGUlMjIlN0QlNUQlN0QlMkMlN0IlMjJ0ZXh0JTIyJTNBJTIyJTIyJTdEJTVEJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmxpc3QtaXRlbSUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmxpc3QtaXRlbS1jaGlsZCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMiUyMiU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJsaW5rJTIyJTJDJTIyaHJlZiUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGZG9jcy5hd3MuYW1hem9uLmNvbSUyRmxhbWJkYSUyRmxhdGVzdCUyRm1pY3Jvdm0tYXBpJTJGQVBJX09wZXJhdGlvbnMuaHRtbCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMkFQSSUyMHJlZmVyZW5jZSUyMiU3RCU1RCU3RCUyQyU3QiUyMnRleHQlMjIlM0ElMjIlMjIlN0QlNUQlN0QlNUQlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIybGlzdC1pdGVtJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIybGlzdC1pdGVtLWNoaWxkJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0ZXh0JTIyJTNBJTIyJTIyJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmxpbmslMjIlMkMlMjJocmVmJTIyJTNBJTIyaHR0cHMlM0ElMkYlMkZhd3MuYW1hem9uLmNvbSUyRmxhbWJkYSUyRnByaWNpbmclMkYlMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJQcmljaW5nJTIyJTdEJTVEJTdEJTJDJTdCJTIydGV4dCUyMiUzQSUyMiUyMiU3RCU1RCU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJsaXN0LWl0ZW0lMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJsaXN0LWl0ZW0tY2hpbGQlMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjIlMjIlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIybGluayUyMiUyQyUyMmhyZWYlMjIlM0ElMjJodHRwcyUzQSUyRiUyRmF3c3RlZWxlLmNvbSUyRmJsb2clMkYyMDI2JTJGMDYlMkYyMyUyRnNvbWUtbm90ZXMtb24tbGFtYmRhLW1pY3Jvdm1zLmh0bWwlMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJBaWRhbiUyMFN0ZWVsZSdzJTIwaGFuZHMtb24lMjBub3RlcyUyMiU3RCU1RCU3RCUyQyU3QiUyMnRleHQlMjIlM0ElMjIlMjIlN0QlNUQlN0QlNUQlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIybGlzdC1pdGVtJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIybGlzdC1pdGVtLWNoaWxkJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0ZXh0JTIyJTNBJTIyJTIyJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmxpbmslMjIlMkMlMjJocmVmJTIyJTNBJTIyaHR0cHMlM0ElMkYlMkZkb2NzLmF3cy5hbWF6b24uY29tJTJGYmVkcm9jay1hZ2VudGNvcmUlMkZsYXRlc3QlMkZkZXZndWlkZSUyRnJ1bnRpbWUtaG93LWl0LXdvcmtzLmh0bWwlMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJCZWRyb2NrJTIwQWdlbnRDb3JlJTIwUnVudGltZSUyMiU3RCU1RCU3RCU1RCU3RCU1RCU3RCU1RCU3RCU1RCU3RCU1RA==">
<li data-slate-node="element"><span data-slate-node="element"><a class="ck-link" href="https://aws.amazon.com/about-aws/whats-new/2026/06/aws-lambda-microvms/" target="_blank" rel="noopener" data-slate-node="element" data-slate-inline="true">Announcement</a></span></li>
<li data-slate-node="element"><span data-slate-node="element"><a class="ck-link" href="https://aws.amazon.com/blogs/aws/run-isolated-sandboxes-with-full-lifecycle-control-aws-lambda-introduces-microvms/" target="_blank" rel="noopener" data-slate-node="element" data-slate-inline="true">Launch blog post</a></span></li>
<li data-slate-node="element"><span data-slate-node="element"><a class="ck-link" href="https://docs.aws.amazon.com/lambda/latest/dg/lambda-microvms-guide.html" target="_blank" rel="noopener" data-slate-node="element" data-slate-inline="true">Developer guide</a></span></li>
<li data-slate-node="element"><span data-slate-node="element"><a class="ck-link" href="https://docs.aws.amazon.com/lambda/latest/microvm-api/API_Operations.html" target="_blank" rel="noopener" data-slate-node="element" data-slate-inline="true">API reference</a></span></li>
<li data-slate-node="element"><span data-slate-node="element"><a class="ck-link" href="https://aws.amazon.com/lambda/pricing/" target="_blank" rel="noopener" data-slate-node="element" data-slate-inline="true">Pricing</a></span></li>
<li data-slate-node="element"><span data-slate-node="element"><a class="ck-link" href="https://awsteele.com/blog/2026/06/23/some-notes-on-lambda-microvms.html" target="_blank" rel="noopener" data-slate-node="element" data-slate-inline="true">Aidan Steele&#8217;s hands-on notes</a></span></li>
<li data-slate-node="element"><span data-slate-node="element"><a class="ck-link" href="https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/runtime-how-it-works.html" target="_blank" rel="noopener" data-slate-node="element" data-slate-inline="true">Bedrock AgentCore Runtime</a></span></li>
</ul>
<h3 class="crp-list-title">Related Posts</h3><div class="crp-list"><div class="crp-list-item crp-list-item-image-left crp-list-item-has-image"><div class="crp-list-item-image"><a href="https://theburningmonk.com/2025/12/what-you-need-to-know-about-lambda-managed-instances/"><img decoding="async" data-pin-nopin="true" style="max-width: 128px; height: auto;" width="128" height="72" src="https://theburningmonk.com/wp-content/uploads/2025/12/lambda-managed-instances-title-300x169.png" class="attachment-128x72 size-128x72 wp-post-image" alt="" srcset="https://theburningmonk.com/wp-content/uploads/2025/12/lambda-managed-instances-title-300x169.png 300w, https://theburningmonk.com/wp-content/uploads/2025/12/lambda-managed-instances-title-779x438.png 779w, https://theburningmonk.com/wp-content/uploads/2025/12/lambda-managed-instances-title.png 1024w" sizes="(max-width: 128px) 100vw, 128px" /></a></div><div class="crp-list-item-title"><a href="https://theburningmonk.com/2025/12/what-you-need-to-know-about-lambda-managed-instances/">What you need to know about Lambda Managed Instances</a></div></div></div>
<p>The post <a href="https://theburningmonk.com/2026/06/what-you-need-to-know-about-lambda-microvms/">What you need to know about Lambda MicroVMs</a> appeared first on <a href="https://theburningmonk.com">theburningmonk.com</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Inbox &#038; Outbox patterns for reliable event processing</title>
		<link>https://theburningmonk.com/2026/05/inbox-outbox-patterns-for-reliable-event-processing/</link>
		
		<dc:creator><![CDATA[Yan Cui]]></dc:creator>
		<pubDate>Mon, 04 May 2026 23:54:17 +0000</pubDate>
				<category><![CDATA[AWS]]></category>
		<category><![CDATA[Event-Driven Architecture]]></category>
		<category><![CDATA[EventBridge]]></category>
		<category><![CDATA[Serverless]]></category>
		<category><![CDATA[EDA]]></category>
		<guid isPermaLink="false">https://theburningmonk.com/?p=15899</guid>

					<description><![CDATA[<p>Modern applications rarely do just one thing at a time.</p>
<p>An API request creates an order, and then another service needs to reserve stock, another to charge the customer, another to send an email, and so on. In a serverless or event-driven architecture, follow-up actions are usually triggered by messages (either events or commands).</p>
<p>The Inbox and Outbox patterns are often used together to build reliable event processing flows.</p>
<p>Outbox Pattern: ensure state changes reliably produce events.<br />
Inbox Pattern: ensure incoming events are processed safely, even when they are delivered multiple times.</p>
<p>The post <a href="https://theburningmonk.com/2026/05/inbox-outbox-patterns-for-reliable-event-processing/">Inbox &#038; Outbox patterns for reliable event processing</a> appeared first on <a href="https://theburningmonk.com">theburningmonk.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="graf graf--p">Modern applications rarely do just one thing at a time.</p>
<p class="graf graf--p">An API request creates an order, and then another service needs to reserve stock, another to charge the customer, another to send an email, and so on. In a serverless or event-driven architecture, follow-up actions are usually triggered by messages (either events or commands).</p>
<p class="graf graf--p">That gives us loose coupling, better scalability, and independent services. But it also introduces a reliability problem.</p>
<p class="graf graf--p graf--startsWithDoubleQuote">“What happens when the database update succeeds, but publishing the event fails?”</p>
<p class="graf graf--p">Or the opposite:</p>
<p class="graf graf--p graf--startsWithDoubleQuote">“What happens when a consumer processes an event successfully, but crashes before acknowledging it?”</p>
<p class="graf graf--p">This is where the <strong class="markup--strong markup--p-strong">Outbox Pattern</strong> and <strong class="markup--strong markup--p-strong">Inbox Pattern</strong> come in.</p>
<p class="graf graf--p">The TL;DR is:</p>
<ul class="postList">
<li class="graf graf--li"><strong class="markup--strong markup--li-strong">Outbox Pattern</strong>: ensure state changes reliably produce events.</li>
<li class="graf graf--li"><strong class="markup--strong markup--li-strong">Inbox Pattern</strong>: ensure incoming events are processed safely, even when they are delivered multiple times.</li>
</ul>
<p class="graf graf--p">They are often used together to build reliable event processing flows.</p>
<h3 class="graf graf--h4">The problem with naive event publishing</h3>
<p class="graf graf--p">Imagine an <code class="markup--code markup--p-code">Orders</code> service that stores orders in DynamoDB and publishes an <code class="markup--code markup--p-code">OrderCreated</code> event to EventBridge.</p>
<p class="graf graf--p">The simplest implementation might look like this:</p>
<pre class="graf graf--pre graf--preV2" spellcheck="false" data-code-block-mode="1" data-code-block-lang="php"><span class="pre--content">await dynamodb.<span class="hljs-title function_ invoke__">putItem</span>({
  <span class="hljs-attr">TableName</span>: <span class="hljs-string">'Orders'</span>,
  <span class="hljs-attr">Item</span>: order
});

await eventbridge.<span class="hljs-title function_ invoke__">putEvents</span>({
  <span class="hljs-attr">Entries</span>: [{
    <span class="hljs-attr">Source</span>: <span class="hljs-string">'myapp.orders'</span>,
    <span class="hljs-attr">DetailType</span>: <span class="hljs-string">'OrderCreated'</span>,
    <span class="hljs-attr">Detail</span>: JSON.<span class="hljs-title function_ invoke__">stringify</span>({ <span class="hljs-attr">orderId</span>: order.id })
  }]
});</span></pre>
<p class="graf graf--p">This looks fine, but it has a failure case.</p>
<figure class="graf graf--figure">
<p id="LgfiPHx"><img fetchpriority="high" decoding="async" class="alignnone wp-image-15900" src="https://theburningmonk.com/wp-content/uploads/2026/05/img_69f9314f2b2ec.png" alt="" width="600" height="328" srcset="https://theburningmonk.com/wp-content/uploads/2026/05/img_69f9314f2b2ec.png 1024w, https://theburningmonk.com/wp-content/uploads/2026/05/img_69f9314f2b2ec-300x164.png 300w, https://theburningmonk.com/wp-content/uploads/2026/05/img_69f9314f2b2ec-779x426.png 779w" sizes="(max-width: 600px) 100vw, 600px" /></p>
</figure>
<p class="graf graf--p">Now, the order exists, but the event was never published.</p>
<p class="graf graf--p">Downstream services do not know the order exists. Inventory is not reserved. Payment is not started. The customer does not receive a confirmation email.</p>
<p class="graf graf--p">The mistake here is treating the database write and the event publish as if they are one atomic operation. They are not.</p>
<p class="graf graf--p">This is a distributed transaction problem.</p>
<h3 class="graf graf--h3">The Outbox Pattern</h3>
<p class="graf graf--p">The <strong class="markup--strong markup--p-strong">Outbox </strong>pattern solves the “database updated but event not published” problem.</p>
<p class="graf graf--p">Instead of writing to the database and then immediately publishing to EventBridge, the service writes both the order and the outgoing event (the <strong class="markup--strong markup--p-strong">outbox item</strong>) in a single database transaction.</p>
<p class="graf graf--p">Later on, another process will pick up the outbox item and publish it to EventBridge asynchronously.</p>
<p class="graf graf--p">The idea is simple: first persist the intent to publish, then publish later.</p>
<p class="graf graf--p">You can easily implement the Outbox pattern with DynamoDB and EventBridge Pipes.</p>
<p class="graf graf--p">For example, you’d have an Orders table and an Outbox table and use <code class="markup--code markup--p-code">TransactWriteItems</code> to write both records atomically.</p>
<p class="graf graf--p">From here, DynamoDB Streams captures the <code class="markup--code markup--p-code">INSERT</code> events from the Outbox table. EventBridge Pipes reads from the stream, optionally filters and enriches the records, then sends matching records to an EventBridge event bus. All without writing any custom glue code.</p>
<p id="CFXpxHM"><img decoding="async" class="alignnone wp-image-15901" src="https://theburningmonk.com/wp-content/uploads/2026/05/img_69f93172962f0.png" alt="" width="800" height="270" srcset="https://theburningmonk.com/wp-content/uploads/2026/05/img_69f93172962f0.png 1024w, https://theburningmonk.com/wp-content/uploads/2026/05/img_69f93172962f0-300x101.png 300w, https://theburningmonk.com/wp-content/uploads/2026/05/img_69f93172962f0-779x263.png 779w, https://theburningmonk.com/wp-content/uploads/2026/05/img_69f93172962f0-1536x518.png 1536w" sizes="(max-width: 800px) 100vw, 800px" /></p>
<p class="graf graf--p">A raw DynamoDB stream record is a database change notification. It contains DynamoDB-specific structure, such as <code class="markup--code markup--p-code">NewImage</code>, <code class="markup--code markup--p-code">OldImage</code>, keys, and attribute types.</p>
<p class="graf graf--p">That is not what you want downstream services to consume.</p>
<p class="graf graf--p">Instead, the pipe should transform the DynamoDB <code class="markup--code markup--p-code">INSERT</code> event into a clean domain event before sending it to EventBridge. Also, don’t forget to <a class="markup--anchor markup--p-anchor" href="https://theburningmonk.com/2024/11/eventbridge-best-practice-why-you-should-wrap-events-in-event-envelopes/" target="_blank" rel="noopener" data-href="https://theburningmonk.com/2024/11/eventbridge-best-practice-why-you-should-wrap-events-in-event-envelopes/">wrap the event in an envelope</a> so you can capture important metadata with the event payload.</p>
<pre class="graf graf--pre graf--preV2" spellcheck="false" data-code-block-mode="1" data-code-block-lang="json"><span class="pre--content"><span class="hljs-punctuation">{</span>
  <span class="hljs-attr">"version"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"1.0"</span><span class="hljs-punctuation">,</span>
  <span class="hljs-attr">"id"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"01J..."</span><span class="hljs-punctuation">,</span>
  <span class="hljs-attr">"source"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"order-service"</span><span class="hljs-punctuation">,</span>
  <span class="hljs-attr">"detail-type"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"OrderCreated"</span><span class="hljs-punctuation">,</span>
  <span class="hljs-attr">"time"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"2026-05-04T10:15:00Z"</span><span class="hljs-punctuation">,</span>
  <span class="hljs-attr">"detail"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
    <span class="hljs-attr">"metadata"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
      <span class="hljs-attr">"id"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"01HXHMF28A94NS7NSHC5GM80F4"</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"version"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"1"</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"timestamp"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"2020-04-28T07:20:20Z"</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"domain"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"orders"</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"service"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"order-service"</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"type"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"order-placed"</span>
    <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
    <span class="hljs-attr">"data"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
      <span class="hljs-attr">"user_id"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"123456"</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"order_id"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"1234567890123"</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"restaurant_id"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"123456789"</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"currency"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"USD"</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"total"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"42.42"</span>
    <span class="hljs-punctuation">}</span>
  <span class="hljs-punctuation">}</span>
<span class="hljs-punctuation">}</span></span></pre>
<p class="graf graf--p">There are many variations to this basic pattern.</p>
<p class="graf graf--p">For example, you may replace EventBridge Pipes with a Lambda function if the publishing step has real business logic.</p>
<p class="graf graf--p">Or you may forego the Outbox table altogether and derive the outgoing event from the inserted Order item. However, if you wish to track the status of the outbox item (e.g. from <code class="markup--code markup--p-code">PENDING</code> to <code class="markup--code markup--p-code">PUBLISHED</code>), then this is not a viable option.</p>
<h3 class="graf graf--h3">The Inbox Pattern</h3>
<p class="graf graf--p">The <strong class="markup--strong markup--p-strong">Inbox </strong>pattern solves the duplicate delivery problem on the consumer side.</p>
<p class="graf graf--p">Most event and messaging systems should be treated as at least once delivery systems from the application’s point of view. Even if the infrastructure reduces duplicates, your business logic should still assume duplicates are possible.</p>
<p class="graf graf--p">This is especially true for Lambda, because all async invocations (e.g. via EventBridge or SNS) have at least-once delivery.</p>
<p class="graf graf--p">Without protection, the payment service might charge the customer twice!</p>
<p class="graf graf--p">The Inbox Pattern prevents that by recording which messages have already been processed.</p>
<p class="graf graf--p">The consumer stores the incoming event ID in an Inbox table, and the inbox item then acts as a deduplication key.</p>
<p class="graf graf--p">The key to implementing this pattern with DynamoDB is to use conditional writes to ensure the event ID does not exist in the Inbox table already.</p>
<h4>Inbox vs. Idempotency</h4>
<p class="graf graf--p">You might be wondering,</p>
<p class="graf graf--p graf--startsWithDoubleQuote"><em class="markup--em markup--p-em">“How is this different from using simple idempotency keys?”</em></p>
<p class="graf graf--p">These are related ideas that mainly differ in scope.</p>
<p class="graf graf--p">An idempotency key protects one business operation. Whereas the Inbox pattern protects message processing.</p>
<p class="graf graf--p">Within one message processing, there might be several business operations, each with its own idempotency key.</p>
<p class="graf graf--p">The Inbox pattern is idempotency applied at the <strong class="markup--strong markup--p-strong">message processing </strong>boundary, using the message/event ID as the deduplication key.</p>
<h4 class="graf graf--h4">Inbox item first, or business update first?</h4>
<p class="graf graf--p">Avoid this flow:</p>
<ol>
<li class="graf graf--p">Write inbox item.</li>
<li class="graf graf--p">Commit.</li>
<li class="graf graf--p">Perform business update.</li>
</ol>
<p class="graf graf--p">If step 1 succeeds and step 3 fails, future retries will see the inbox item and skip processing, even though the business action never happened.</p>
<p class="graf graf--p">Also, avoid this flow:</p>
<ol>
<li class="graf graf--p">Perform business update.</li>
<li class="graf graf--p">Commit.</li>
<li class="graf graf--p">Write inbox item.</li>
</ol>
<p class="graf graf--p">If step 1 succeeds and step 3 fails, future retries may repeat the business action.</p>
<p class="graf graf--p">The safest solution is to write the inbox item and business change in the same transaction.</p>
<p class="graf graf--p">But what if that’s not possible? For example, what if there are intermediate side-effecting actions, such as calling a third-party API?</p>
<p class="graf graf--p">In that case, this is a safer flow:</p>
<ol class="postList">
<li class="graf graf--li">Try to write the inbox item with status = <strong>PROCESSING</strong> and a <strong>lock expiration</strong>.</li>
<li class="graf graf--li">If the insert succeeds, this worker owns the event.</li>
<li class="graf graf--li">If the insert fails, another worker has already claimed or processed it.</li>
<li class="graf graf--li">Only the owner performs side effects.</li>
<li class="graf graf--li">Mark the inbox item as <strong>PROCESSED</strong>.</li>
</ol>
<p class="graf graf--p">If the first worker fails or times out, a subsequent retry can resume processing after the lock has expired.</p>
<p class="graf graf--p">But what about the side effects that the first worker has already performed?</p>
<p class="graf graf--p">That’s where we also need idempotency keys to protect the individual side-effecting actions!</p>
<h3 class="graf graf--h3">Final thoughts</h3>
<p class="graf graf--p">Most real-world event-driven systems have both consumers and producers.</p>
<p class="graf graf--p">For example, the payment service consumes <code class="markup--code markup--p-code">OrderCreated</code> and publishes <code class="markup--code markup--p-code">PaymentSucceeded</code> or <code class="markup--code markup--p-code">PaymentFailed</code> events.</p>
<p class="graf graf--p">That means it needs both patterns:</p>
<ul class="postList">
<li class="graf graf--li">Producers use the Outbox pattern to ensure events are reliably published.</li>
<li class="graf graf--li">Consumers use the Inbox pattern to ensure exactly-once message processing.</li>
</ul>
<p>These patterns are not about making failures impossible. They are about making failures safe.</p>
<p>The Outbox pattern accepts that publishing can fail, so it first stores the intent to publish.</p>
<p>The Inbox pattern accepts that duplicate deliveries can happen, so it makes message handling idempotent.</p>
<p>Together, they give you a strong foundation for reliable event processing.</p>
<h3 class="crp-list-title">Related Posts</h3><div class="crp-list"><div class="crp-list-item crp-list-item-image-left crp-list-item-has-image"><div class="crp-list-item-image"><a href="https://theburningmonk.com/2025/04/event-versioning-strategies-for-event-driven-architectures/"><img loading="lazy" decoding="async" data-pin-nopin="true" style="max-width: 128px; height: auto;" width="128" height="72" src="https://theburningmonk.com/wp-content/uploads/2025/04/event-versioning-title-300x169.png" class="attachment-128x72 size-128x72 wp-post-image" alt="" srcset="https://theburningmonk.com/wp-content/uploads/2025/04/event-versioning-title-300x169.png 300w, https://theburningmonk.com/wp-content/uploads/2025/04/event-versioning-title-779x438.png 779w, https://theburningmonk.com/wp-content/uploads/2025/04/event-versioning-title.png 1024w" sizes="auto, (max-width: 128px) 100vw, 128px" /></a></div><div class="crp-list-item-title"><a href="https://theburningmonk.com/2025/04/event-versioning-strategies-for-event-driven-architectures/">Event versioning strategies for event-driven architectures</a></div></div><div class="crp-list-item crp-list-item-image-left crp-list-item-has-image"><div class="crp-list-item-image"><a href="https://theburningmonk.com/2025/02/event-driven-architectures-how-to-limit-the-scope-of-end-to-end-tests/"><img loading="lazy" decoding="async" data-pin-nopin="true" style="max-width: 128px; height: auto;" width="128" height="72" src="https://theburningmonk.com/wp-content/uploads/2025/02/limit-e2e-test-scope-title-300x169.png" class="attachment-128x72 size-128x72 wp-post-image" alt="" srcset="https://theburningmonk.com/wp-content/uploads/2025/02/limit-e2e-test-scope-title-300x169.png 300w, https://theburningmonk.com/wp-content/uploads/2025/02/limit-e2e-test-scope-title-779x438.png 779w, https://theburningmonk.com/wp-content/uploads/2025/02/limit-e2e-test-scope-title.png 1024w" sizes="auto, (max-width: 128px) 100vw, 128px" /></a></div><div class="crp-list-item-title"><a href="https://theburningmonk.com/2025/02/event-driven-architectures-how-to-limit-the-scope-of-end-to-end-tests/">Event-Driven Architectures: How to limit the scope of end-to-end tests</a></div></div><div class="crp-list-item crp-list-item-image-left crp-list-item-has-image"><div class="crp-list-item-image"><a href="https://theburningmonk.com/2024/11/eventbridge-best-practice-why-you-should-wrap-events-in-event-envelopes/"><img loading="lazy" decoding="async" data-pin-nopin="true" style="max-width: 128px; height: auto;" width="128" height="72" src="https://theburningmonk.com/wp-content/uploads/2024/11/eda-event-envelopes-feature-300x169.png" class="attachment-128x72 size-128x72 wp-post-image" alt="" srcset="https://theburningmonk.com/wp-content/uploads/2024/11/eda-event-envelopes-feature-300x169.png 300w, https://theburningmonk.com/wp-content/uploads/2024/11/eda-event-envelopes-feature-779x438.png 779w, https://theburningmonk.com/wp-content/uploads/2024/11/eda-event-envelopes-feature.png 1024w" sizes="auto, (max-width: 128px) 100vw, 128px" /></a></div><div class="crp-list-item-title"><a href="https://theburningmonk.com/2024/11/eventbridge-best-practice-why-you-should-wrap-events-in-event-envelopes/">EventBridge best practice: why you should wrap events in event envelopes</a></div></div><div class="crp-list-item crp-list-item-image-left crp-list-item-has-image"><div class="crp-list-item-image"><a href="https://theburningmonk.com/2025/03/how-to-implement-durable-execution-for-lambda-without-frameworks/"><img loading="lazy" decoding="async" data-pin-nopin="true" style="max-width: 128px; height: auto;" width="128" height="72" src="https://theburningmonk.com/wp-content/uploads/2025/03/durable-execution-title-300x169.png" class="attachment-128x72 size-128x72 wp-post-image" alt="" srcset="https://theburningmonk.com/wp-content/uploads/2025/03/durable-execution-title-300x169.png 300w, https://theburningmonk.com/wp-content/uploads/2025/03/durable-execution-title-779x438.png 779w, https://theburningmonk.com/wp-content/uploads/2025/03/durable-execution-title.png 1024w" sizes="auto, (max-width: 128px) 100vw, 128px" /></a></div><div class="crp-list-item-title"><a href="https://theburningmonk.com/2025/03/how-to-implement-durable-execution-for-lambda-without-frameworks/">How to implement Durable Execution for Lambda (without frameworks)</a></div></div><div class="crp-list-item crp-list-item-image-left crp-list-item-has-image"><div class="crp-list-item-image"><a href="https://theburningmonk.com/2024/01/how-would-you-reprocess-lambda-dead-letter-queue-messages-on-demand/"><img loading="lazy" decoding="async" data-pin-nopin="true" style="max-width: 128px; height: auto;" width="128" height="72" src="https://theburningmonk.com/wp-content/uploads/2024/01/assets._001-300x169.png" class="attachment-128x72 size-128x72 wp-post-image" alt="" srcset="https://theburningmonk.com/wp-content/uploads/2024/01/assets._001-300x169.png 300w, https://theburningmonk.com/wp-content/uploads/2024/01/assets._001.png 1024w" sizes="auto, (max-width: 128px) 100vw, 128px" /></a></div><div class="crp-list-item-title"><a href="https://theburningmonk.com/2024/01/how-would-you-reprocess-lambda-dead-letter-queue-messages-on-demand/">How to reprocess Lambda dead-letter queue messages on-demand</a></div></div><div class="crp-list-item crp-list-item-image-left crp-list-item-has-image"><div class="crp-list-item-image"><a href="https://theburningmonk.com/2025/05/understanding-push-vs-poll-in-event-driven-architectures/"><img loading="lazy" decoding="async" data-pin-nopin="true" style="max-width: 128px; height: auto;" width="128" height="72" src="https://theburningmonk.com/wp-content/uploads/2025/05/push-vs-poll-title-300x169.png" class="attachment-128x72 size-128x72 wp-post-image" alt="" srcset="https://theburningmonk.com/wp-content/uploads/2025/05/push-vs-poll-title-300x169.png 300w, https://theburningmonk.com/wp-content/uploads/2025/05/push-vs-poll-title-779x438.png 779w, https://theburningmonk.com/wp-content/uploads/2025/05/push-vs-poll-title.png 1024w" sizes="auto, (max-width: 128px) 100vw, 128px" /></a></div><div class="crp-list-item-title"><a href="https://theburningmonk.com/2025/05/understanding-push-vs-poll-in-event-driven-architectures/">Understanding push vs poll in event-driven architectures</a></div></div><div class="crp-list-item crp-list-item-image-left crp-list-item-has-image"><div class="crp-list-item-image"><a href="https://theburningmonk.com/2024/11/when-to-use-light-events-vs-rich-events-in-event-driven-architectures/"><img loading="lazy" decoding="async" data-pin-nopin="true" style="max-width: 128px; height: auto;" width="128" height="72" src="https://theburningmonk.com/wp-content/uploads/2024/11/light-vs-rich-events-title-300x169.png" class="attachment-128x72 size-128x72 wp-post-image" alt="" srcset="https://theburningmonk.com/wp-content/uploads/2024/11/light-vs-rich-events-title-300x169.png 300w, https://theburningmonk.com/wp-content/uploads/2024/11/light-vs-rich-events-title-779x438.png 779w, https://theburningmonk.com/wp-content/uploads/2024/11/light-vs-rich-events-title.png 1024w" sizes="auto, (max-width: 128px) 100vw, 128px" /></a></div><div class="crp-list-item-title"><a href="https://theburningmonk.com/2024/11/when-to-use-light-events-vs-rich-events-in-event-driven-architectures/">When to use Light Events vs. Rich Events in Event-Driven Architectures</a></div></div></div>
<p>The post <a href="https://theburningmonk.com/2026/05/inbox-outbox-patterns-for-reliable-event-processing/">Inbox &#038; Outbox patterns for reliable event processing</a> appeared first on <a href="https://theburningmonk.com">theburningmonk.com</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The anti-polling pattern for Step Functions</title>
		<link>https://theburningmonk.com/2026/02/the-anti-polling-pattern-for-step-functions/</link>
		
		<dc:creator><![CDATA[Yan Cui]]></dc:creator>
		<pubDate>Fri, 06 Feb 2026 01:36:17 +0000</pubDate>
				<category><![CDATA[AWS]]></category>
		<category><![CDATA[Lambda]]></category>
		<category><![CDATA[Serverless]]></category>
		<category><![CDATA[Step Functions]]></category>
		<category><![CDATA[Durable Function]]></category>
		<guid isPermaLink="false">https://theburningmonk.com/?p=15889</guid>

					<description><![CDATA[<p>Step Functions is often used to poll long-running processes, e.g. when starting a new data migration task with Amazon Database Migration.</p>
<p>There's usually a Wait -> Poll -> Choice loop that runs until the task is complete (or failed).</p>
<p>Polling is often the default solution because it’s easy, not because it’s good.</p>
<p>If you can get an event (or a callback), you can stop spinning your state machine and start treating "waiting" as a first-class step. Less noise, fewer transitions, lower cost.</p>
<p>The post <a href="https://theburningmonk.com/2026/02/the-anti-polling-pattern-for-step-functions/">The anti-polling pattern for Step Functions</a> appeared first on <a href="https://theburningmonk.com">theburningmonk.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">Step Functions is often used to poll long-running processes, e.g. when starting a new data migration task with Amazon Database Migration.</span></p>
<p class="ck-paragraph" data-slate-node="element" data-slate-fragment="JTVCJTdCJTIydHlwZSUyMiUzQSUyMmRvY3VtZW50JTIyJTJDJTIydGhlbWUlMjIlM0ElN0IlMjJkb2N1bWVudCUyMiUzQSU3QiUyMmJhY2tncm91bmRDb2xvciUyMiUzQSUyMiUyM0ZGRkZGRiUyMiU3RCU3RCUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMlN0ZXAlMjBGdW5jdGlvbnMlMjBpcyUyMG9mdGVuJTIwdXNlZCUyMHRvJTIwcG9sbCUyMGxvbmctcnVubmluZyUyMHByb2Nlc3NlcyUyQyUyMGUuZy4lMjB3aGVuJTIwc3RhcnRpbmclMjBhJTIwbmV3JTIwZGF0YSUyMG1pZ3JhdGlvbiUyMHRhc2slMjB3aXRoJTIwQW1hem9uJTIwRGF0YWJhc2UlMjBNaWdyYXRpb24uJTIyJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMlRoZXJlJ3MlMjB1c3VhbGx5JTIwYSUyMFdhaXQlMjAtJTNFJTIwUG9sbCUyMC0lM0UlMjBDaG9pY2UlMjBsb29wJTIwdGhhdCUyMHJ1bnMlMjB1bnRpbCUyMHRoZSUyMHRhc2slMjBpcyUyMGNvbXBsZXRlJTIwKG9yJTIwZmFpbGVkKSUyQyUyMGxpa2UlMjB0aGUlMjBvbmUlMjBiZWxvdy4lMjIlN0QlNUQlN0QlNUQlN0QlNUQ="><span data-slate-node="text">There&#8217;s usually a Wait -&gt; Poll -&gt; Choice loop that runs until the task is complete (or failed), like the one below.</span></p>
<p id="HTXKpoV"><img loading="lazy" decoding="async" class="alignnone wp-image-15890" src="https://theburningmonk.com/wp-content/uploads/2026/02/img_698544e3e4bcf.png" alt="" width="500" height="550" srcset="https://theburningmonk.com/wp-content/uploads/2026/02/img_698544e3e4bcf.png 828w, https://theburningmonk.com/wp-content/uploads/2026/02/img_698544e3e4bcf-273x300.png 273w, https://theburningmonk.com/wp-content/uploads/2026/02/img_698544e3e4bcf-779x856.png 779w" sizes="auto, (max-width: 500px) 100vw, 500px" /></p>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">Polling is inefficient and can add unnecessary cost as standard workflows are charged based on the number of state transitions.</span></p>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">There is an event-driven alternative to this approach.</span></p>
<p class="ck-paragraph" data-slate-node="element" data-slate-fragment="JTVCJTdCJTIydHlwZSUyMiUzQSUyMmRvY3VtZW50JTIyJTJDJTIydGhlbWUlMjIlM0ElN0IlMjJkb2N1bWVudCUyMiUzQSU3QiUyMmJhY2tncm91bmRDb2xvciUyMiUzQSUyMiUyM0ZGRkZGRiUyMiU3RCU3RCUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMlBvbGxpbmclMjBpcyUyMGluZWZmaWNpZW50JTIwYW5kJTIwY2FuJTIwYWRkJTIwdW5uZWNlc3NhcnklMjBjb3N0JTIwYXMlMjBzdGFuZGFyZCUyMHdvcmtmbG93cyUyMGFyZSUyMGNoYXJnZWQlMjBiYXNlZCUyMG9uJTIwdGhlJTIwbnVtYmVyJTIwb2YlMjBzdGF0ZSUyMHRyYW5zaXRpb25zLiUyMiU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJwYXJhZ3JhcGglMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJUaGVyZSUyMGlzJTIwYW4lMjBldmVudC1kcml2ZW4lMjBhbHRlcm5hdGl2ZSUyMHRvJTIwdGhpcyUyMGFwcHJvYWNoLiUyMiU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJwYXJhZ3JhcGglMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJIZXJlJ3MlMjB0aGUlMjBoaWdoJTIwbGV2ZWwlMjBhcHByb2FjaCUzQSUyMiU3RCU1RCU3RCU1RCU3RCU1RA=="><span data-slate-node="text">Here&#8217;s the high level approach:</span></p>
<p id="NukwqQy"><img loading="lazy" decoding="async" class="alignnone wp-image-15891" src="https://theburningmonk.com/wp-content/uploads/2026/02/img_698544ff0c2cd.png" alt="" width="700" height="426" srcset="https://theburningmonk.com/wp-content/uploads/2026/02/img_698544ff0c2cd.png 1024w, https://theburningmonk.com/wp-content/uploads/2026/02/img_698544ff0c2cd-300x183.png 300w, https://theburningmonk.com/wp-content/uploads/2026/02/img_698544ff0c2cd-779x474.png 779w" sizes="auto, (max-width: 700px) 100vw, 700px" /></p>
<ol class="ck-ordered-list" data-slate-node="element">
<li data-slate-node="element"><span data-slate-node="element">To start the data migration, the state machine calls a Lambda function with a task token (required for callback). This pauses the state machine execution.</span></li>
<li data-slate-node="element"><span data-slate-node="element">The Lambda function calls the Database Migration service to start the data migration.</span></li>
<li data-slate-node="element"><span data-slate-node="element">The function saves the data migration ARN (hash key) and the callback token in DynamoDB, along with other relevant information (created date, etc.)</span></li>
<li data-slate-node="element"><span data-slate-node="element">The Database Migration service publishes &#8220;StateChange&#8221; events to the default EventBridge event bus (see docs <a class="ck-link" href="https://docs.aws.amazon.com/dms/latest/userguide/CHAP_EventBridge.html" target="_blank" rel="noopener" data-slate-node="element" data-slate-inline="true">here</a>). A Lambda function subscribes to this event and waits for a replication task to finish or fail.</span></li>
<li data-slate-node="element"><span data-slate-node="element">When triggered, the function extracts the data migration ARN from the event payload and retrieves the Step Functions task token from DynamoDB.</span></li>
<li data-slate-node="element"><span data-slate-node="element">It can use the task token to send a success or failure signal back to the state machine execution. From here, the state machine can proceed with the rest of its steps.</span></li>
</ol>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">This is a more efficient but also more complex approach. There are more moving parts involved, but it&#8217;s simple to implement.</span></p>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">But what if you&#8217;re calling a 3rd party API that do not support events?</span></p>
<p class="ck-paragraph" data-slate-node="element" data-slate-fragment="JTVCJTdCJTIydHlwZSUyMiUzQSUyMmRvY3VtZW50JTIyJTJDJTIydGhlbWUlMjIlM0ElN0IlMjJkb2N1bWVudCUyMiUzQSU3QiUyMmJhY2tncm91bmRDb2xvciUyMiUzQSUyMiUyM0ZGRkZGRiUyMiU3RCU3RCUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMm9yZGVyZWQtbGlzdCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmxpc3QtaXRlbSUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmxpc3QtaXRlbS1jaGlsZCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMlRvJTIwc3RhcnQlMjB0aGUlMjBkYXRhJTIwbWlncmF0aW9uJTJDJTIwdGhlJTIwc3RhdGUlMjBtYWNoaW5lJTIwY2FsbHMlMjBhJTIwTGFtYmRhJTIwZnVuY3Rpb24lMjB3aXRoJTIwYSUyMHRhc2slMjB0b2tlbiUyMChyZXF1aXJlZCUyMGZvciUyMGNhbGxiYWNrKS4lMjBUaGlzJTIwcGF1c2VzJTIwdGhlJTIwc3RhdGUlMjBtYWNoaW5lJTIwZXhlY3V0aW9uLiUyMiU3RCU1RCU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJsaXN0LWl0ZW0lMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJsaXN0LWl0ZW0tY2hpbGQlMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJUaGUlMjBMYW1iZGElMjBmdW5jdGlvbiUyMGNhbGxzJTIwdGhlJTIwRGF0YWJhc2UlMjBNaWdyYXRpb24lMjBzZXJ2aWNlJTIwdG8lMjBzdGFydCUyMHRoZSUyMGRhdGElMjBtaWdyYXRpb24uJTIyJTdEJTVEJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmxpc3QtaXRlbSUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmxpc3QtaXRlbS1jaGlsZCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMlRoZSUyMGZ1bmN0aW9uJTIwc2F2ZXMlMjB0aGUlMjBkYXRhJTIwbWlncmF0aW9uJTIwQVJOJTIwKGhhc2glMjBrZXkpJTIwYW5kJTIwdGhlJTIwY2FsbGJhY2slMjB0b2tlbiUyMGluJTIwRHluYW1vREIlMkMlMjBhbG9uZyUyMHdpdGglMjBvdGhlciUyMHJlbGV2YW50JTIwaW5mb3JtYXRpb24lMjAoY3JlYXRlZCUyMGRhdGUlMkMlMjBldGMuKSUyMiU3RCU1RCU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJsaXN0LWl0ZW0lMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJsaXN0LWl0ZW0tY2hpbGQlMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJUaGUlMjBEYXRhYmFzZSUyME1pZ3JhdGlvbiUyMHNlcnZpY2UlMjBwdWJsaXNoZXMlMjAlNUMlMjJTdGF0ZUNoYW5nZSU1QyUyMiUyMGV2ZW50cyUyMHRvJTIwdGhlJTIwZGVmYXVsdCUyMEV2ZW50QnJpZGdlJTIwZXZlbnQlMjBidXMlMjAoc2VlJTIwZG9jcyUyMCUyMiU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJsaW5rJTIyJTJDJTIyaHJlZiUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGZG9jcy5hd3MuYW1hem9uLmNvbSUyRmRtcyUyRmxhdGVzdCUyRnVzZXJndWlkZSUyRkNIQVBfRXZlbnRCcmlkZ2UuaHRtbCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMmhlcmUlMjIlN0QlNUQlN0QlMkMlN0IlMjJ0ZXh0JTIyJTNBJTIyKS4lMjBBJTIwTGFtYmRhJTIwZnVuY3Rpb24lMjBzdWJzY3JpYmVzJTIwdG8lMjB0aGlzJTIwZXZlbnQlMjBhbmQlMjB3YWl0cyUyMGZvciUyMGElMjByZXBsaWNhdGlvbiUyMHRhc2slMjB0byUyMGZpbmlzaCUyMG9yJTIwZmFpbC4lMjIlN0QlNUQlN0QlNUQlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIybGlzdC1pdGVtJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIybGlzdC1pdGVtLWNoaWxkJTIyJTJDJTIyY2hpbGRyZW4lMjIlM0ElNUIlN0IlMjJ0ZXh0JTIyJTNBJTIyV2hlbiUyMHRyaWdnZXJlZCUyQyUyMHRoZSUyMGZ1bmN0aW9uJTIwZXh0cmFjdHMlMjB0aGUlMjBkYXRhJTIwbWlncmF0aW9uJTIwQVJOJTIwZnJvbSUyMHRoZSUyMGV2ZW50JTIwcGF5bG9hZCUyMGFuZCUyMHJldHJpZXZlcyUyMHRoZSUyMFN0ZXAlMjBGdW5jdGlvbnMlMjB0YXNrJTIwdG9rZW4lMjBmcm9tJTIwRHluYW1vREIuJTIyJTdEJTVEJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmxpc3QtaXRlbSUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmxpc3QtaXRlbS1jaGlsZCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMkl0JTIwY2FuJTIwdXNlJTIwdGhlJTIwdGFzayUyMHRva2VuJTIwdG8lMjBzZW5kJTIwYSUyMHN1Y2Nlc3MlMjBvciUyMGZhaWx1cmUlMjBzaWduYWwlMjBiYWNrJTIwdG8lMjB0aGUlMjBzdGF0ZSUyMG1hY2hpbmUlMjBleGVjdXRpb24uJTIwRnJvbSUyMGhlcmUlMkMlMjB0aGUlMjBzdGF0ZSUyMG1hY2hpbmUlMjBjYW4lMjBwcm9jZWVkJTIwd2l0aCUyMHRoZSUyMHJlc3QlMjBvZiUyMGl0cyUyMHN0ZXBzLiUyMiU3RCU1RCU3RCU1RCU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJwYXJhZ3JhcGglMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJUaGlzJTIwaXMlMjBhJTIwbW9yZSUyMGVmZmljaWVudCUyMGJ1dCUyMGFsc28lMjBtb3JlJTIwY29tcGxleCUyMGFwcHJvYWNoLiUyMFRoZXJlJTIwYXJlJTIwbW9yZSUyMG1vdmluZyUyMHBhcnRzJTIwaW52b2x2ZWQlMkMlMjBidXQlMjBpdCdzJTIwc2ltcGxlJTIwdG8lMjBpbXBsZW1lbnQuJTIyJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMkJ1dCUyMHdoYXQlMjBpZiUyMHlvdSdyZSUyMGNhbGxpbmclMjBhJTIwM3JkJTIwcGFydHklMjBBUEklMjB0aGF0JTIwZG8lMjBub3QlMjBzdXBwb3J0JTIwZXZlbnRzJTNGJTIyJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMllvdSUyMGNhbiUyMGFkYXB0JTIwdGhpcyUyMGFwcHJvYWNoJTIwdG8lMjB3b3JrJTIwd2l0aCUyMGFueSUyMHNlcnZpY2UlMjB0aGF0JTIwYWNjZXB0JTIwYSUyMGNhbGxiYWNrJTIwVVJMLiUyMFdoZW4lMjB0aGUlMjAzcmQlMjBwYXJ0eSUyMHNlcnZpY2UlMjBtYWtlcyUyMHRoZSUyMGNhbGxiYWNrJTJDJTIweW91ciUyMEFQSSUyMGhhbmRsZXIlMjB3aWxsJTIwbG9vayUyMHVwJTIwdGhlJTIwdGFzayUyMHRva2VuJTIwYW5kJTIwbWFrZSUyMHRoZSUyMGNhbGxiYWNrJTIwdG8lMjBTdGVwJTIwRnVuY3Rpb25zLiUyMEV2ZXJ5dGhpbmclMjBlbHNlJTIwc3RheXMlMjB0aGUlMjBzYW1lJTIwYXMlMjBiZWZvcmUuJTIyJTdEJTVEJTdEJTVEJTdEJTVE"><span data-slate-node="text">You can adapt this approach to work with any service that accept a callback URL. When the 3rd party service makes the callback, your API handler will look up the task token and make the callback to Step Functions. Everything else stays the same as before.</span></p>
<p id="dpGEYqv"><img loading="lazy" decoding="async" class="alignnone wp-image-15892" src="https://theburningmonk.com/wp-content/uploads/2026/02/img_6985452041aad.png" alt="" width="700" height="418" srcset="https://theburningmonk.com/wp-content/uploads/2026/02/img_6985452041aad.png 1024w, https://theburningmonk.com/wp-content/uploads/2026/02/img_6985452041aad-300x179.png 300w, https://theburningmonk.com/wp-content/uploads/2026/02/img_6985452041aad-779x466.png 779w" sizes="auto, (max-width: 700px) 100vw, 700px" /></p>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">What&#8217;s more, both the polling and event-driven approach can be implemented with the new Lambda Durable Functions too!</span></p>
<p class="ck-paragraph" data-slate-node="element" data-slate-fragment="JTVCJTdCJTIydHlwZSUyMiUzQSUyMmRvY3VtZW50JTIyJTJDJTIydGhlbWUlMjIlM0ElN0IlMjJkb2N1bWVudCUyMiUzQSU3QiUyMmJhY2tncm91bmRDb2xvciUyMiUzQSUyMiUyM0ZGRkZGRiUyMiU3RCU3RCUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMldoYXQncyUyMG1vcmUlMkMlMjBib3RoJTIwdGhlJTIwcG9sbGluZyUyMGFuZCUyMGV2ZW50LWRyaXZlbiUyMGFwcHJvYWNoJTIwY2FuJTIwYmUlMjBpbXBsZW1lbnRlZCUyMHdpdGglMjB0aGUlMjBuZXclMjBMYW1iZGElMjBEdXJhYmxlJTIwRnVuY3Rpb25zJTIwdG9vISUyMiU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJwYXJhZ3JhcGglMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJUaGUlMjAlMjIlN0QlMkMlN0IlMjJib2xkJTIyJTNBdHJ1ZSUyQyUyMnRleHQlMjIlM0ElMjJ3YWl0Rm9yQ29uZGl0aW9uJTIyJTdEJTJDJTdCJTIydGV4dCUyMiUzQSUyMiUyMG9wZXJhdGlvbiUyMGlzJTIwcGVyZmVjdCUyMGZvciUyMGltcGxlbWVudGluZyUyMHRoZSUyMHBvbGxpbmclMjBsb29wJTIwaW4lMjBqdXN0JTIwYSUyMGZldyUyMGxpbmVzJTJDJTIwbGlrZSUyMHRoaXMlM0ElMjIlN0QlNUQlN0QlNUQlN0QlNUQ="><span data-slate-node="text">The </span><span data-slate-node="text"><strong data-slate-leaf="true">waitForCondition</strong></span><span data-slate-node="text"> operation is perfect for implementing the polling loop in just a few lines, like this:</span></p>
<pre class="graf graf--pre graf--preV2" spellcheck="false" data-code-block-mode="2" data-code-block-lang="javascript"><span class="pre--content"><span class="hljs-keyword">const</span> job = <span class="hljs-keyword">await</span> <span class="hljs-title function_">startDataMigrationJob</span>();

<span class="hljs-keyword">const</span> result = <span class="hljs-keyword">await</span> context.<span class="hljs-title function_">waitForCondition</span>(
  <span class="hljs-keyword">async</span> (job, ctx) =&gt; {
    <span class="hljs-keyword">const</span> status = <span class="hljs-keyword">await</span> <span class="hljs-title function_">checkJobStatus</span>(job.<span class="hljs-property">arn</span>);
    <span class="hljs-keyword">return</span> { ...job, status };
  },
  {
    <span class="hljs-attr">initialState</span>: { job, <span class="hljs-attr">status</span>: <span class="hljs-literal">null</span> },
    <span class="hljs-attr">waitStrategy</span>: <span class="hljs-function">(<span class="hljs-params">state</span>) =&gt;</span> 
      state.<span class="hljs-property">status</span> === <span class="hljs-string">'Stopped'</span> || state.<span class="hljs-property">status</span> === <span class="hljs-string">'Failed'</span> 
        ? { <span class="hljs-attr">shouldContinue</span>: <span class="hljs-literal">false</span> }
        : { <span class="hljs-attr">shouldContinue</span>: <span class="hljs-literal">true</span>, <span class="hljs-attr">delay</span>: { <span class="hljs-attr">seconds</span>: <span class="hljs-number">30</span> } }
  }
);</span></pre>
<p data-slate-node="element" data-slate-fragment="JTVCJTdCJTIydHlwZSUyMiUzQSUyMmRvY3VtZW50JTIyJTJDJTIydGhlbWUlMjIlM0ElN0IlMjJkb2N1bWVudCUyMiUzQSU3QiUyMmJhY2tncm91bmRDb2xvciUyMiUzQSUyMiUyM0ZGRkZGRiUyMiU3RCU3RCUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMldoYXQncyUyMG1vcmUlMkMlMjBib3RoJTIwdGhlJTIwcG9sbGluZyUyMGFuZCUyMGV2ZW50LWRyaXZlbiUyMGFwcHJvYWNoJTIwY2FuJTIwYmUlMjBpbXBsZW1lbnRlZCUyMHdpdGglMjB0aGUlMjBuZXclMjBMYW1iZGElMjBEdXJhYmxlJTIwRnVuY3Rpb25zJTIwdG9vISUyMiU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJwYXJhZ3JhcGglMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJUaGUlMjAlMjIlN0QlMkMlN0IlMjJib2xkJTIyJTNBdHJ1ZSUyQyUyMnRleHQlMjIlM0ElMjJ3YWl0Rm9yQ29uZGl0aW9uJTIyJTdEJTJDJTdCJTIydGV4dCUyMiUzQSUyMiUyMG9wZXJhdGlvbiUyMGlzJTIwcGVyZmVjdCUyMGZvciUyMGltcGxlbWVudGluZyUyMHRoZSUyMHBvbGxpbmclMjBsb29wJTIwaW4lMjBqdXN0JTIwYSUyMGZldyUyMGxpbmVzJTJDJTIwbGlrZSUyMHRoaXMlM0ElMjIlN0QlNUQlN0QlNUQlN0QlNUQ="><span data-slate-node="text">Similarly, the </span><span data-slate-node="text"><strong data-slate-leaf="true">waitForCallback</strong></span><span data-slate-node="text" data-slate-fragment="JTVCJTdCJTIydHlwZSUyMiUzQSUyMmRvY3VtZW50JTIyJTJDJTIydGhlbWUlMjIlM0ElN0IlMjJkb2N1bWVudCUyMiUzQSU3QiUyMmJhY2tncm91bmRDb2xvciUyMiUzQSUyMiUyM0ZGRkZGRiUyMiU3RCU3RCUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMlNpbWlsYXJseSUyQyUyMHRoZSUyMCUyMiU3RCUyQyU3QiUyMmJvbGQlMjIlM0F0cnVlJTJDJTIydGV4dCUyMiUzQSUyMndhaXRGb3JDYWxsYmFjayUyMiU3RCUyQyU3QiUyMnRleHQlMjIlM0ElMjIlMjBvcGVyYXRpb24lMjBtYWtlcyUyMGltcGxlbWVudGluZyUyMHRoZSUyMGV2ZW50LWRyaXZlbiUyMGFwcHJvYWNoJTIwdHJpdmlhbC4lMjBJbnN0ZWFkJTIwb2YlMjBhJTIwdGFzayUyMHRva2VuJTJDJTIwd2UlMjBoYXZlJTIwdG8lMjBzdG9yZSUyMGElMjBjYWxsYmFjayUyMElELiUyMEFzJTIwYmVmb3JlJTJDJTIwdGhlJTIwY2FsbGJhY2slMjBjYW4lMjBiZSUyMHRyaWdnZXJlZCUyMGJ5JTIwYW4lMjBldmVudCUyMG9yJTIwYnklMjBhJTIwM3JkJTIwcGFydHklMjBzZXJ2aWNlJTIwdmlhJTIwYSUyMGNhbGxiYWNrJTIwVVJMLiUyMiU3RCU1RCU3RCU1RCU3RCU1RA=="> operation makes implementing the event-driven approach trivial. Instead of a task token, we have to store a callback ID. As before, the callback can be triggered by an event or by a 3rd party service via a callback URL.</span></p>
<pre class="graf graf--pre">const job = await startDataMigrationJob();

const result = await context.waitForCallback(
  "wait for data migration to finish",
  async (callbackId, ctx) =&gt; {
    // save the callback ID against job ARN
    await saveJobDetails(job.arn, callbackId)

    // when the StateChange event is fired
    // another function will fetch the callback ID
    // and send a success/failure signal to the
    // durable execution
  }
);</pre>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">Polling is the default because it’s easy, not because it’s good.</span></p>
<p class="ck-paragraph" data-slate-node="element"><span data-slate-node="text">If you can get an event (or a callback), you can stop spinning your state machine and start treating &#8220;waiting&#8221; as a first-class step. Less noise, fewer transitions, lower cost.</span></p>
<p class="ck-paragraph" data-slate-node="element" data-slate-fragment="JTVCJTdCJTIydHlwZSUyMiUzQSUyMmRvY3VtZW50JTIyJTJDJTIydGhlbWUlMjIlM0ElN0IlMjJkb2N1bWVudCUyMiUzQSU3QiUyMmJhY2tncm91bmRDb2xvciUyMiUzQSUyMiUyM0ZGRkZGRiUyMiU3RCU3RCUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMlBvbGxpbmclMjBpcyUyMHRoZSUyMGRlZmF1bHQlMjBiZWNhdXNlJTIwaXQlRTIlODAlOTlzJTIwZWFzeSUyQyUyMG5vdCUyMGJlY2F1c2UlMjBpdCVFMiU4MCU5OXMlMjBnb29kLiUyMiU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJwYXJhZ3JhcGglMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJJZiUyMHlvdSUyMGNhbiUyMGdldCUyMGFuJTIwZXZlbnQlMjAob3IlMjBhJTIwY2FsbGJhY2spJTJDJTIweW91JTIwY2FuJTIwc3RvcCUyMHNwaW5uaW5nJTIweW91ciUyMHN0YXRlJTIwbWFjaGluZSUyMGFuZCUyMHN0YXJ0JTIwdHJlYXRpbmclMjAlNUMlMjJ3YWl0aW5nJTVDJTIyJTIwYXMlMjBhJTIwZmlyc3QtY2xhc3MlMjBzdGVwLiUyMExlc3MlMjBub2lzZSUyQyUyMGZld2VyJTIwdHJhbnNpdGlvbnMlMkMlMjBsb3dlciUyMGNvc3QuJTIyJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMlRoYW5rJTIweW91JTIwdG8lMjBQYXRyaWNrJTIwZm9yJTIwYnJpbmdpbmclMjB0aGlzJTIwdXAlMjBpbiUyMG91ciUyMGxhc3QlMjBRJTI2QSUyMHNlc3Npb24uJTIwSWYlMjB5b3UlMjB3YW50JTIwdG8lMjBsZXZlbCUyMHVwJTIweW91ciUyMEFXUyUyMGdhbWUlMkMlMjBjaGVjayUyMG91dCUyMG15JTIwJTIyJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmxpbmslMjIlMkMlMjJocmVmJTIyJTNBJTIyaHR0cHMlM0ElMkYlMkZwcm9kdWN0aW9ucmVhZHlzZXJ2ZXJsZXNzLmNvbSUyRiUzRnV0bV9jYW1wYWlnbiUzRHBvbGxpbmctdG8tZXZlbnQtZHJpdmVuJTI2dXRtX3NvdXJjZSUzRG5ld3NsZXR0ZXIlMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJQcm9kdWN0aW9uLVJlYWR5JTIwU2VydmVybGVzcyUyMHdvcmtzaG9wJTIyJTdEJTVEJTdEJTJDJTdCJTIydGV4dCUyMiUzQSUyMi4lMjBUaGUlMjBuZXh0JTIwY29ob3J0JTIwc3RhcnRzJTIwb24lMjBBcHJpbCUyMDEzdGglMkMlMjBhbmQlMjB0aGUlMjBlYXJseSUyMGJpcmQlMjB0aWNrZXRzJTIwKDMwJTI1JTIwb2ZmKSUyMGlzJTIwYXZhaWxhYmxlJTIwdW50aWwlMjBNYXJjaCUyMDE2dGguJTIyJTdEJTVEJTdEJTVEJTdEJTVE"><span data-slate-node="text">Thank you to Patrick for bringing this up in our last Q&amp;A session. If you want to level up your AWS game, check out my </span><a class="ck-link" href="https://productionreadyserverless.com/?utm_campaign=polling-to-event-driven&amp;utm_source=blog" target="_blank" rel="noopener" data-slate-node="element" data-slate-inline="true"><span data-slate-node="text">Production-Ready Serverless workshop</span></a><span data-slate-node="text">. The next cohort starts on April 13th, and the early bird tickets (30% off) is available until March 16th.</span></p>
<p data-slate-node="element" data-slate-fragment="JTVCJTdCJTIydHlwZSUyMiUzQSUyMmRvY3VtZW50JTIyJTJDJTIydGhlbWUlMjIlM0ElN0IlMjJkb2N1bWVudCUyMiUzQSU3QiUyMmJhY2tncm91bmRDb2xvciUyMiUzQSUyMiUyM0ZGRkZGRiUyMiU3RCU3RCUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMlBvbGxpbmclMjBpcyUyMHRoZSUyMGRlZmF1bHQlMjBiZWNhdXNlJTIwaXQlRTIlODAlOTlzJTIwZWFzeSUyQyUyMG5vdCUyMGJlY2F1c2UlMjBpdCVFMiU4MCU5OXMlMjBnb29kLiUyMiU3RCU1RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJwYXJhZ3JhcGglMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJJZiUyMHlvdSUyMGNhbiUyMGdldCUyMGFuJTIwZXZlbnQlMjAob3IlMjBhJTIwY2FsbGJhY2spJTJDJTIweW91JTIwY2FuJTIwc3RvcCUyMHNwaW5uaW5nJTIweW91ciUyMHN0YXRlJTIwbWFjaGluZSUyMGFuZCUyMHN0YXJ0JTIwdHJlYXRpbmclMjAlNUMlMjJ3YWl0aW5nJTVDJTIyJTIwYXMlMjBhJTIwZmlyc3QtY2xhc3MlMjBzdGVwLiUyMExlc3MlMjBub2lzZSUyQyUyMGZld2VyJTIwdHJhbnNpdGlvbnMlMkMlMjBsb3dlciUyMGNvc3QuJTIyJTdEJTVEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMmNoaWxkcmVuJTIyJTNBJTVCJTdCJTIydGV4dCUyMiUzQSUyMlRoYW5rJTIweW91JTIwdG8lMjBQYXRyaWNrJTIwZm9yJTIwYnJpbmdpbmclMjB0aGlzJTIwdXAlMjBpbiUyMG91ciUyMGxhc3QlMjBRJTI2QSUyMHNlc3Npb24uJTIwSWYlMjB5b3UlMjB3YW50JTIwdG8lMjBsZXZlbCUyMHVwJTIweW91ciUyMEFXUyUyMGdhbWUlMkMlMjBjaGVjayUyMG91dCUyMG15JTIwJTIyJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmxpbmslMjIlMkMlMjJocmVmJTIyJTNBJTIyaHR0cHMlM0ElMkYlMkZwcm9kdWN0aW9ucmVhZHlzZXJ2ZXJsZXNzLmNvbSUyRiUzRnV0bV9jYW1wYWlnbiUzRHBvbGxpbmctdG8tZXZlbnQtZHJpdmVuJTI2dXRtX3NvdXJjZSUzRG5ld3NsZXR0ZXIlMjIlMkMlMjJjaGlsZHJlbiUyMiUzQSU1QiU3QiUyMnRleHQlMjIlM0ElMjJQcm9kdWN0aW9uLVJlYWR5JTIwU2VydmVybGVzcyUyMHdvcmtzaG9wJTIyJTdEJTVEJTdEJTJDJTdCJTIydGV4dCUyMiUzQSUyMi4lMjBUaGUlMjBuZXh0JTIwY29ob3J0JTIwc3RhcnRzJTIwb24lMjBBcHJpbCUyMDEzdGglMkMlMjBhbmQlMjB0aGUlMjBlYXJseSUyMGJpcmQlMjB0aWNrZXRzJTIwKDMwJTI1JTIwb2ZmKSUyMGlzJTIwYXZhaWxhYmxlJTIwdW50aWwlMjBNYXJjaCUyMDE2dGguJTIyJTdEJTVEJTdEJTVEJTdEJTVE"><h3 class="crp-list-title">Related Posts</h3><div class="crp-list"><div class="crp-list-item crp-list-item-image-left crp-list-item-has-image"><div class="crp-list-item-image"><a href="https://theburningmonk.com/2025/12/the-biggest-reinvent-2025-serverless-announcements/"><img loading="lazy" decoding="async" data-pin-nopin="true" style="max-width: 128px; height: auto;" width="128" height="72" src="https://theburningmonk.com/wp-content/uploads/2025/12/serverless-at-reinvent-title-300x169.jpg" class="attachment-128x72 size-128x72 wp-post-image" alt="" srcset="https://theburningmonk.com/wp-content/uploads/2025/12/serverless-at-reinvent-title-300x169.jpg 300w, https://theburningmonk.com/wp-content/uploads/2025/12/serverless-at-reinvent-title-779x438.jpg 779w, https://theburningmonk.com/wp-content/uploads/2025/12/serverless-at-reinvent-title.jpg 1024w" sizes="auto, (max-width: 128px) 100vw, 128px" /></a></div><div class="crp-list-item-title"><a href="https://theburningmonk.com/2025/12/the-biggest-reinvent-2025-serverless-announcements/">The biggest re:Invent 2025 serverless announcements</a></div></div><div class="crp-list-item crp-list-item-image-left crp-list-item-has-image"><div class="crp-list-item-image"><a href="https://theburningmonk.com/2024/08/whats-the-best-way-to-do-fan-out-fan-in-serverlessly-in-2024/"><img loading="lazy" decoding="async" data-pin-nopin="true" style="max-width: 128px; height: auto;" width="128" height="72" src="https://theburningmonk.com/wp-content/uploads/2024/08/fanout-fanin-serverlessly-2024-feature-300x169.png" class="attachment-128x72 size-128x72 wp-post-image" alt="" srcset="https://theburningmonk.com/wp-content/uploads/2024/08/fanout-fanin-serverlessly-2024-feature-300x169.png 300w, https://theburningmonk.com/wp-content/uploads/2024/08/fanout-fanin-serverlessly-2024-feature-779x438.png 779w, https://theburningmonk.com/wp-content/uploads/2024/08/fanout-fanin-serverlessly-2024-feature.png 1024w" sizes="auto, (max-width: 128px) 100vw, 128px" /></a></div><div class="crp-list-item-title"><a href="https://theburningmonk.com/2024/08/whats-the-best-way-to-do-fan-out-fan-in-serverlessly-in-2024/">What's the best way to do fan-out/fan-in serverlessly in 2024?</a></div></div></div></p>
<p>The post <a href="https://theburningmonk.com/2026/02/the-anti-polling-pattern-for-step-functions/">The anti-polling pattern for Step Functions</a> appeared first on <a href="https://theburningmonk.com">theburningmonk.com</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The biggest re:Invent 2025 serverless announcements</title>
		<link>https://theburningmonk.com/2025/12/the-biggest-reinvent-2025-serverless-announcements/</link>
		
		<dc:creator><![CDATA[Yan Cui]]></dc:creator>
		<pubDate>Mon, 08 Dec 2025 17:15:26 +0000</pubDate>
				<category><![CDATA[AWS]]></category>
		<category><![CDATA[Serverless]]></category>
		<category><![CDATA[Lambda]]></category>
		<guid isPermaLink="false">https://theburningmonk.com/?p=15872</guid>

					<description><![CDATA[<p>Here are the biggest serverless announcements at re:Invent 2025.</p>
<p>The post <a href="https://theburningmonk.com/2025/12/the-biggest-reinvent-2025-serverless-announcements/">The biggest re:Invent 2025 serverless announcements</a> appeared first on <a href="https://theburningmonk.com">theburningmonk.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Two weeks ago, I gave you the biggest serverless announcements pre-re:Invent (see <a href="https://theburningmonk.com/2025/11/the-biggest-preinvent-serverless-announcements-you-may-have-missed-2025/" target="_blank" rel="noopener">here</a>). So here are the biggest serverless announcements during re:Invent 2025.</p>
<p>&nbsp;</p>
<h3 class="graf graf--h3">Lambda Managed Instances</h3>
<p><a class="markup--anchor markup--p-anchor" href="https://aws.amazon.com/blogs/aws/introducing-aws-lambda-managed-instances-serverless-simplicity-with-ec2-flexibility/" target="_blank" rel="noopener" data-href="https://aws.amazon.com/blogs/compute/build-scalable-rest-apis-using-amazon-api-gateway-private-integration-with-application-load-balancer/">Here’s the official announcement</a>.</p>
<p>A common pushback against Lambda is that &#8220;it&#8217;s expensive at scale&#8221; because:</p>
<p>1) Each execution environment can only process one request at a time, wasting available CPU cycles while you wait for IO response.</p>
<p>2) Paying for execution time is less efficient when handling thousands of requests per second, especially given the above.</p>
<p>Lambda Managed Instances address these concerns.</p>
<p>You keep the same programming model with Lambda and the same event triggers.</p>
<p>But instead of your function running in a shared pool of bare metal EC2 instances, you can now instruct AWS to use EC2 instances from your account instead. Importantly, <strong>AWS still manages these EC2 instances for you, including OS patching, load balancing and auto-scaling.</strong></p>
<p>It gives you more control and flexibility, e.g. what instance types to use (but no GPU instances) and the memory-to-CPU ratio.</p>
<p>See <a href="https://theburningmonk.com/2025/12/what-you-need-to-know-about-lambda-managed-instances/" target="_blank" rel="noopener">this post</a> for my more in-depth coverage of this new feature.</p>
<p>&nbsp;</p>
<h3>Lambda Durable Functions</h3>
<p><a class="markup--anchor markup--p-anchor" href="https://aws.amazon.com/blogs/aws/build-multi-step-applications-and-ai-workflows-with-aws-lambda-durable-functions/" target="_blank" rel="noopener" data-href="https://aws.amazon.com/blogs/compute/build-scalable-rest-apis-using-amazon-api-gateway-private-integration-with-application-load-balancer/">Here’s the official announcement</a>.</p>
<p>This is my favourite announce from re:Invent 2025 :-)</p>
<p>Lambda Durable Functions use a replay mechanism similar to <a href="https://www.youtube.com/watch?v=5n84BypaeV8" target="_blank" rel="noopener">how reState works</a> and how I implemented <a href="https://theburningmonk.com/2025/03/how-to-implement-durable-execution-for-lambda-without-frameworks/" target="_blank" rel="noopener">durable execution on Lambda for a client project</a>.</p>
<p>The basic idea is simple &#8211; you can add checkpoints along the execution and the Lambda service will re-invoke your function from the start and skip over previously executed checkpoints when:</p>
<ul>
<li>The initial invocation timed out.</li>
<li>You called <em>context.wait</em> to pause the current invocation.</li>
<li>You used <em>context.invoke</em> to invoke another function and wait for its response (which suspends the current invocation).</li>
<li>You created a callback and awaiting its response.</li>
</ul>
<p>Here&#8217;s a handy visualization from the <a href="https://docs.aws.amazon.com/lambda/latest/dg/durable-functions.html" target="_blank" rel="noopener">official documentation</a>.</p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-15873" src="https://theburningmonk.com/wp-content/uploads/2025/12/how_durable_works.png" alt="" width="700" height="680" srcset="https://theburningmonk.com/wp-content/uploads/2025/12/how_durable_works.png 1024w, https://theburningmonk.com/wp-content/uploads/2025/12/how_durable_works-300x292.png 300w, https://theburningmonk.com/wp-content/uploads/2025/12/how_durable_works-779x757.png 779w, https://theburningmonk.com/wp-content/uploads/2025/12/how_durable_works-1536x1493.png 1536w, https://theburningmonk.com/wp-content/uploads/2025/12/how_durable_works-2048x1990.png 2048w" sizes="auto, (max-width: 700px) 100vw, 700px" /></p>
<p><em>(source: <a href="https://docs.aws.amazon.com/lambda/latest/dg/durable-functions.html" target="_blank" rel="noopener">https://docs.aws.amazon.com/lambda/latest/dg/durable-functions.html</a>)</em></p>
<p>In addition to the usual Lambda function timeout (max 15 mins), Durable Functions also have a &#8220;execution timeout&#8221; for the total duration of a durable execution which can span over multiple invocations. The <strong>max execution timeout is 1 year</strong>.</p>
<p>Durable functions can be invoked both synchronously and asynchronously.</p>
<p>However, for synchronous invocations, the max execution timeout is limited to 15 mins. Whereas asynchronous invocations can have execution timeout of up to 1 year.</p>
<p><strong>Durable functions also work with all event source mappings</strong>. But ESM-triggered invocations are also limited to a max execution duration of 15 mins.</p>
<p>Additionally, Durable Functions support DLQs, but they <strong>DO NOT support Lambda destinations</strong>.</p>
<p>Similar to Step Functions, Durable Functions also supports exactly-once processing, if you provide an &#8220;DurableExecutionName&#8221; when invoking a durable function.</p>
<p>Durable Functions blur the line between Lambda and Step Functions. I&#8217;m still organizing my thoughts on how to choose between them, but off the top of my head, these are areas where I think Step Functions wins over Lambda Durable Functions:</p>
<ul>
<li>Visualization: being able to design and visualize the workflow as well as its executions. This is especially useful when working with non-technical stakeholders.</li>
<li>Parallel processing: the <em>context.parallel</em> function of the Durable execution SDK does not actually guarantee parallel processing. In Node.js, it&#8217;s essentially a wrapper around <em>promise.all</em>, which gives you concurrency, not parallelism. So if you need to process large amounts of data in parallel, e.g. as part of a map-reduce task, then you want Step Function&#8217;s Parallel state.</li>
</ul>
<p>The replay mechanic also has some interesting failure modes and gotchas. More on that in another post! Or, you can learn all about them in my next <a class="ck-link" href="https://productionreadyserverless.com/?utm_campaign=biggest-serverless-reinvent&amp;utm_source=blog" target="_blank" rel="noopener noreferrer">Production-Ready Serverless</a> workshop ;-)</p>
<p>&nbsp;</p>
<h3>S3 Vectors goes GA with better scale and performance</h3>
<p><a class="markup--anchor markup--p-anchor" href="https://aws.amazon.com/blogs/aws/amazon-s3-vectors-now-generally-available-with-increased-scale-and-performance/" target="_blank" rel="noopener" data-href="https://aws.amazon.com/blogs/compute/build-scalable-rest-apis-using-amazon-api-gateway-private-integration-with-application-load-balancer/">Here’s the official announcement</a>.</p>
<p>&nbsp;</p>
<h3>S3 Tables support intelligent-tiering and replication</h3>
<p><a href="https://aws.amazon.com/blogs/aws/announcing-replication-support-and-intelligent-tiering-for-amazon-s3-tables/" target="_blank" rel="noopener">Here&#8217;s the official announcement</a>.</p>
<p>&nbsp;</p>
<h3>CloudFront supports mutual TLS authentication</h3>
<p><a class="markup--anchor markup--p-anchor" href="https://aws.amazon.com/about-aws/whats-new/2025/11/amazon-cloudfront-mutual-tls-authentication/" target="_blank" rel="noopener" data-href="https://aws.amazon.com/blogs/compute/build-scalable-rest-apis-using-amazon-api-gateway-private-integration-with-application-load-balancer/">Here’s the official announcement</a>.</p>
<p>&nbsp;</p>
<p>And a lot of AI-related announcements, such as Nova 2 models.</p>
<h3 class="crp-list-title">Related Posts</h3><div class="crp-list"><div class="crp-list-item crp-list-item-image-left crp-list-item-has-image"><div class="crp-list-item-image"><a href="https://theburningmonk.com/2025/11/the-biggest-preinvent-serverless-announcements-you-may-have-missed-2025/"><img loading="lazy" decoding="async" data-pin-nopin="true" style="max-width: 128px; height: auto;" width="128" height="72" src="https://theburningmonk.com/wp-content/uploads/2025/11/preinvent-serverless-001-300x169.jpg" class="attachment-128x72 size-128x72 wp-post-image" alt="" srcset="https://theburningmonk.com/wp-content/uploads/2025/11/preinvent-serverless-001-300x169.jpg 300w, https://theburningmonk.com/wp-content/uploads/2025/11/preinvent-serverless-001-779x438.jpg 779w, https://theburningmonk.com/wp-content/uploads/2025/11/preinvent-serverless-001.jpg 1024w" sizes="auto, (max-width: 128px) 100vw, 128px" /></a></div><div class="crp-list-item-title"><a href="https://theburningmonk.com/2025/11/the-biggest-preinvent-serverless-announcements-you-may-have-missed-2025/">The biggest pre:invent serverless announcements you may have missed</a></div></div><div class="crp-list-item crp-list-item-image-left crp-list-item-has-image"><div class="crp-list-item-image"><a href="https://theburningmonk.com/2025/12/what-you-need-to-know-about-lambda-managed-instances/"><img loading="lazy" decoding="async" data-pin-nopin="true" style="max-width: 128px; height: auto;" width="128" height="72" src="https://theburningmonk.com/wp-content/uploads/2025/12/lambda-managed-instances-title-300x169.png" class="attachment-128x72 size-128x72 wp-post-image" alt="" srcset="https://theburningmonk.com/wp-content/uploads/2025/12/lambda-managed-instances-title-300x169.png 300w, https://theburningmonk.com/wp-content/uploads/2025/12/lambda-managed-instances-title-779x438.png 779w, https://theburningmonk.com/wp-content/uploads/2025/12/lambda-managed-instances-title.png 1024w" sizes="auto, (max-width: 128px) 100vw, 128px" /></a></div><div class="crp-list-item-title"><a href="https://theburningmonk.com/2025/12/what-you-need-to-know-about-lambda-managed-instances/">What you need to know about Lambda Managed Instances</a></div></div></div>
<p>The post <a href="https://theburningmonk.com/2025/12/the-biggest-reinvent-2025-serverless-announcements/">The biggest re:Invent 2025 serverless announcements</a> appeared first on <a href="https://theburningmonk.com">theburningmonk.com</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>What you need to know about Lambda Managed Instances</title>
		<link>https://theburningmonk.com/2025/12/what-you-need-to-know-about-lambda-managed-instances/</link>
		
		<dc:creator><![CDATA[Yan Cui]]></dc:creator>
		<pubDate>Mon, 08 Dec 2025 13:34:10 +0000</pubDate>
				<category><![CDATA[AWS]]></category>
		<category><![CDATA[Lambda]]></category>
		<category><![CDATA[Serverless]]></category>
		<guid isPermaLink="false">https://theburningmonk.com/?p=15858</guid>

					<description><![CDATA[<p>In this post, let's take a deep dive into Lambda Managed Instances, and understand<br />
* Why you should care<br />
* Important considerations<br />
* When to use it</p>
<p>The post <a href="https://theburningmonk.com/2025/12/what-you-need-to-know-about-lambda-managed-instances/">What you need to know about Lambda Managed Instances</a> appeared first on <a href="https://theburningmonk.com">theburningmonk.com</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Like London buses, we&#8217;ve waited years for true innovations to the Lambda platform and two came at the same time!</p>
<ul class="unordered_list">
<li class="list_item"><a class="ck-link" href="https://aws.amazon.com/blogs/aws/introducing-aws-lambda-managed-instances-serverless-simplicity-with-ec2-flexibility/" target="_blank" rel="noopener noreferrer">Lambda Managed Instances</a></li>
<li class="list_item"><a class="ck-link" href="https://aws.amazon.com/blogs/aws/build-multi-step-applications-and-ai-workflows-with-aws-lambda-durable-functions/" target="_blank" rel="noopener noreferrer">Lambda Durable Functions</a></li>
</ul>
<p>I will be updating the <a class="ck-link" href="https://productionreadyserverless.com/?utm_campaign=lambda-innovations&amp;utm_source=blog" target="_blank" rel="noopener noreferrer">Production-Ready Serverless</a> workshop to cover these new features in the January cohort.</p>
<p>In this post, let&#8217;s take a closer look at Lambda Managed Instances, why you should care and when to use it.</p>
<h3>Introducing Lambda Managed Instances</h3>
<p>A common pushback against Lambda is that &#8220;it&#8217;s expensive at scale&#8221; because:</p>
<p>1) Each execution environment can only process one request at a time, wasting available CPU cycles while you wait for IO response.</p>
<p>2) Paying for execution time is less efficient when handling thousands of requests per second, especially given the above.</p>
<p>Lambda Managed Instances address these concerns.</p>
<p>You keep the same programming model with Lambda and the same event triggers.</p>
<p>But instead of your function running in a shared pool of bare metal EC2 instances, you can now instruct AWS to use EC2 instances from your account instead.</p>
<p><strong>Importantly, AWS still manages these EC2 instances for you, including OS patching, load balancing and auto-scaling.</strong></p>
<p>With managed instances, you have more control over HOW the Lambda service should manage these EC2 instances.</p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-15859" src="https://theburningmonk.com/wp-content/uploads/2025/12/lambda-managed-instances-01.png" alt="" width="700" height="771" srcset="https://theburningmonk.com/wp-content/uploads/2025/12/lambda-managed-instances-01.png 929w, https://theburningmonk.com/wp-content/uploads/2025/12/lambda-managed-instances-01-272x300.png 272w, https://theburningmonk.com/wp-content/uploads/2025/12/lambda-managed-instances-01-779x859.png 779w" sizes="auto, (max-width: 700px) 100vw, 700px" /></p>
<p>For example, what CPU architecture and instance types to use.</p>
<p>You can choose specific instance types that works best for your workload, and <strong>use EC2 saving plans on these instances</strong>.</p>
<p><em>Note:<strong> GPU instances are NOT supported</strong>.</em></p>
<p>Similarly, you can let Lambda choose the scaling threshold or provide a target CPU utilization level you wish to maintain.</p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-15860" src="https://theburningmonk.com/wp-content/uploads/2025/12/lambda-managed-instances-02.png" alt="" width="600" height="209" srcset="https://theburningmonk.com/wp-content/uploads/2025/12/lambda-managed-instances-02.png 1024w, https://theburningmonk.com/wp-content/uploads/2025/12/lambda-managed-instances-02-300x105.png 300w, https://theburningmonk.com/wp-content/uploads/2025/12/lambda-managed-instances-02-779x272.png 779w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>When creating a function using managed instances, you can also set the memory size and the memory-to-CPU ratio.</p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-15861" src="https://theburningmonk.com/wp-content/uploads/2025/12/lambda-managed-instances-03.png" alt="" width="600" height="252" srcset="https://theburningmonk.com/wp-content/uploads/2025/12/lambda-managed-instances-03.png 1024w, https://theburningmonk.com/wp-content/uploads/2025/12/lambda-managed-instances-03-300x126.png 300w, https://theburningmonk.com/wp-content/uploads/2025/12/lambda-managed-instances-03-779x328.png 779w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>This lets you tailor the execution environment based on your workload. For example, for basic CRUD APIs, a 2-to-1 ratio is fine. But for memory intensive workloads you might choose a higher memory-to-cpu ratio.</p>
<h3>Important considerations</h3>
<h4><strong>Execution environments can handle multiple concurrent requests</strong></h4>
<p>This allows better utilization of the available CPU cycles. This is important for keeping cost in check when running at scale.</p>
<p>But it also means your code need to be thread-safe. For example, you need to be more careful when using and modifying global variables, because another concurrent request might have also modified them.</p>
<h4><strong>Paying for uptime instead of execution time</strong></h4>
<p>You no longer pay for execution time, but instead, you pay for a combination of:</p>
<ul class="unordered_list">
<li class="list_item">No. of Lambda requests &#8211; $0.20 per million.</li>
<li class="list_item">The EC2 cost.</li>
<li class="list_item">15% premium on the EC2 cost.</li>
</ul>
<p>As mentioned before, you can use existing EC2 saving plans on the managed EC2 instances.</p>
<h4><strong>No cold starts but slower scaling</strong></h4>
<p>Because execution environments are reused and can handle multiple concurrent requests, there are no more cold starts.</p>
<p>However, when exceeding the capacity of the EC2 fleet, requests are throttled until the system is able to scale up the fleet.</p>
<p>Regular Lambda functions can scale rapidly by tapping into a large, shared pool of EC2 instances. With managed instances, it takes tens of seconds to launch new EC2 instances. As such, it&#8217;s not a good fit when you have large, unpredictable spikes in traffic.</p>
<h3>When to use it</h3>
<p>Considering the above, here are the reasons I&#8217;d consider using managed instances:</p>
<ul class="unordered_list">
<li class="list_item"><strong>Cost-efficiency at scale</strong>, when you have a consistent high throughput.</li>
<li class="list_item"><strong>Predictable performance</strong>. Managed instances is more effective at eliminating cold starts than Provisioned Concurrency.</li>
<li class="list_item"><strong>More control over execution environment</strong>. More choices of instance types, memory-to-CPU ratio, etc.</li>
</ul>
<p>However, for most of us, who aren&#8217;t handling thousands, or even hundreds of requests per second consistently, it&#8217;s better to stay with the default compute mode for Lambda.</p>
<p>Also, if you have a very bursty traffic and you can deal with a bit of cold starts, then you&#8217;re also better off staying with regular functions.</p>
<p>Regardless, I&#8217;m glad that there&#8217;s another option we can upgrade to, should the needs arise. And after all the relentless focus on AI, it&#8217;s good to see AWS going back to and innovating on its core services.</p>
<p>&nbsp;</p>
<h3 class="crp-list-title">Related Posts</h3><div class="crp-list"><div class="crp-list-item crp-list-item-image-left crp-list-item-has-image"><div class="crp-list-item-image"><a href="https://theburningmonk.com/2025/11/the-biggest-preinvent-serverless-announcements-you-may-have-missed-2025/"><img loading="lazy" decoding="async" data-pin-nopin="true" style="max-width: 128px; height: auto;" width="128" height="72" src="https://theburningmonk.com/wp-content/uploads/2025/11/preinvent-serverless-001-300x169.jpg" class="attachment-128x72 size-128x72 wp-post-image" alt="" srcset="https://theburningmonk.com/wp-content/uploads/2025/11/preinvent-serverless-001-300x169.jpg 300w, https://theburningmonk.com/wp-content/uploads/2025/11/preinvent-serverless-001-779x438.jpg 779w, https://theburningmonk.com/wp-content/uploads/2025/11/preinvent-serverless-001.jpg 1024w" sizes="auto, (max-width: 128px) 100vw, 128px" /></a></div><div class="crp-list-item-title"><a href="https://theburningmonk.com/2025/11/the-biggest-preinvent-serverless-announcements-you-may-have-missed-2025/">The biggest pre:invent serverless announcements you may have missed</a></div></div><div class="crp-list-item crp-list-item-image-left crp-list-item-has-image"><div class="crp-list-item-image"><a href="https://theburningmonk.com/2025/12/the-biggest-reinvent-2025-serverless-announcements/"><img loading="lazy" decoding="async" data-pin-nopin="true" style="max-width: 128px; height: auto;" width="128" height="72" src="https://theburningmonk.com/wp-content/uploads/2025/12/serverless-at-reinvent-title-300x169.jpg" class="attachment-128x72 size-128x72 wp-post-image" alt="" srcset="https://theburningmonk.com/wp-content/uploads/2025/12/serverless-at-reinvent-title-300x169.jpg 300w, https://theburningmonk.com/wp-content/uploads/2025/12/serverless-at-reinvent-title-779x438.jpg 779w, https://theburningmonk.com/wp-content/uploads/2025/12/serverless-at-reinvent-title.jpg 1024w" sizes="auto, (max-width: 128px) 100vw, 128px" /></a></div><div class="crp-list-item-title"><a href="https://theburningmonk.com/2025/12/the-biggest-reinvent-2025-serverless-announcements/">The biggest re:Invent 2025 serverless announcements</a></div></div><div class="crp-list-item crp-list-item-image-left crp-list-item-has-image"><div class="crp-list-item-image"><a href="https://theburningmonk.com/2026/06/what-you-need-to-know-about-lambda-microvms/"><img loading="lazy" decoding="async" data-pin-nopin="true" style="max-width: 128px; height: auto;" width="128" height="72" src="https://theburningmonk.com/wp-content/uploads/2026/06/lambda-microvms-feature-300x169.png" class="attachment-128x72 size-128x72 wp-post-image" alt="" srcset="https://theburningmonk.com/wp-content/uploads/2026/06/lambda-microvms-feature-300x169.png 300w, https://theburningmonk.com/wp-content/uploads/2026/06/lambda-microvms-feature-779x438.png 779w, https://theburningmonk.com/wp-content/uploads/2026/06/lambda-microvms-feature.png 1024w" sizes="auto, (max-width: 128px) 100vw, 128px" /></a></div><div class="crp-list-item-title"><a href="https://theburningmonk.com/2026/06/what-you-need-to-know-about-lambda-microvms/">What you need to know about Lambda MicroVMs</a></div></div></div>
<p>The post <a href="https://theburningmonk.com/2025/12/what-you-need-to-know-about-lambda-managed-instances/">What you need to know about Lambda Managed Instances</a> appeared first on <a href="https://theburningmonk.com">theburningmonk.com</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
