A couple of weeks ago I attended John Martin’s (t) Terraform pre-con at Data in Devon. I’ve been hearing about Terraform recently so was excited to check it out.
John’s pre-con was absolutely fantastic, he provided a great insight into Terraform and I highly recommend it to anyone who’s looking at learning it to sign up if you see it at a future event.
So armed with my new found knowledge, I wanted to go about deploying SQL Server into an Azure Container Instance using Terraform. This blog is the first in a series where I’ll go through how to use Terraform. This post will get SQL Server up and running in an ACI and then future posts will go a bit deeper.
To follow along with this blog you will need the following tools: –
Terraform
Azure CLI
VSCode
Terraform extension for VSCode
Azure Terraform extension for VSCode
OK, let’s go through building the required Terraform files to deploy SQL Server to an Azure Container Instance.
First, log into your Azure account: –
az login
Make a note of the id and tenantId.
Next, create service principal which we will reference to allow Terraform to create resources in Azure. Make a note of the clientid and secret: –
az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
Ok, now we can start creating Terraform files.
Let’s create a directory for the terraform files and navigate to it: –
mkdir Terraform-ACI cd Terraform-ACI
The first file to create is a providers file. This tells Terraform that we will be working in Azure so it will pull down the relevant plugin: –
new-item providers.tf
Now drop the following into the providers.tf file (using the values you noted above): –
provider "azurerm" { version = "1.24.0" subscription_id = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" tenant_id = "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb" client_id = "cccccccc-cccc-cccc-cccc-cccccccccccc" client_secret = "dddddddd-dddd-dddd-dddd-dddddddddddd" }
The first resource we’ll create in Azure is a resource group to hold the ACI: –
new-item resourcegroup.tf
Drop the following into the resource group file
resource "azurerm_resource_group" "azurecontainerinstances" { name = "azurecontainerinstances" location = "eastus" }
Note the format of the file, it’s laid out as: –
resource "RESOURCE_TYPE" "RESOURCE_NAME" { attribute_name = "attribute_value" }
The RESOURCE_NAME is the name of the resource that will be referenced in Terraform. It can look a little confusing as in the code above I’ve called the resource name in Terraform the same name as the name of the resource group in Azure (the name attribute).
What’s cool is with the Azure Terraform VSCode extension, we can click on the RESOURCE_TYPE field and it will take us to the documentation for that resource. Makes things a lot easier!
Ok, now that we have a resource group we can create the Terraform file to deploy the Azure Container Instance into it: –
new-item azurecontainerinstance.tf
Drop the following into the file: –
resource "azurerm_container_group" "testcontainergroup1" { name = "testcontainergroup1" location = "${azurerm_resource_group.azurecontainerinstances.location}" resource_group_name = "${azurerm_resource_group.azurecontainerinstances.name}" ip_address_type = "public" dns_name_label = "testcontainergroup1" os_type = "Linux" container { name = "testcontainer" image = "mcr.microsoft.com/mssql/server:2019-CTP2.5-ubuntu" cpu = "1.0" memory = "2.0" ports { port = 1433 protocol = "TCP" } environment_variables = { "ACCEPT_EULA" = "Y" "SA_PASSWORD" = "Testing1122" } } }
What this is going to do is create an Azure Container Instance Group with one container it in, running SQL Server 2019 CTP 2.5. It’ll be publicly exposed to the internet on port 1433 (I’ll cover fixing that in a future post) so we’ll get a public IP that we can use to connect to.
Notice that the location and resource_group_name are set using variables that retrieve the values of the resource group are going to create.
Cool! We are ready to go!
Initialise the directory: –
terraform init
One cool feature of Terraform is the ability to format all the files (seriously love this): –
terraform fmt
And now we can test the deployment (also love this feature): –
terraform plan
If all looks good, we can deploy!
terraform apply
Awesome stuff. Terraform will give us updates on how the deployment is doing: –
To get the IP address of the new Azure Container Instance: –
az container show --name testcontainergroup1 --resource-group azurecontainerinstances
Drop that IP Address into SSMS or ADS: –
And boom! We are connected to SQL Server 2019 CTP2.5 running in an Azure Container Instance deployed with Terraform.
If you want to tear down what’s just been built, you can run: –
terraform destroy
Thanks for reading!