DEV Community

Cover image for Deploying an Azure Virtual Machine with Terraform: A Beginner's Guide
kristarking
kristarking

Posted on

1

Deploying an Azure Virtual Machine with Terraform: A Beginner's Guide

Table of Contents

  1. Introduction
  2. Prerequisites
  3. Installing and Configuring Terraform
  4. Setting Up Your Terraform Project in VS Code
  5. Writing the Terraform Configuration
  6. Initializing and Applying the Terraform Configuration
  7. Retrieving the VM's Public IP and Connecting via SSH
  8. Destroying the VM
  9. Conclusion

Introduction

This guide walks you through the step-by-step process of provisioning Azure resources using Terraform, deploying a virtual machine, retrieving its IP, connecting via SSH, and finally destroying the VM. We'll use VS Code to edit our Terraform scripts for a smooth development experience.


Prerequisites

Before we begin, ensure you have the following installed on your machine:


Installing and Configuring Terraform

First, verify that Terraform is installed by running:

terraform -v
Enter fullscreen mode Exit fullscreen mode

If Terraform is not installed, download and install it from Terraform's official site.

Log in to Azure with:

az login
Enter fullscreen mode Exit fullscreen mode

Set your default subscription (replace your-sub-id with your actual subscription ID):

az account set --subscription your-sub-id
Enter fullscreen mode Exit fullscreen mode

Setting Up Your Terraform Project in VS Code

  1. Open VS Code
  2. Create a new folder (e.g., azure-terraform-vm)
  3. Open the folder in VS Code
  4. Create a new file named main.tf

VS code Image description

Writing the Terraform Configuration

Copy the following Terraform code into main.tf. Replace your-VM-name, your-Vnet-name, etc., with meaningful names of your choice. Don't forget to replace the username and password as well, that's what you will use to SSH into your VM

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "4.3.0"
    }
  }
}

provider "azurerm" {
  features {}
  subscription_id = "your-sub-id"
}

resource "azurerm_resource_group" "your-rg-name" {
  name     = "your-rg-name"
  location = "East US"
}

resource "azurerm_virtual_network" "your-Vnet-name" {
  name                = "your-Vnet-name"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.your-rg-name.location
  resource_group_name = azurerm_resource_group.your-rg-name.name
}

resource "azurerm_subnet" "your-Subnet-name" {
  name                 = "your-Subnet-name"
  resource_group_name  = azurerm_resource_group.your-rg-name.name
  virtual_network_name = azurerm_virtual_network.your-Vnet-name.name
  address_prefixes     = ["10.0.1.0/24"]
}

resource "azurerm_public_ip" "your-ip-name" {
  name                = "your-ip-name"
  location            = azurerm_resource_group.your-rg-name.location
  resource_group_name = azurerm_resource_group.your-rg-name.name
  allocation_method   = "Static"
}

resource "azurerm_network_interface" "your-NIC-name" {
  name                = "your-NIC-name"
  location            = azurerm_resource_group.your-rg-name.location
  resource_group_name = azurerm_resource_group.your-rg-name.name

  ip_configuration {
    name                          = "internal"
    subnet_id                     = azurerm_subnet.your-Subnet-name.id
    private_ip_address_allocation = "Static"
    private_ip_address            = "10.0.1.4"  
    public_ip_address_id          = azurerm_public_ip.your-ip-name.id
  }
}

resource "azurerm_linux_virtual_machine" "your-VM-name" {
  name                  = "your-VM-name"
  location              = azurerm_resource_group.your-rg-name.location
  resource_group_name   = azurerm_resource_group.your-rg-name.name
  size                  = "Standard_B2ms"
  admin_username        = "your-admin-username"
  admin_password        = "YourSecurePassword!"
  network_interface_ids = [azurerm_network_interface.your-NIC-name.id]
  disable_password_authentication = false

  os_disk {
    name              = "your-OsDisk-name"
    caching           = "ReadWrite"
    storage_account_type = "Standard_LRS"
  }

  source_image_reference {
    publisher = "Canonical"
    offer     = "0001-com-ubuntu-server-jammy"
    sku       = "22_04-lts-gen2"
    version   = "latest"
  }
}

output "public_ip_address" {
  description = "The public IP address of the virtual machine"
  value       = azurerm_public_ip.your-ip-name.ip_address
}
Enter fullscreen mode Exit fullscreen mode

Initializing and Applying the Terraform Configuration

Run the following commands in the terminal inside VS Code:

terraform init
Enter fullscreen mode Exit fullscreen mode

terraform init Image description

terraform plan
Enter fullscreen mode Exit fullscreen mode

Terraform plan Image description

terraform apply -auto-approve
Enter fullscreen mode Exit fullscreen mode

terraform approve Image description

Terraform will create all the specified resources in Azure.


Azure console Image description

Retrieving the VM's Public IP and Connecting via SSH

Get the public IP:

VM IP Image description

echo $(terraform output -raw public_ip_address)
Enter fullscreen mode Exit fullscreen mode

Use SSH to connect to the VM:

ssh your-admin-username@your-vm-public-ip
Enter fullscreen mode Exit fullscreen mode

Destroying the VM

Once you're done, destroy the VM to avoid unnecessary charges:

terraform destroy -auto-approve
Enter fullscreen mode Exit fullscreen mode

Terraform destroy Image description

Conclusion

Congratulations! 🎉 You've successfully:

  • Provisioned Azure resources using Terraform
  • Deployed a Virtual Machine
  • Retrieved its IP and connected via SSH
  • Cleaned up resources by destroying the VM

This is just the beginning of your Terraform journey in Azure! 🚀 Stay tuned for more DevOps guides.

Hostinger image

Get n8n VPS hosting 3x cheaper than a cloud solution

Get fast, easy, secure n8n VPS hosting from $4.99/mo at Hostinger. Automate any workflow using a pre-installed n8n application and no-code customization.

Start now

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

DEV is better (more customized, reading settings like dark mode etc) when you're signed in!

Okay