One of the first uses I’ll have for Terraform in my work will be adding resources to an existing environment – an environment for which Terraform has no state information. This means when I’m declaring the new VMs and want to tie it to a Resource Group, Terraform won’t have a matching resource for that.
Today I’ve been playing around with Terraform import in my sandbox to become familiar with the process. In my sandbox I have an existing Resource Group, Virtual Network, and Subnet. I intended to add a simple network interface, tied to an already-existing subnet.
To begin, I declared my existing resources in my .TF file as I would want them to exist (technically matching how they exist right now):
resource "azurerm_resource_group" "Client_1" {
name = "Client_1"
location = "${var.location}"
}
resource "azurerm_virtual_network" "Client1Network" {
name = "Client1Network"
address_space = ["10.1.0.0/16"]
location = "${var.location}"
resource_group_name = "${azurerm_resource_group.Client_1.name}"
}
resource "azurerm_subnet" "Web" {
name = "Web"
resource_group_name = "${azurerm_resource_group.Client_1.name}"
virtual_network_name = "${azurerm_virtual_network.Client1Network.name}"
address_prefix = "10.1.10.0/24"
}
Then for each of them I gathered the Resource ID in Azure. For the resource group and virtual network this was simple enough; find the Properties pane and copy the string that was there:
For the Subnet, there wasn’t an easy GUI reference that I could find, so I turned to Azure PowerShell, which output the ID I needed:
$vmnet = get-azurermVirtualnetwork | where {$_.Name -eq "Client1Network" }
get-azurermvirtualnetworksubnetconfig -virtualnetwork $vmnet
Then I used the Terraform “import” command along with the resource declaration and name in my file, and the resource ID from Azure:
terraform import azurerm_resource_group.Client_1 /subscriptions/f745d13d/resourceGroups/Client_1/providers/Microsoft.Network/virtualNetworks/Client1Network
I repeated the process for the resource group, virtual network, and subnet.
Then I added the resource declartaion in my .TF file for the network interface I wanted to add:
resource "azurerm_network_interface" "testNIC" {
name = "testNIC"
location = "${var.location}"
resource_group_name = "${azurerm_resource_group.Client_1.name}"
ip_configuration {
name = "testconfiguration1"
subnet_id = "${azurerm_subnet.Web.id}"
private_ip_address_allocation = "dynamic"
}
}
Then I performed a “terraform plan”, which showed me the resource it detected needing to be created:
Once I completed the “terraform apply”, the resource was created and visible within my Azure portal.