<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Pulumi on Backend Engineering Strategy Tools</title><link>https://backend-engineering-strategy-tools.github.io/site/tags/pulumi/</link><description>Recent content in Pulumi on Backend Engineering Strategy Tools</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Wed, 03 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://backend-engineering-strategy-tools.github.io/site/tags/pulumi/index.xml" rel="self" type="application/rss+xml"/><item><title>Pulumi</title><link>https://backend-engineering-strategy-tools.github.io/site/public-notes/infra-as-code/pulumi/</link><pubDate>Wed, 03 Jun 2026 00:00:00 +0000</pubDate><guid>https://backend-engineering-strategy-tools.github.io/site/public-notes/infra-as-code/pulumi/</guid><description>&lt;p&gt;Pulumi takes the same approach as &lt;a class="link" href="../cdk/" &gt;AWS CDK&lt;/a&gt; — use a real programming language to define infrastructure — but without the CloudFormation layer underneath. Pulumi talks directly to cloud APIs, maintains its own state, and supports multiple clouds from a single codebase.&lt;/p&gt;
&lt;p&gt;Languages: TypeScript, Python, Go, Java, C#, and YAML. Same language across all supported clouds.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="how-it-works"&gt;How it works
&lt;/h2&gt;&lt;p&gt;Write infrastructure as code in your language of choice. Pulumi runs the program, builds a desired-state graph, diffs against current state, and makes the API calls to converge.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;aws&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;@pulumi/aws&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bucket&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;aws&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;s3&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Bucket&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;assets&amp;#34;&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;versioning&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;enabled&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;tags&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;Environment&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;prod&amp;#34;&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bucketName&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bucket&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;bucket&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pulumi preview &lt;span style="color:#75715e"&gt;# show planned changes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pulumi up &lt;span style="color:#75715e"&gt;# apply&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pulumi destroy &lt;span style="color:#75715e"&gt;# tear down&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="state"&gt;State
&lt;/h2&gt;&lt;p&gt;Pulumi manages state like Terraform — a backend stores what resources exist and their current configuration. Options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pulumi Cloud&lt;/strong&gt; — hosted, free tier available, adds secrets management and team features&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;S3 / GCS / Azure Blob&lt;/strong&gt; — self-managed, same pattern as Terraform&amp;rsquo;s remote backend&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="vs-terraform"&gt;vs Terraform
&lt;/h2&gt;&lt;p&gt;The core tradeoff: Pulumi gives you a real programming language (real loops, real functions, real tests) at the cost of a smaller ecosystem and less community tooling than Terraform. HCL is a constraint but also a simplicity — Terraform configurations are declarative and readable without needing to understand the language runtime.&lt;/p&gt;
&lt;p&gt;Pulumi is the better choice when infrastructure logic is genuinely complex enough to benefit from a real language. For straightforward cloud resources, Terraform&amp;rsquo;s declarative HCL is often simpler to read and maintain.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="vs-aws-cdk"&gt;vs AWS CDK
&lt;/h2&gt;&lt;p&gt;Both use real languages. The difference: CDK generates CloudFormation and inherits all of CloudFormation&amp;rsquo;s limitations (see the &lt;a class="link" href="../cdk/" &gt;CDK page&lt;/a&gt;). Pulumi talks directly to cloud APIs, which means better drift visibility, faster deploys, and support outside AWS.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="testing"&gt;Testing
&lt;/h2&gt;&lt;p&gt;Because infrastructure is code, it tests like code:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unit tests with Jest (TypeScript), pytest (Python), or Go test — test the resource graph without deploying&lt;/li&gt;
&lt;li&gt;Integration tests that deploy to an isolated stack and assert against live infrastructure&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="opentofu--terraform-note"&gt;OpenTofu / Terraform note
&lt;/h2&gt;&lt;p&gt;After HashiCorp changed Terraform&amp;rsquo;s licence to BSL in 2023, the community forked it as &lt;a class="link" href="https://opentofu.org/" target="_blank" rel="noopener"
 &gt;OpenTofu&lt;/a&gt;. If the licence change matters to your organisation, OpenTofu is a drop-in replacement. Pulumi was not affected.&lt;/p&gt;
&lt;p&gt;Only explored in POC and lab contexts, not production. The honest take: Pulumi feels like the Gradle of IaC. The real-language argument is compelling in theory — proper loops, functions, tests, abstractions — but in practice it is easy to get wrong, and HCL&amp;rsquo;s constraint is also its strength. A Terraform configuration is readable by anyone; a Pulumi TypeScript codebase requires understanding the language runtime and the person who wrote it.&lt;/p&gt;
&lt;p&gt;The cases where Pulumi wins: complex infrastructure logic that genuinely benefits from a real language, or teams already deep in a single language who want infrastructure to live alongside application code. For standard cloud infrastructure, &lt;a class="link" href="../terraform/" &gt;Terraform&lt;/a&gt; is the lower-friction choice.&lt;/p&gt;</description></item></channel></rss>