如何在不创建资源两次的情况下使用安全组模块中网络模块的输出?
How do I use the outputs from the network module in the security group module without creating resources twice?
├── 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 public 子网而不是一个等等)..我是吗以正确的方式使用模块? ..
如何在不创建资源两次的情况下使用安全组模块中网络模块的输出?
在 instance.tf 你有:
module "NetworkModule" {
source = "./module/Network"
}
module "sgmodule"{
source = "./module/sg"
}
在 module/sg/resource.tf 中你有:
module "NetworkModule" {
source ="../Network"
}
因此,您获得了网络模块的两个实例,资源加倍。
在 Terraform 中使用 module 有点像在其他语言中使用 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
}
现在您将拥有所需的依赖项,而无需重复网络基础设施资源。
├── 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 public 子网而不是一个等等)..我是吗以正确的方式使用模块? ..
如何在不创建资源两次的情况下使用安全组模块中网络模块的输出?
在 instance.tf 你有:
module "NetworkModule" {
source = "./module/Network"
}
module "sgmodule"{
source = "./module/sg"
}
在 module/sg/resource.tf 中你有:
module "NetworkModule" {
source ="../Network"
}
因此,您获得了网络模块的两个实例,资源加倍。
在 Terraform 中使用 module 有点像在其他语言中使用 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
}
现在您将拥有所需的依赖项,而无需重复网络基础设施资源。