Как использовать выходы сетевого модуля в модуле группы безопасности без двойного создания ресурсов?
├── instance.tf
├── module
│ ├── Network
│ │ ├── output.tf
│ │ ├── resource.tf
│ │ └── vars.tf
│ └── sg
│ ├── output.tf
│ └── resource.tf
├── provider.tf
├── terraform.tfstate
├── terraform.tfstate.backup
└── vars.tf
Это структура папок моего проекта
Я пытаюсь создать два модуля, один для vpc, а другой для группы безопасности. Вот мои выводы для модуля vpc
output "vpc_id" {
value = aws_vpc.vpc_dev.id
}
output "public_subnet_id" {
value = aws_subnet.public_subnet.id
}
output "private_subnet_id" {
value = aws_subnet.private_subnet.id
}
модуль групп безопасности выглядит как
module "NetworkModule" {
source ="../Network"
}
resource "aws_security_group" "sg_dev" {
name = "web_sg"
vpc_id = module.NetworkModule.vpc_id
....
...}
вот выходы для модуля SG
output "sg_id" {
value = aws_security_group.sg_dev.id
}
я использую эти модули для создания своего экземпляра в aws
module "NetworkModule" {
source = "./module/Network"
}
module "sgmodule"{
source = "./module/sg"
}
resource "aws_instance" "web_dev" {
ami = var.AMIS[var.REGION]
instance_type = "t2.micro"
subnet_id = module.NetworkModule.public_subnet_id
vpc_security_group_ids = ["${module.sgmodule.sg_id}"]
tags = {
Name = "web_dev"
}
}
Но я вижу, что все, что связано с модулем vpc, создается два раза (например, я вижу два vpc вместо одной, 2 общедоступные подсети вместо одной и т. Д.) . Я правильно использую модули? ..
Как использовать выходы сетевого модуля в модуле группы безопасности без двойного создания ресурсов?
1 ответ
В instance.tf у вас есть:
module "NetworkModule" {
source = "./module/Network"
}
module "sgmodule"{
source = "./module/sg"
}
В модуле /sg/resource.tf у вас есть:
module "NetworkModule" {
source ="../Network"
}
В результате вы получите два экземпляра сетевого модуля и удвоите ресурсы.
Использование модуля в Terraform чем-то похоже на использование new в других языках. Он снова создает экземпляр модуля, создавая еще одну копию его необходимых ресурсов. Обычно это полезно, но в вашем случае это неожиданно.
Скорее всего, вам следует удалить модуль NetworkModule из module/sg/resource.tf и заменить его переменной:
variable "vpc_id" {
type = string
}
resource "aws_security_group" "sg_dev" {
name = "web_sg"
vpc_id = var.vpc_id
....
...}
Затем в instance.tf укажите эту переменную в блоке модуля sgmodule:
module "sgmodule"{
source = "./module/sg"
vpc_id = module.NetworkModule.vpc_id
}
Теперь у вас будут необходимые зависимости без дублирования ресурсов сетевой инфраструктуры.