Shubhankit Mishra
Shubhankit Mishra

Reputation: 3

A managed resource "azurerm_network_interface" "myterraformnic" has not been declared in module.vm. Azure

I have created two modules:

  1. Network 2. VM In network.tf I have added network configuration thing for azure and in vm.tf I am trying to create a Virtual Machine. Calling both modules from main.tf I'm getting this error:

    on ..\modules\vm\vm.tf line 20, in resource "azurerm_windows_virtual_machine" "myterraformvm": 20: network_interface_ids = [azurerm_network_interface.myterraformnic.id]

    A managed resource "azurerm_network_interface" "myterraformnic" has not been declared in module.vm.

This is the code of vm.tf

    # Resource Group
resource "azurerm_resource_group" "myterraformgroup" {
    name     = "myResourceGroup"
    location = "eastus"
}
resource "azurerm_image" "example" {
  # (resource arguments)
 
  name     = "WINDOWS2019C"
  location = "eastus"
  resource_group_name = azurerm_resource_group.myterraformgroup.name
}

# Virtual Machine Properties

resource "azurerm_windows_virtual_machine" "myterraformvm" {
    name                  = "myVM"
    location              = "eastus"
    resource_group_name   = azurerm_resource_group.myterraformgroup.name
    network_interface_ids = [azurerm_network_interface.myterraformnic.id]
    size                  = "Standard_DS1_v2"
    admin_username      = "XXXXXXXXXXXXX"
    admin_password      = "XXXXXXXXXXXXXX"

    os_disk {
        name              = "myOsDisk"
        caching           = "ReadWrite"
        storage_account_type = "Premium_LRS"
    }
    source_image_id = "/subscriptions/XXXXXXXXXXXXXXXXXXX/soft.Compute/images/XXXXXXXX"
}

This is the code of network.tf

 #Create virtual network
resource "azurerm_resource_group" "myterraformgroup" {
    name     = "myResourceGroup"
    location = "eastus"
}
resource "azurerm_virtual_network" "myterraformnetwork" {
    name                = "myVnet"
    address_space       = ["10.0.0.0/16"]
    location            = "eastus"
    resource_group_name = azurerm_resource_group.myterraformgroup.name

    tags = {
        environment = "Terraform Demo"
    }
}

# Create subnet
resource "azurerm_subnet" "myterraformsubnet" {
    name                 = "mySubnet"
    resource_group_name  = azurerm_resource_group.myterraformgroup.name
    virtual_network_name = azurerm_virtual_network.myterraformnetwork.name
    address_prefixes       = ["10.0.1.0/24"]
}

# Create public IPs
resource "azurerm_public_ip" "myterraformpublicip" {
    name                         = "myPublicIP"
    location                     = "eastus"
    resource_group_name          = azurerm_resource_group.myterraformgroup.name
    allocation_method            = "Dynamic"

    tags = {
        environment = "Terraform Demo"
    }
}

# Create Network Security Group and rule
resource "azurerm_network_security_group" "myterraformnsg" {
    name                = "myNetworkSecurityGroup"
    location            = "eastus"
    resource_group_name = azurerm_resource_group.myterraformgroup.name

    security_rule {
        name                       = "HTTP"
        priority                   = 1001
        direction                  = "Inbound"
        access                     = "Allow"
        protocol                   = "Tcp"
        source_port_range          = "*"
        destination_port_range     = "*"
        source_address_prefix      = "*"
        destination_address_prefix = "*"
    }

    tags = {
        environment = "Terraform Demo"
    }
}

# Create network interface
resource "azurerm_network_interface" "myterraformnic" {
    name                      = "myNIC"
    location                  = "eastus"
    resource_group_name       = azurerm_resource_group.myterraformgroup.name

    ip_configuration {
        name                          = "myNicConfiguration"
        subnet_id                     = azurerm_subnet.myterraformsubnet.id
        private_ip_address_allocation = "Dynamic"
        public_ip_address_id          = azurerm_public_ip.myterraformpublicip.id
    }

    tags = {
        environment = "Terraform Demo"
    }
}

# Connect the security group to the network interface
resource "azurerm_network_interface_security_group_association" "example" {
    network_interface_id      = azurerm_network_interface.myterraformnic.id
    network_security_group_id = azurerm_network_security_group.myterraformnsg.id
}

# Generate random text for a unique storage account name
resource "random_id" "randomId" {
    keepers = {
        # Generate a new ID only when a new resource group is defined
        resource_group = azurerm_resource_group.myterraformgroup.name
    }

    byte_length = 8
}

main.tf

provider "azurerm" {
    # The "feature" block is required for AzureRM provider 2.x.
    # If you're using version 1.x, the "features" block is not allowed.
    version = "~>2.0"
    features {}
}
module "modules" {
    source = "../modules/network"
}
module "vm" {
    source = "../modules/vm"
}

Directory Structure:

$ ls
dev/  modules/
$ ls dev/
main.tf
$ ls modules/
network/  vm/

Upvotes: 0

Views: 2703

Answers (1)

Nancy Xiong
Nancy Xiong

Reputation: 28204

Since you have defined the network interface resource in the module Network, you would like to call the network interface in another module VM. You need to declare the output values from the Network Module (the child module) to selectively export certain values to be accessed by the calling module.

In this case,

main.tf

module "network" {
    source = "../modules/network"
   
}
module "vm" {
    source = "../modules/vm"
    vm_nic = module.network.nic
}

vm.tf

...

variable "vm_nic" {}  # this variables.tf should be in the same directory as the vm.tf
...
resource "azurerm_windows_virtual_machine" "myterraformvm" {
    name                  = "myVM"
    location              = "eastus"
    resource_group_name   = azurerm_resource_group.myterraformgroup.name
    network_interface_ids = [var.vm_nic]   # change this

network.tf

output "nic" {
    value = azurerm_network_interface.myterraformnic.id
}

For more information, read https://www.terraform.io/docs/language/modules/syntax.html#calling-a-child-module

Upvotes: 2

Related Questions