amazon-web-servicesterraformterraform-provider-awsterraform0.12+

Do i need a vpc created before i pass on the value to the internet gateway in Terraform


I am learning Terraform using modules. I have created two modules for vpc and internet gateway. Please find the code below

provider "aws" {
  profile = "default"
  region  = "us-east-1"
}

module "vpc" {
  source = "./modules/vpc"
}

module "internet_gateway" {
  source = "./modules/internet_gateway"
}
resource "aws_vpc" "some_custom_vpc" {
  cidr_block = "10.0.0.0/16"

  tags = {
    Name = "Some Custom VPC"
  }
}

output "vpc_id" {
  value = aws_vpc.some_custom_vpc.id
}

resource "aws_internet_gateway" "some_ig" {
  vpc_id = module.vpc.vpc_id

  tags = {
    Name = "Some Internet Gateway"
  }
}

However, when I am running terraform init and terraform plan, I am getting below error

│ Error: Reference to undeclared module
│ 
│   on .terraform/modules/internet_gateway/main.tf line 2, in resource "aws_internet_gateway" "some_ig":
│    2:   vpc_id = module.vpc.vpc_id
│ 
│ No module call named "vpc" is declared in module.internet_gateway.

Can anyone please help me with what can be the reason for this error? Do I need to create VPC alone first and then reference it to the internet gateway or is there any other solution?

Please consider that I am beginner so I might have missed techinacl details, if required please let me know I'll add it up.

Thanks in advance.

I have tried looking online for help but couldn't avail.


Solution

  • You have to pass vpc_id as an argument to your module "internet_gateway". For example:

    provider "aws" {
      profile = "default"
      region  = "us-east-1"
    }
    
    module "vpc" {
      source = "./modules/vpc"
    }
    
    module "internet_gateway" {
      source = "./modules/internet_gateway"
      vpc_id = module.vpc.vpc_id
    }
    

    This requires declaration of vpc_id variable in "./modules/internet_gateway", and subsequent use of the variable in the module:

    variable "vpc_id" {}
    
    resource "aws_internet_gateway" "some_ig" {
      vpc_id = var.vpc_id
    
      tags = {
        Name = "Some Internet Gateway"
      }
    }