Deploying Your First Azure VM using Terraform: Super Fast
If you’re new to the Hashicorp world for deployments or perhaps have been using something like Heroku for all cloud setups then this might be a useful guide to how to get rolling with infra setups for your apps.
I’d like to take you through the process of using Hashicorp’s Terraform for setting up some infra in the cloud. Here what we’re doing is using Azure as a cloud provided and setting up a simple Ubuntu VM and then connecting to it. The idea is to give you a clear idea on what the steps are and how you can optimize this yourself for you particular setup.
Step 1 What you need
Get a Azure subscription
Run Azure Cloud Shell, check all is cool using
az account show
Step 2 — Create a Terraform Config File
mkdir terraform && cd $_
code main.tf
Using the following code
provider "azurerm" {
version = "1.38.0"
}
#create resource group
resource "azurerm_resource_group" "rg" {
name = "rg-MyFirstTerraform"
location = "westus2"
tags = {
Environment = "Terraform Demo"
}
}
#Create virtual network
resource "azurerm_virtual_network" "vnet" {
name = "vnet-dev-westus2-001"
address_space = ["10.0.0.0/16"]
location = "westus2"
resource_group_name = azurerm_resource_group.rg.name
}
# Create subnet
resource "azurerm_subnet" "subnet" {
name = "snet-dev-westus2-001 "
resource_group_name = azurerm_resource_group.rg.name
virtual_network_name = azurerm_virtual_network.vnet.name
address_prefix = "10.0.0.0/24"
}
# Create public IP
resource "azurerm_public_ip" "publicip" {
name = "pip-vmterraform-dev-westus2-001"
location = "westus2"
resource_group_name = azurerm_resource_group.rg.name
allocation_method = "Static"
}
# Create network security group and rule
resource "azurerm_network_security_group" "nsg" {
name = "nsg-sshallow-001 "
location = "westus2"
resource_group_name = azurerm_resource_group.rg.name
security_rule {
name = "SSH"
priority = 1001
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "22"
source_address_prefix = "*"
destination_address_prefix = "*"
}
}
# Create network interface
resource "azurerm_network_interface" "nic" {
name = "nic-01-vmterraform-dev-001 "
location = "westus2"
resource_group_name = azurerm_resource_group.rg.name
network_security_group_id = azurerm_network_security_group.nsg.id
ip_configuration {
name = "niccfg-vmterraform"
subnet_id = azurerm_subnet.subnet.id
private_ip_address_allocation = "dynamic"
public_ip_address_id = azurerm_public_ip.publicip.id
}
}
# Create virtual machine
resource "azurerm_virtual_machine" "vm" {
name = "vmterraform"
location = "westus2"
resource_group_name = azurerm_resource_group.rg.name
network_interface_ids = [azurerm_network_interface.nic.id]
vm_size = "Standard_B1s"
storage_os_disk {
name = "stvmpmvmterraformos"
caching = "ReadWrite"
create_option = "FromImage"
managed_disk_type = "Premium_LRS"
}
storage_image_reference {
publisher = "Canonical"
offer = "UbuntuServer"
sku = "16.04.0-LTS"
version = "latest"
}
os_profile {
computer_name = "vmterraform"
admin_username = "terrauser"
admin_password = "Password1234!"
}
os_profile_linux_config {
disable_password_authentication = false
}
}
Step 3 Now, let’s run terraform init
to initialize our directory.
terraform plan -out=myterraplan
With the command terraform show
we can specify our plan file name and review the plan or even have another team member review it.
Step 4
Next we want to do the Run our terraform apply
against the actions in the plan file by specifying the file name. Notice that we won’t be prompted to confirm that we want to apply the changes when we run apply this way:
terraform apply myterraplan
The infra will start getting built.
Step 5 Play with your newly built infra
Start having some fun and play with the stuff you’ve build by connecting int first.
ssh terrauser@20.94.215.10
Step 5 Blow the infra away
The first thing you want to do is do a plan for the destroy action
terraform plan -destroy -out=myplanfiledestroy
Carefully review this as it includes a bunch of actions, including destoying all the infra associated to the VM including public address
terraform apply myplanfiledestroy
What to do next
Thats really about it. What you do want to do is add this to your git pipleine and use Visual Studio code for edits and use the associated reference files for terraform code optimisation.
I hope you’ve found this a simple guide to setting up some infra for your apps.
Useful commands
terraform init — Used to initialise the Terraform directory
terraform plan — Shows the Terraform plan
terraform apply — Applies the Terraform code
terraform destroy — Destroys resources deployed via Terraform
Useful Links
https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs