DEV Community

1suleyman
1suleyman

Posted on

🚀 Deploying Azure Infrastructure with JSON ARM Templates – Explained Like You're 5 (But Smarter)

So, you’ve heard about ARM templates and how they can help you automate your Azure infrastructure. When I first looked into it, I felt like I was staring at a wall of JSON code with no clue where to begin.

Let me break it down in plain English, with real-life analogies, so you can understand what they are, why they matter, and how to start using them—without frying your brain. 🧠🍳


🧱 What Are ARM Templates (Really)?

Think of an ARM template like a blueprint for a house. Just like you wouldn't build a home without a floor plan, you shouldn't build infrastructure in Azure by clicking around randomly in the portal—especially if you're deploying it more than once or for multiple clients.

Instead, you define everything in a JSON file: which resources you need, what settings they should have, where they live, and how they connect. This file is called your ARM template.

Here’s what’s cool: you don’t need to say how to build it. You just say what you want, and Azure handles the rest. That’s called declarative syntax (vs. imperative scripting, which is like giving step-by-step cooking instructions).


🧙 Infrastructure as Code: Magic in Action

Infrastructure as Code (IaC) = treating your cloud setup like code.

It means your servers, storage accounts, databases, and more are versioned, repeatable, and stored right next to your application code.

Benefits?

  • 🔁 Repeatable and consistent deployments
  • 🧪 Easy to test in dev and scale to prod
  • 🧾 Everything is documented
  • 👀 Track changes over time (thanks, Git!)

🧩 ARM Template Anatomy (aka What Goes Inside)

Here's the basic structure of an ARM template:

{
  "$schema": "...",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "variables": {},
  "resources": [],
  "outputs": {}
}
Enter fullscreen mode Exit fullscreen mode

Let’s break that down like a smoothie recipe:

Part What It Is
$schema The rules/format for your JSON (like which cookbook you’re using)
contentVersion The version of your template (handy for version control)
parameters Ingredients you’ll decide later (like "add 1 cup of [whatever you want]")
variables Helpers to simplify repeated values (like naming patterns)
resources The actual things you're building in Azure (like storage accounts, VMs)
outputs The final result values (like “Your storage URL is: …”)

🎛️ Parameters: Making Templates Flexible

Imagine you’re baking cookies, and you always want the freedom to switch between chocolate chip and oatmeal raisin. Parameters in ARM templates let you do exactly that—for infrastructure.

Instead of hardcoding "Standard_LRS" for a storage account, you do this:

"parameters": {
  "storageAccountType": {
    "type": "string",
    "defaultValue": "Standard_LRS",
    "allowedValues": ["Standard_LRS", "Standard_GRS", "Premium_LRS"],
    "metadata": {
      "description": "Choose your storage account SKU"
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Now, when you deploy, you can simply say:

az deployment group create \
  --name myDeployment \
  --resource-group myResourceGroup \
  --template-file azuredeploy.json \
  --parameters storageAccountType=Premium_LRS
Enter fullscreen mode Exit fullscreen mode

Ta-da! You now have a reusable, adaptable template.


📤 Outputs: Your Deployment Receipt

Ever order something online and want to know where it ended up? That’s what outputs do.

They return info like:

  • The URL of your new storage account
  • Connection strings
  • IP addresses

Example output:

"outputs": {
  "storageEndpoint": {
    "type": "object",
    "value": "[reference('learntemplatestorage123').primaryEndpoints]"
  }
}
Enter fullscreen mode Exit fullscreen mode

This is super handy for passing info to other tools or scripts.


🔁 Idempotent = Smart and Safe

ARM templates are idempotent (fancy word, simple meaning):

If nothing has changed in the template, running it again doesn’t break or duplicate anything.

You can deploy the same template multiple times, and it only updates what’s needed. No surprises, no “Oops, we created another VM by mistake” moments.


💥 Real-Life Example: Deploy a Storage Account

Here's a small but powerful example of what deploying a storage account looks like:

{
  "$schema": "...",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageAccountType": {
      "type": "string",
      "defaultValue": "Standard_LRS"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2023-05-01",
      "name": "mycoolstorage123",
      "location": "[resourceGroup().location]",
      "sku": {
        "name": "[parameters('storageAccountType')]"
      },
      "kind": "StorageV2",
      "properties": {
        "supportsHttpsTrafficOnly": true
      }
    }
  ],
  "outputs": {
    "storageUrl": {
      "type": "string",
      "value": "[reference('mycoolstorage123').primaryEndpoints.blob]"
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

🚀 How to Deploy Your Template (CLI Style)

az login
az group create --name myResourceGroup --location eastus
az deployment group create \
  --name storageDeploy \
  --resource-group myResourceGroup \
  --template-file azuredeploy.json \
  --parameters storageAccountType=Standard_LRS
Enter fullscreen mode Exit fullscreen mode

And just like that, you're deploying like a pro!


👨‍💻 Bicep > JSON (If You’re Just Getting Started)

If ARM templates still feel like too much code soup, check out Bicep — it's like ARM templates but with less typing, better readability, and fewer brackets to break your brain.

Example:

resource storage 'Microsoft.Storage/storageAccounts@2023-05-01' = {
  name: 'mystorageacct123'
  location: resourceGroup().location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
  properties: {
    supportsHttpsTrafficOnly: true
  }
}
Enter fullscreen mode Exit fullscreen mode

Way cleaner, right?


🧠 Final Thoughts: Why This Matters

ARM templates helped me:

  • Learn how Azure resources are built
  • Understand how to automate and scale deployments
  • Gain confidence in managing real-world infrastructure

If you're a beginner in cloud or DevOps, learning how to use ARM templates (or Bicep!) is a game-changer for managing infrastructure reliably.

It’s like going from building IKEA furniture with random tools… to having an instruction manual, a labeled toolkit, and a robot that assembles it all for you. 🤖🛠️


Want to Connect?!!!

If you're diving into Azure and infrastructure as code too, let's connect! I'm always up for meeting others on the same learning path. You can find me on LinkedIn — drop me a message and just say hi 👋. Would love to hear what you're working on or learning!

Image of Stellar post

Check out Episode 1: How a Hackathon Project Became a Web3 Startup 🚀

Ever wondered what it takes to build a web3 startup from scratch? In the Stellar Dev Diaries series, we follow the journey of a team of developers building on the Stellar Network as they go from hackathon win to getting funded and launching on mainnet.

Read more

Top comments (0)

👋 Kindness is contagious

Dive into this thoughtful article, cherished within the supportive DEV Community. Coders of every background are encouraged to share and grow our collective expertise.

A genuine "thank you" can brighten someone’s day—drop your appreciation in the comments below!

On DEV, sharing knowledge smooths our journey and strengthens our community bonds. Found value here? A quick thank you to the author makes a big difference.

Okay