Ошибка В системе безопасности не объявлен вызов модуля с именем "сеть". - Терраформ

Я получаю сообщение об ошибке: Ошибка: ссылка на необъявленный модуль

в строке 6 modules \ security \ security.tf, в ресурсе "aws_security_group" "Web-sg": 6: vpc_id = module.networking.vpcid

Вызов модуля с именем "сеть" не объявлен в системе безопасности.

This is directory structure that I am following currently,
│ main.tf
│ provider.tf
│ terraform.tfstate
│ terraform.tfstate.backup
│ variables.tf
│
└───modules
├───networking
│ networking.tf
│ outputs.tf
│ variables.tf
│
└───security
security.tf
variables.tf

Мой main.tf

    module "networking" {
    source = "./modules/networking"
   }
    module "security" {
    source = "./modules/security"

}

Я создал модуль с именем network, в котором создал все сетевые ресурсы:

    resource "aws_vpc" "vpc" {
    cidr_block = var.cidr_block
    
    tags = {
        Name = var.vpc_name
    }
    }
#Creating Public Subnets
  resource "aws_subnet" "public" {
  count = var.subnet_count
  cidr_block = element(var.subnet_cidr_public,count.index)
  availability_zone = element(var.azs,count.index)
  vpc_id = aws_vpc.vpc.id
  map_public_ip_on_launch = var.map_public_ip_on_launch

  tags =  {
      Name = "Subnet-Public-${element(var.subnet_cidr_public,count.index)}"
  }    
  }


# Creating and Associating to the VPC the Internet Gateway

resource "aws_internet_gateway" "IGW-VPC" {
   vpc_id = aws_vpc.vpc.id 

   tags = {
     Name = var.igw-name
   }

}

# Creating Route Table - Public
# Creating Public Route Table 

resource "aws_route_table" "public-route" { 
  vpc_id = aws_vpc.vpc.id
  
  route { 
    cidr_block = var.cidr_block_route 
    gateway_id = aws_internet_gateway.IGW-VPC.id 
  }

    tags = {
      Name = var.public_route_name
    }
    
}

# Associating Subnet Public-1a to the Public Route Table
resource "aws_route_table_association" "association-public1a" {
  subnet_id = var.subnet_public_1a
  route_table_id = aws_route_table.public-route.id
}

resource "aws_route_table_association" "association-public1b" {
  subnet_id = var.subnet_public_1b
  route_table_id = aws_route_table.public-route.id
}

Я создал модуль с именем security, в котором создал все группы безопасности:

Что я делаю не так? Как я могу это исправить?

resource "aws_security_group" "Web-sg" {
  name = var.web-sg_name
  description = var.web-sg_description
  vpc_id = module.networking.vpcid
  ingress { 
    description = var.description22
    from_port = var.port22
    to_port  = var.port22
    protocol = var.protocol 
    cidr_blocks = var.cidr000
  }
  ingress { 
    description =  var.description80 
    from_port = var.port80
    to_port  = var.port80
    protocol = var.protocol 
    cidr_blocks = var.cidr000 
  }
  ingress { 
    description = var.description443
    from_port = var.port443
    to_port  = var.port443
    protocol = var.protocol 
    cidr_blocks = var.cidr000 
  }
  egress {
    from_port   = var.port0 
    to_port     = var.port0 
    protocol    = var.protocol0
    cidr_blocks = var.cidr000 
  }
  tags = {
    "Name" = var.web-sg_name
  }
}

Как видите, я создал в ресурсе "aws_security_group" "Web-sg" { vpc_id = module.networking.vpcid

и файл outputs.tf

output "vpcid" {
    value = aws_vpc.vpc.id
}

Но я получаю эту ошибку

Что я делаю не так? Как я могу это исправить? Спасибо Маркус

1 ответ

Когда вы объявляете модули в./main.tf следующим образом:

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

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

Ссылки на module.networking и module.security относятся только к локальным переменным, ресурсам, источникам данных, выходным данным и выражениям в файлах TF в том же каталоге (в данном случае./*.tf).

Поскольку./modules/security/security.tf не находится в том же каталоге, что и./main.tf, он не может ссылаться на module.networking, как вы пытаетесь здесь.

Простое исправление - предоставить vpcid в качестве входной переменной для модуля безопасности и получить его значение из module.networking.vpcid:

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

module "security" {
  source = "./modules/security"
  vpcid = module.networking.vpcid
}

Чтобы это работало, вам нужно изменить./modules/security/variables.tf, чтобы объявить vpcid в качестве входной переменной:

variable "vpcid" {
  description = "ID of the VPC in which security resources are deployed"
  type = string
}

И измените ссылку в./modules/security/security.tf:

resource "aws_security_group" "Web-sg" {
  // ...
  vpc_id = var.vpcid
  // ...
}
Другие вопросы по тегам