0
├── 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 ,另一个用于 security group 。这是我对 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 而不是一个,两个公共子网而不是一个等)..我是否以正确的方式使用这些模块?..

如何在不创建资源两次的情况下使用安全组模块中网络模块的输出?

4

1 回答 1

4

在 instance.tf 中,您有:

module "NetworkModule" {
    source = "./module/Network"
}
module "sgmodule"{
    source = "./module/sg"
}

在 module/sg/resource.tf 你有:

module "NetworkModule" {
    source ="../Network"
}

结果,您获得了 Network 模块的两个实例,并使资源加倍。

在 Terraform 中使用模块有点像在其他语言中使用new 。它再次实例化模块,创建其所需资源的另一个副本。这通常很有用,但在您的情况下令人惊讶。

您应该做的是从 module/sg/resource.tf 中删除NetworkModule模块并将其替换为变量:

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
}

现在,您将拥有所需的依赖项,而无需重复网络基础架构资源。

于 2020-05-31T12:02:53.783 回答