Terraform: The Swiss Army Knife of Infrastructure as Code

Brad HarrisBrad Harris
4 min read

If you've ever tried to manage a cloud infrastructure, you know it can feel a lot like herding cats. While cats are great and all, when you just want your servers to behave, you don't need whiskers—you need a tool that keeps everything in check. That's where Terraform comes in. It's like the Swiss Army knife for infrastructure as code, capable of everything from cost management to automated scaling. Let's dive into a few creative uses for Terraform in the Microsoft Azure world, with a couple of jokes to keep things light.

Automated Cost Management

Ever get sticker shock from your cloud bill? It’s like ordering a coffee and finding out they charged you for the whole espresso machine. Terraform can help you avoid those moments by letting you control costs with clever infrastructure management.

For example, let's say you want to use smaller, more affordable virtual machines during off-peak times and beefier ones during peak hours. With Terraform, you can easily set that up:

variable "is_off_peak" {
  type    = bool
  default = true
}

provider "azurerm" {
  features {}
}

resource "azurerm_virtual_machine" "vm" {
  name                  = "example-vm"
  location              = "East US"
  resource_group_name   = "example-rg"
  vm_size               = var.is_off_peak ? "Standard_B1s" : "Standard_DS2_v2"

  storage_os_disk {
    name              = "example-os-disk"
    create_option     = "FromImage"
    managed_disk_type = "Standard_LRS"
  }

  os_profile {
    computer_name  = "example-vm"
    admin_username = "azureuser"
    admin_password = "ChangeMe123!"
  }

  source_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "18.04-LTS"
    version   = "latest"
  }
}

By toggling a variable, you can switch between cost-effective VMs and more powerful ones depending on your needs. It's like having a budget switch—you flip it and save money.

Multi-Environment Deployment with Variable-Based Configurations

Remember the old days of copy-pasting configurations and hoping for the best? Yeah, those days are over. With Terraform, you can create a single set of infrastructure code and deploy it across different environments with just a few tweaks.

Here's how you might set up different variable files for development, staging, and production environments, so you can deploy the same code but with different configurations:

# environments/variables/dev.tfvars
location  = "East US"
vm_size   = "Standard_B1s"

# environments/variables/staging.tfvars
location  = "West US"
vm_size   = "Standard_B2s"

# environments/variables/prod.tfvars
location  = "Central US"
vm_size   = "Standard_DS2_v2"

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "rg" {
  name     = "example-resource-group"
  location = var.location
}

resource "azurerm_virtual_machine" "vm" {
  name                  = "example-vm"
  location              = azurerm_resource_group.rg.location
  resource_group_name   = azurerm_resource_group.rg.name
  vm_size               = var.vm_size

  storage_os_disk {
    name              = "example-os-disk"
    create_option     = "FromImage"
    managed disk_type = "Standard_LRS"
  }

  os_profile {
    computer name = "example-vm"
    admin username = "azureuser"
    admin password = "ChangeMe123!"
  }
}

Now, you can deploy across multiple environments without needing a six-pack of energy drinks to get you through the night. Just pick the right variable file, and you're good to go.

Auto-Scaling Infrastructure Based on Monitoring Metrics

If you've ever had a website go viral, you know the panic of sudden traffic spikes. It's like hosting a party and then the whole city shows up. With Terraform, you can set up auto-scaling based on monitoring metrics, so your infrastructure can grow or shrink as needed—no stress necessary.

Here's an example of creating an Azure Virtual Machine Scale Set with auto-scaling rules based on CPU usage:

provider "azurerm" {
  features {}
}

resource "azurerm_virtual_machine_scale_set" "vmss" {
  name                = "example-vmss"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  overprovision       = true
  sku {
    name     = "Standard_DS2_v2"
    capacity = 2
  }

  storage profile_os_disk {
    create option = "FromImage"
    caching       = "ReadWrite"
    managed_disk type = "Standard_LRS"
  }

  os_profile {
    computer name = "example-vmss"
    admin username = "azureuser"
    admin password = "ChangeMe123!"
  }

  source image reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "18.04-LTS"
    version   = "latest"
  }
}

resource "azurerm_monitor_autoscale_setting" "auto_scale" {
  name                = "example-auto-scale"
  resource group name = azurerm_resource_group.rg.name
  target resource id  = azurerm_virtual_machine_scale set.vmss.id
  min capacity        = 2
  max capacity        = 10

  profile {
    name = "CPU Scaling"

    capacity {
      minimum = 2
      maximum = 10
      default = 2
    }

    rule {
      metric trigger {
        metric name   = "Percentage CPU"
        operator      = "GreaterThan"
        statistic     = "Average"
        threshold     = 70
        time grain    = "PT1M"
        time window   = "PT5M"
        time aggregation = "Average"
      }

      scale action {
        direction   = "Increase"
        type        = "ChangeCount"
        value       = "1"
        cooldown    = "PT1M"
      }
    }

    rule {
      metric trigger {
        metric name   = "Percentage CPU"
        operator      = "LessThan"
        statistic     = "Average"
        threshold     = 30
        time grain    = "PT1M"
        time window   = "PT5M"
        time aggregation = "Average"
      }

      scale action {
        direction   = "Decrease"
        type        = "ChangeCount"
        value       = "1"
        cooldown    = "PT1M"
      }
    }
  }
}

This example creates an Azure Virtual Machine Scale Set with auto-scaling rules. If the CPU usage exceeds 70%, the infrastructure scales up; if it drops below 30%, it scales down. This approach ensures your infrastructure is both responsive and cost-effective, scaling as needed without manual intervention.

Conclusion

Terraform opens a world of possibilities for managing infrastructure with code. By using creative techniques, you can optimize costs, deploy across multiple environments, and implement auto-scaling based on real-time metrics. These examples demonstrate how Terraform can transform your infrastructure management, making it more efficient, consistent, and adaptable to your needs. Whether you're running a small-scale project or a complex multi-cloud deployment, Terraform can help you achieve your infrastructure goals with ease.

0
Subscribe to my newsletter

Read articles from Brad Harris directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Brad Harris
Brad Harris

i am a dedicated cloud security engineer adept at protecting cloud infrastructure and data. Experience mostly in Azure, I have implemented robust security measures and compliance with industry standards, mitigating cyber threats effectively. I am extremely passionate about staying updated and enhancing my skills to safeguard any organizations' assets in the dynamic cloud computing environment.