Terraform

How to Provision Azure AKS Cluster Using Terraform

154.terraform aks

In this article, we will show how to create an AKS cluster on Azure using Terraform with just four lines of code!

Creating an AKS Cluster

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

provider "azurerm" {
   features {}
}

module "aks_example_named_cluster" {
  source  = "Azure/aks/azurerm//examples/named_cluster"
  version = "6.2.0"
}
terraform init terraform aks
terraform apply terraform aks

Your AKS cluster will be created!

terraform aks cluster

Jump into the Azure portal, and you should see a resource group with a randomly created name containing seven resources, as shown below:

  • Most Azure environments will probably want to hook into and reuse an existing key vault, log analytics workspace, and virtual network for example.
  • You will also likely have a defined naming format you should adhere to rather than the randomly created names for the key vault, managed identity, and virtual network shown above.
  • You might also want to amend the outputs so you can use the values in other parts of your Terraform configuration.
  • You might want to tailor the deployment to adhere to specific policies to harden and secure your AKS deployment.

Diving into the AKS Module

The source code on GitHub for the module is linked from the Terraform registry page.

On the README page, the available inputs and outputs are listed, which, when set, allow you to customize your deployment. These are also listed on the Terraform registry page, as with all modules.

The providers used by the module are listed on the dependencies tab. These are downloaded and installed automatically upon terraform init.

To adhere to recommended security settings when deploying an AKS cluster, the module sets some recommended defaults from the Azure policies section at Bridgecrew by Prisma Cloud, such as ensuring AKS uses a disk encryption set. You can check out their recommendations for your cluster here.

Example Custom Configuration Using the AKS Terraform Registry Module

To show how to use the Registry module with some custom values, we will run through an example configuration.

On the Terraform registry page, you will notice there are two required inputs, prefix and resource_group_name. These will need to be defined.

I’ll add a prefix of “test” and import a resource group I previously created called “aks-test-rg”.

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

provider "azurerm" {
   features {}
}

module "aks_example_named_cluster" {
  source              = "Azure/aks/azurerm/"
  version             = "6.2.0"
  prefix              = "test"
  resource_group_name = "aks-test-rg"
}

From the available optional values, I will set the admin_usernameto “testaksadmin”.

terraform aks admin username

I will turn on the Azure Policy Addon:

terraform aks Azure Policy Addon

I will link my AKS cluster to my previously created log analytics workspace by setting cluster_log_analytics_workspace_name to “test-aks-law”.

terraform aks Azure Policy Addon

I will set the cluster name to adhere with my naming convention by setting cluster_name to “jr-test-aks”.

terraform aks ingress name

I will define the locationof my cluster as “uksouth”.

I will set the log_retention_in_days to “365” days:

terraform aks cluster retention

My code now looks like this:

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

provider "azurerm" {
   features {}
}

module "aks_example_named_cluster" {
  source                               = "Azure/aks/azurerm"
  version                              = "6.2.0"
  prefix                               = "test"
  resource_group_name                  = "aks-test-rg"
  admin_username                       = "testaksadmin"
  azure_policy_enabled                 = true
  cluster_log_analytics_workspace_name = "test-aks-law"
  cluster_name                         = "jr-test-aks"
  location                             = "uksouth"
  log_retention_in_days                = "365"
}

Run terraform init (make sure you have the latest Terraform version! by typing terraform version to avoid unexpected errors!)

terraform init provider terraform aks
terraform plan terraform aks

Key Points

Don’t forget to take a look at how Spacelift helps you manage the complexities and compliance challenges of using Terraform. It brings with it a GitOps flow, so your infrastructure repository is synced with your Terraform Stacks, and pull requests show you a preview of what they’re planning to change. It also has an extensive selection of policies, which lets you automate compliance checks and build complex multi-stack workflows. You may also check how initialization policies work with Spacelift.

Note: New versions of Terraform will be placed under the BUSL license, but everything created before version 1.5.x stays open-source. OpenTofu is an open-source version of Terraform that will expand on Terraform’s existing concepts and offerings. It is a viable alternative to HashiCorp’s Terraform, being forked from Terraform version 1.5.6. OpenTofu retained all the features and functionalities that had made Terraform popular among developers while also introducing improvements and enhancements. OpenTofu is not going to have its own providers and modules, but it is going to use its own registry for them.

Manage Terraform Better and Faster

If you are struggling with Terraform automation and management, check out Spacelift. It helps you manage Terraform state, build more complex workflows, and adds several must-have capabilities for end-to-end infrastructure management.

Start free trial
Terraform CLI Commands Cheatsheet

Initialize/ plan/ apply your IaC, manage modules, state, and more.

Share your data and download the cheatsheet