Terraform for beginers with Azure
I originally posted this on my personal blog site where I have more posts explain how I got the site up and running.
Working with Terraform
This post will discuss some of the basic concepts around using terraform and how it has been used to build this blog site.
What is Terraform
Terraform is an open source tool used to create, configure and maintain a wide variety of system infrastructure.
In most cases it's used to manage systems built on the cloud, whether that's Azure, AWS or Google Cloud Platform (or a mixture!) but it can also be used to manage other things like Datadog amongst many more.
This is typically done via "providers" which can be thought of extensions to the base terraform tool with specific functionality to create resources.
In this example we will be using the Azure RM (resource manager) provider.
Prerequisites
- Your gonna need an Azure account (if you don't have one already).
- You will also need the terraform tool
How does it work
I won't profess to known the inner workings of Terraform, but I will go over what I know.
It's all about state
State is how Terraform knows what you've currently got managed via the tool. As we will see later as the terraform tool is used it creates a .tfstate file which is basically a big block of JSON containing all of the knowledge about what you are intending to deploy or have deployed. It's also used by Terraform to work out what you haven't currently got managed under it's system.
State plays a very important role and if the state file is deleted or becomes corrupted it can be a bit of a head ache!
State can be configured to either be a local file or stored externally, in the case of this site I had chosen to upload the state file to blob storage. It's all automated (probably a post for another day) so I don't have to overly think about losing the state.
Command the helm - init, plan and apply
Terraform has a wide variety of commands to manage resources, but in my experience so far the main 3 I've been working with are init
, plan
and apply
.
init
initialises the directory ready for use with Terraform, it scans through the .tf files to do a sort of "pre assesment", here it determines what prodivders will be required and goes and fetches them.
It also determines the backend configuration i.e if it will keep the state file local or should use on refernced elsewhere.
plan
Is the second main command I use, as the name implies it generates a plan that will be executed by the apply
command. Running the plan displays a list of changes that the Terraform has calculated, be it new resources or configuration denoted by +
, changes to existing resources denoted with ~
or the "destruction" of resources denoted with the -
. This is really useful for giving a visual check before you up and remove say a database.
apply
Happy with the plan? Hit apply. With this final command Terraform simply executes and creates, changes or destroys the resources. There really isn't anything more to it.
Bonus command
destroy
is probably worth mentioning, as it's useful when you're done with the resources and want to completely remove them.(Note it will only destroy the resources currently managed by Terraform).
Creating the Resources
Now I'm going to go through some steps to spin up a serverless static website.
Getting set up
So you've got the azure account and downloaded Terraform, then you're ready to go.
Open up your favourite IDE and let's begin.
Firstly if you haven't already grab the resources on my github then open a terminal in the src directory (I use VS Code).
I'll breifly explain the files.
There is the main file, which specifies the version of the azurerm provider (terraform recommends sticking to a specific version, mainly for continuity purposes) as well as a resource group.
provider "azurerm" {
version = "=2.23.0"
features {}
}
resource "azurerm_resource_group" "resource-group" {
name = "simple-terraform-app"
location = "ukwest"
}
The other file static_site contains the definitions for the static site
resource "azurerm_storage_account" "static-site" {
name = "simpleterraformsite" #This will need changing to a unique value
resource_group_name = azurerm_resource_group.resource-group.name
location = azurerm_resource_group.resource-group.location
account_tier = "Standard"
account_replication_type = "LRS"
account_kind = "StorageV2"
enable_https_traffic_only = false
static_website {
index_document = "index.html"
error_404_document = "404.html"
}
}
From here it's a case of running terraform init
which should give results as below:
Next step is to run the terraform plan
again the out put will bt similar to the below
Once that's done and dusted it's time to run terraform apply
here terraform should display the plan but this time prompt you to confirm the plan, simply type yes.
You will then see more console output from terraform detailing the current completion state.
Checking the resources
Now head over to Azure to confirm that the resource group has been created as expected.
In this resource group you should find a single storage account resource
If you then inspect the Static Website tab in the left hand panel of the resource you should be able to see details on the sites configuration
From here the next steps to get a working site are to upload the html files found in the repo.
Navigate to the container in the storage account and upload the files in the $web container.
Once complete when you navigate to the web address of the blob container you should get the index page.
A static site hosted in blob is a low cost (practicaly free) way of creating a website in Azure.
That said it's always a good idea to remove resources you don't need, so it you don't plan on keeping the site run terraform destroy
and confirm to remove the resources
And that's it, hope you enjoyed.
Where to find me
Best place would be twitter
Top comments (0)