0
votes

I am new to terraform and trying to build an infrastructure with two subnets and VPC. I have created two modules

  • VPC
  • subnet

The VPC module will create a VPC and will return vpc_id as output, the same return vpc_id I am trying to use in the subnet module, but when I run the terraform plan, it asks me for the enter vpc_id input.

I want the vpc_id from the output value of the VPC module, can anyone please help me on the same.

Below is the code,

root tf file,

 provider "aws" {
  shared_credentials_file = var.shared_cred
  profile                 = "default" 
  region                  = var.aws_region
}

module "vpc" {
  source = "./vpc"
  name   = "terraformVPC"
  cidr   = "10.50.40.0/27"
}

module "private_subnet" {
  source      = "./subnet"
  subnet_name = "private_subnet"
  subnet_cidr = "10.50.40.16/28"
  #VPC_id = aws_vpc.moduleVPC.id
  VPCid = module.vpc.outvpc_id # this is the issue
}

module "public_subnet" {
  source      = "./subnet"
  subnet_name = "public_subnet"
  subnet_cidr = "10.50.40.0/28"
  VPCid      = module.vpc.outvpc_id
}

Subnet resource

resource "aws_subnet" "module_subnet" {
  cidr_block = var.subnet_cidr
  vpc_id     = var.VPCid

  tags = {
    Name = var.subnet_name
  }
}

Subnet module variable declaration

variable "subnet_name" {
  description = " define th subnet name"
}

variable "subnet_cidr" {
  description = "define th subnet cidr block"
}

variable "VPCid" {
  description = "Assign VPC id to subnet"
}

VPC output

output "outvpc_id" {
  value = "${aws_vpc.moduleVPC.id}"
}
3
should be value = aws_vpc.moduleVPC.id not value = "${aws_vpc.moduleVPC.id}". You should have an error message I think that tells you this?Liam
Hi Liam, I don't get an error, but asks for the input variable for vpc_id and I thnk both perform the same action value = aws_vpc.moduleVPC.id and value = "${aws_vpc.moduleVPC.id}"Mahesh

3 Answers

2
votes

This is called "Module Composition". The important thing to remember is that you reference outputs of another module.

The format is: module.<object-name>.<output-name>

module "network" {
  source = "./modules/aws-network"

  base_cidr_block = "10.0.0.0/8"
}

module "consul_cluster" {
  source = "./modules/aws-consul-cluster"

  vpc_id     = module.network.vpc_id       # < output of module.network
  subnet_ids = module.network.subnet_ids   # < output of module.network
}
0
votes

When I use terraform for aws... My module name it's "network.ts" I don't think you need two tf files to manage your vpc and the subnets of that VPC.

network.tf

resource "aws_vpc" "vpc" {
  cidr_block           = "10.50.40.0/27"
  enable_dns_hostnames = true // only if you need
  tags                 = {
    Name = "desa-vpc-spotify" //Use your own name
  }
}

resource "aws_subnet" "private_subnet" {
  vpc_id            = aws_vpc.vpc.id
  availability_zone = "us-east-1a" //your own region
  cidr_block        = "10.50.40.16/28"
  tags = {
    Name = "desa-subnet-private-spotify"
  }
}

resource "aws_subnet" "public_subnet" {
  vpc_id            = aws_vpc.vpc.id
  availability_zone = "us-east-1a"//your own region
  cidr_block        = "10.50.40.0/28"
  tags = {
    Name = "desa-subnet-public-spotify"
  }
}

if you want vpc on another tf

(and if you want to have two files... only call the vpc like this)

another.tf

data "aws_vpc" "vpcs" {
  tags = {
    Name = "desa-vpc-spotify" //only put the name of the vpc of the network tf
  }
}


0
votes

I notice that you have listed "VPCid =". When you run terraform validate does it throw an error? I would trying changing it to "vpc_id" instead and see if that works.