<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Nedim Hozic</title>
    <description>The latest articles on DEV Community by Nedim Hozic (@nedimhozic).</description>
    <link>https://dev.to/nedimhozic</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3069085%2Fe7133816-9633-4b30-943b-2e65db3b1ed0.png</url>
      <title>DEV Community: Nedim Hozic</title>
      <link>https://dev.to/nedimhozic</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nedimhozic"/>
    <language>en</language>
    <item>
      <title>Pulumi + Azure: Managing Multiple Environments (Dev, Staging, Prod)</title>
      <dc:creator>Nedim Hozic</dc:creator>
      <pubDate>Tue, 06 May 2025 09:21:39 +0000</pubDate>
      <link>https://dev.to/nedimhozic/pulumi-azure-managing-multiple-environments-dev-staging-prod-2pdd</link>
      <guid>https://dev.to/nedimhozic/pulumi-azure-managing-multiple-environments-dev-staging-prod-2pdd</guid>
      <description>&lt;p&gt;Any real-world project has at least two environments — &lt;em&gt;dev&lt;/em&gt; and &lt;em&gt;prod&lt;/em&gt; — and often more: &lt;em&gt;qa&lt;/em&gt;, &lt;em&gt;staging&lt;/em&gt;, sometimes even region-specific environments.&lt;/p&gt;

&lt;p&gt;Why? Because you want to catch mistakes &lt;em&gt;before&lt;/em&gt; they reach production and impact your users.&lt;/p&gt;

&lt;p&gt;From an infrastructure perspective, environments often differ significantly: different data, sizes, pricing tiers… even access controls. It’s not just about testing functionality — it’s about protecting production, reducing costs, and keeping things clean.&lt;/p&gt;

&lt;h2&gt;
  
  
  📚 Pulumi Stacks 101
&lt;/h2&gt;

&lt;p&gt;In Pulumi, environments are managed through stacks. A stack is an isolated instance of your Pulumi program, with its own configuration, state, and resources.&lt;/p&gt;

&lt;p&gt;When you &lt;a href="https://dev.to/nedimhozic/pulumi-azure-series-setting-up-your-first-project-and-why-its-worth-it-4pni"&gt;initialized your project&lt;/a&gt;, you may have already created a stack — but you can add more at any time. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pulumi stack init dev
pulumi stack init prod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This sets up two separate environments. To switch between them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pulumi stack select dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Commands like &lt;code&gt;pulumi up&lt;/code&gt;, &lt;code&gt;preview&lt;/code&gt;, and &lt;code&gt;refresh&lt;/code&gt; will apply to the currently selected stack.&lt;/p&gt;

&lt;p&gt;To list all your stacks and see which one is active:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pulumi stack ls
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🛠 Using Configuration Per Environment
&lt;/h2&gt;

&lt;p&gt;Pulumi uses per-stack config files like &lt;code&gt;Pulumi.dev.yaml&lt;/code&gt; and &lt;code&gt;Pulumi.prod.yaml&lt;/code&gt; to separate settings between environments—keeping your code the same while using different values.&lt;/p&gt;

&lt;p&gt;You can define environment-specific values for things like resource names, SKUs, or feature toggles. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pulumi config set storageAccessTier Cool --stack dev
pulumi config set storageAccessTier Hot --stack prod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you’re working within the currently selected stack, you can omit the &lt;code&gt;--stack&lt;/code&gt; parameter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pulumi config set storageAccessTier Cool
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To read configuration values in your code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import * as pulumi from "@pulumi/pulumi";

const config = new pulumi.Config();
const storageAccessTier = config.require("storageAccessTier");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ✨ Small Demo: Different Storage Accounts for Dev and Prod
&lt;/h2&gt;

&lt;p&gt;Let’s create two storage accounts — one for &lt;code&gt;dev&lt;/code&gt; and one for &lt;code&gt;prod&lt;/code&gt;—with different tiers and naming based on the environment.&lt;/p&gt;

&lt;p&gt;First, switch to the dev environment and set up your config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pulumi stack select dev

pulumi config set env dev
pulumi config set storageAccountTier Standard_LRS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, do the same for the prod environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pulumi stack select prod

pulumi config set env dev
pulumi config set storageAccountTier Standard_GRS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We’ve now defined two config values per stack: one for the environment name and one for the storage account tier.&lt;/p&gt;

&lt;p&gt;While you could use the stack name (&lt;code&gt;dev&lt;/code&gt;, &lt;code&gt;prod&lt;/code&gt;, etc.) as the environment identifier, it’s often better to separate those concepts. For example, your environment might be named &lt;code&gt;qa-west-europe&lt;/code&gt;, while your stack name is just &lt;code&gt;qawe&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now let’s create a storage account and a resource group per environment using those configs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import * as pulumi from "@pulumi/pulumi";
import * as resources from "@pulumi/azure-native/resources";
import * as storage from "@pulumi/azure-native/storage";

const config = new pulumi.Config();
const environment = config.require("env");
const storageAccountTier = config.require("storageAccountTier");

// Create an Azure Resource Group
const resourceGroup = new resources.ResourceGroup("resourceGroup", {
    resourceGroupName: `rg-${environment}`,
});

// Create an Azure resource (Storage Account)
const storageAccount = new storage.StorageAccount("sa", {
    accountName: `sapulumitest${environment}`,
    resourceGroupName: resourceGroup.name,
    sku: {
        name: storageAccountTier,
    },
    kind: storage.Kind.StorageV2,
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This setup creates resource groups named &lt;code&gt;rg-dev&lt;/code&gt; and &lt;code&gt;rg-prod&lt;/code&gt;, along with storage accounts like &lt;code&gt;sapulumitestdev&lt;/code&gt; and &lt;code&gt;sapulumitestprod&lt;/code&gt;, each using its specified storage tier.&lt;/p&gt;

&lt;p&gt;✅ Easy peasy.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 Pro Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keep stack names &lt;strong&gt;simple and lowercase&lt;/strong&gt;: &lt;code&gt;dev&lt;/code&gt;, &lt;code&gt;prod&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;You can &lt;strong&gt;export outputs per stack&lt;/strong&gt; (like connection strings) and fetch them easily.&lt;/li&gt;
&lt;li&gt;Don’t hardcode anything per environment inside the code — &lt;strong&gt;always use config&lt;/strong&gt; where possible.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ✅ Wrap-Up
&lt;/h2&gt;

&lt;p&gt;Pulumi stacks give you a clean, structured way to manage different environments like dev, staging, and prod — each with its own state and settings. By combining stacks with environment-specific configuration, you keep your infrastructure flexible, consistent, and easy to maintain.&lt;/p&gt;

&lt;p&gt;In the next article, we’ll dive deeper into Pulumi configuration: how to manage complex values, structure settings, and securely handle sensitive data using secrets.&lt;/p&gt;

&lt;p&gt;👉 Code for this post is available here on &lt;a href="https://github.com/nedimhozic/pulumi-azure" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>pulumi</category>
      <category>azure</category>
      <category>infrastructureascode</category>
      <category>devops</category>
    </item>
    <item>
      <title>Pulumi + Azure Series: Setting Up Your First Project (and Why It's Worth It)</title>
      <dc:creator>Nedim Hozic</dc:creator>
      <pubDate>Tue, 29 Apr 2025 08:54:15 +0000</pubDate>
      <link>https://dev.to/nedimhozic/pulumi-azure-series-setting-up-your-first-project-and-why-its-worth-it-4pni</link>
      <guid>https://dev.to/nedimhozic/pulumi-azure-series-setting-up-your-first-project-and-why-its-worth-it-4pni</guid>
      <description>&lt;p&gt;If you're a developer who wants more control over infrastructure - without diving into YAML or learning a new DSL - Pulumi might be exactly what you're looking for.&lt;br&gt;
In this article, we'll explore &lt;strong&gt;what Pulumi is, how it compares to Terraform, how it manages state&lt;/strong&gt;, and &lt;strong&gt;how to set up your first Azure resource - a Storage Account&lt;/strong&gt; - using &lt;strong&gt;TypeScript&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  🔍 What Is Pulumi?
&lt;/h2&gt;

&lt;p&gt;Pulumi is an Infrastructure as Code (IaC) tool that lets you define cloud infrastructure using real programming languages and frameworks (and optionally YAML).&lt;br&gt;
It supports &lt;strong&gt;Node.js/TypeScript, Python, Java, Go, and .NET languages (C#, F#, VB).&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;In this series, we'll use &lt;strong&gt;TypeScript&lt;/strong&gt; for examples, as most developers know it or can easily understand it.&lt;br&gt;
We'll also use the &lt;strong&gt;Azure Native provider&lt;/strong&gt;, which provisions resources using the Azure Resource Manager (ARM) APIs - covering the full Azure service surface.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  🧠 Pulumi vs Terraform (Key Differences)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Language&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Terraform: Uses HCL (HashiCorp Configuration Language)&lt;/li&gt;
&lt;li&gt;Pulumi: Uses real languages - TypeScript, Python, Go, C#, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. State Management&lt;/strong&gt;&lt;br&gt;
Terraform uses a &lt;code&gt;.tfstate&lt;/code&gt; file to store the state locally, but you also have a choice to store it in HCP Terraform (Terraform managed solution) or Terraform Enterprise (on-premise self-hosted solution).&lt;/p&gt;

&lt;p&gt;Similar to that, Pulumi allows you to store the state:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Locally in &lt;code&gt;~/.pulumi&lt;/code&gt; files&lt;/li&gt;
&lt;li&gt;Pulumi managed services (Pulumi cloud)&lt;/li&gt;
&lt;li&gt;Or in your own backend (like Azure Blob, S3, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;⚡ How Pulumi Handles State&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwpcqczug61623rrua3vp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwpcqczug61623rrua3vp.png" alt="How Pulumi handles state" width="531" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pulumi CLI fetches the current state from the backend, compares it with your code's desired state, and &lt;strong&gt;directly applies diffs to Azure APIs.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note&lt;/strong&gt;: Pulumi &lt;strong&gt;does not automatically detect drift&lt;/strong&gt; when running &lt;code&gt;pulumi preview&lt;/code&gt; - you must explicitly run &lt;code&gt;pulumi refresh&lt;/code&gt; to sync changes made outside of Pulumi. (We'll dive deeper into drift detection in a future post!)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  ⚙️ Setting Up Your Pulumi Project
&lt;/h2&gt;

&lt;p&gt;First we need to &lt;a href="https://www.pulumi.com/docs/iac/download-install/" rel="noopener noreferrer"&gt;install Pulumi&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install pulumi # or choco, curl, etc.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, you need to login. Pulumi will ask you where to store the state. Default is Pulumi Cloud (free tier) which we are using this first chapter. Later, we might explore other options as well.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pulumi login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you did that, you can freely create new folder with the name of your project, open that folder and execute creation of the actual Pulumi project, like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir pulumi-azure-start &amp;amp;&amp;amp; cd pulumi-azure-start
pulumi new azure-typescript
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will be asked to enter the project name (folder name per default), stack name (&lt;code&gt;dev&lt;/code&gt;, &lt;code&gt;prod&lt;/code&gt;, etc), and default Azure location (e.g. &lt;code&gt;westeurope&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📁 Your Project Structure&lt;/strong&gt;&lt;br&gt;
You'll see files like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;index.ts&lt;/code&gt; – Your Pulumi program (TypeScript code)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;package.json&lt;/code&gt; – Project dependencies&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Pulumi.yaml&lt;/code&gt; – Project config&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Pulumi.dev.yaml&lt;/code&gt; – Stack-specific config&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tsconfig.json&lt;/code&gt; – TypeScript settings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;📦 Default index.ts Content&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import * as pulumi from "@pulumi/pulumi";
import * as resources from "@pulumi/azure-native/resources";
import * as storage from "@pulumi/azure-native/storage";

// Create an Azure Resource Group
const resourceGroup = new resources.ResourceGroup("resourceGroup");

// Create an Azure resource (Storage Account)
const storageAccount = new storage.StorageAccount("sa", {
    resourceGroupName: resourceGroup.name,
    sku: {
        name: storage.SkuName.Standard_LRS,
    },
    kind: storage.Kind.StorageV2,
});

// Export the primary key of the Storage Account
const storageAccountKeys = storage.listStorageAccountKeysOutput({
    resourceGroupName: resourceGroup.name,
    accountName: storageAccount.name
});

export const primaryStorageKey = storageAccountKeys.keys[0].value;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is clearly visible that we are having resource group and storage account in that resource group.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Tip:&lt;/strong&gt; The first parameter (e.g., &lt;code&gt;"resourceGroup"&lt;/code&gt;, &lt;code&gt;"sa"&lt;/code&gt;) is the unique name &lt;strong&gt;inside Pulumi state&lt;/strong&gt;, not the actual Azure resource name.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;🚀 Preview and Deploy&lt;/strong&gt;&lt;br&gt;
Preview the changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pulumi preview
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Previewing update (dev)

View in Browser (Ctrl+O): https://app.pulumi.com/xxx/pulumi-azure-start/dev/previews/xxx

     Type                                     Name                    Plan       
 +   pulumi:pulumi:Stack                      pulumi-azure-start-dev  create     
 +   ├─ azure-native:resources:ResourceGroup  resourceGroup           create     
 +   └─ azure-native:storage:StorageAccount   sa                      create     

Outputs:
    primaryStorageKey: output&amp;lt;string&amp;gt;

Resources:
    + 3 to create
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apply the changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pulumi up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And just like that, your Azure Storage Account is live!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyyh5bnqkduzopfpymtz7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyyh5bnqkduzopfpymtz7.png" alt="Created Azure resources" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ Wrap-Up and What's Next
&lt;/h2&gt;

&lt;p&gt;In just a few lines of TypeScript, we provisioned an Azure Storage Account - no portals, no YAML, no magic. In the next article, we'll explore how to structure Pulumi projects and use configuration to handle different environments (dev/prod).&lt;/p&gt;

&lt;p&gt;👉 Code for this post is available &lt;a href="https://github.com/nedimhozic/pulumi-azure" rel="noopener noreferrer"&gt;here on GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>pulumi</category>
      <category>azure</category>
      <category>typescript</category>
      <category>infrastructureascode</category>
    </item>
    <item>
      <title>Pulumi + Azure Series: A Developer’s Perspective</title>
      <dc:creator>Nedim Hozic</dc:creator>
      <pubDate>Sun, 20 Apr 2025 18:46:52 +0000</pubDate>
      <link>https://dev.to/nedimhozic/pulumi-azure-series-a-developers-perspective-4h5f</link>
      <guid>https://dev.to/nedimhozic/pulumi-azure-series-a-developers-perspective-4h5f</guid>
      <description>&lt;p&gt;We live in an era where news and data are everywhere — instantly available, constantly updated, and often overwhelming. In software circles, every tool has its own fan base, community, stack of blog posts, and even full-blown evangelists.&lt;/p&gt;

&lt;p&gt;Yet somehow, Pulumi has always felt a bit underappreciated to me. Maybe it’s because it’s not as widely adopted as Terraform, or maybe because it’s relatively young. Either way, I’ve felt a growing urge to share how genuinely powerful it is — especially when combined with Azure, the cloud I work with the most.&lt;/p&gt;

&lt;p&gt;Pulumi isn’t limited to Azure, of course. It has great support for AWS, GCP, Kubernetes, and many other providers. But for this series, we’ll be focusing on real-world scenarios in Azure, because that’s where I’ve spent most of my time, and where Pulumi has truly helped me streamline and modernize how I build infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  💻 Why This Series Matters (Especially if You’re a Dev)
&lt;/h2&gt;

&lt;p&gt;Infrastructure is part of our jobs now — even if you don’t have “DevOps” in your title. Pulumi lets you stay in your language, use your tools, and build infrastructure as if you’re coding features — not writing declarations.&lt;/p&gt;

&lt;p&gt;Some time ago, I wrote an article about .NET Aspire and how it’s expanding a developer’s responsibilities into the infrastructure space: .NET Aspire: &lt;a href="https://medium.com/@nedimhozic/net-aspire-bridging-the-gap-between-application-and-infrastructure-07e94e8e9432" rel="noopener noreferrer"&gt;Bridging the Gap Between Application and Infrastructure&lt;/a&gt;. Aspire makes it clear: developers are no longer just writing APIs or frontends — they’re owning how those pieces run in the real world. Things like service discovery, environment configuration, diagnostics, and containerization are now just normal dev tasks.&lt;/p&gt;

&lt;p&gt;But even outside of Aspire or .NET, this shift is happening everywhere. Developers today often need to spin up queues, databases, storage accounts, or set up secure communication between microservices. And let’s be honest — waiting on another team to provision these, or managing them manually through the Azure Portal, is not scalable or fun.&lt;/p&gt;

&lt;p&gt;With Pulumi, you can own those pieces with the same tools and patterns you already use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You can write infra using TypeScript, Python, Go, C#, or your team’s stack.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can commit it to Git, test it, refactor it, and review it like any other code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You don’t need to switch between a DSL like Bicep or write giant YAML files.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s a big deal.&lt;/p&gt;

&lt;p&gt;Pulumi doesn’t ask you to become an infrastructure engineer overnight. It just lets you take ownership of the parts that are closest to your applications — things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your app’s hosting environment (App Service, Function, Container App)&lt;/li&gt;
&lt;li&gt;Connected services (Redis, CosmosDB, Storage)&lt;/li&gt;
&lt;li&gt;Communication and messaging layers (Kafka, Event Hubs, Service Bus, SignalR)&lt;/li&gt;
&lt;li&gt;Identity and secrets&lt;/li&gt;
&lt;li&gt;It’s about bringing infrastructure closer to the people who understand the app best — you.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔧 What You Can Expect from This Series
&lt;/h2&gt;

&lt;p&gt;Here’s a glimpse of what’s coming:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to set up your first Pulumi project with Azure
Deploying real-world infrastructure (App Services, Functions, Storage, AKS, etc.)&lt;/li&gt;
&lt;li&gt;Writing reusable Pulumi components for Azure&lt;/li&gt;
&lt;li&gt;Managing environments and secrets with Pulumi configs&lt;/li&gt;
&lt;li&gt;CI/CD pipelines and automation for IaC&lt;/li&gt;
&lt;li&gt;Tips, gotchas, and Pulumi tricks I’ve learned along the way&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you’re new to Pulumi or just curious about a different approach to Azure infrastructure, I hope this series will help you see what’s possible when you combine real code with cloud automation.&lt;/p&gt;

&lt;p&gt;Let’s get started 🚀&lt;/p&gt;

&lt;p&gt;👉 Next up: Pulumi + Azure: Setting Up Your First Project&lt;/p&gt;

</description>
      <category>azure</category>
      <category>pulumi</category>
      <category>infrastructureascode</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
