Ошибка В системе безопасности не объявлен вызов модуля с именем "сеть". - Терраформ
Я получаю сообщение об ошибке: Ошибка: ссылка на необъявленный модуль
в строке 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
// ...
}