Как использовать выходы сетевого модуля в модуле группы безопасности без двойного создания ресурсов?

├── 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
}

Теперь у вас будут необходимые зависимости без дублирования ресурсов сетевой инфраструктуры.

Другие вопросы по тегам