我在Terraform中将一个模块的输出传递到另一个模块时遇到了麻烦。在我看来。我正在创建一个安全组。我想将这个安全组的id传递给我的EC2实例创建的vpc_security_group_ids。下面是我的代码:
├── main.tf
├── modules
│ ├── security-groups
│ │ ├── main.tf
│ │ ├── outputs.tf
│ │ └── variables.tf
│ └── vm-deploy
│ ├── main.tf
│ ├── output.tf
│ └── variables.tf
└── variables.tf
main.tf
module "security-groups" {
source= "./modules/security-groups"
for_each= var.security-groups
name= each.value.name
description= each.value.description
vpc_id= data.aws_vpc.vpc.id
}
module "vm-deploy" {
source= "./modules/vm-deploy"
for_each= var.instances
ami= each.value.ami
iam_instance_role= each.value.iam_instance_role
instance_type= each.value.instance_type
key_name= each.value.key_name
private_ip= each.value.private_ip
subnet_id= each.value.subnet_id
user_data= each.value.user_data
vpc_security_group_ids= [module.security-groups.id]
kms_key_id= each.value.kms_key_id
root_size= each.value.root_size
}
模块/安全组/main.tf:
resource "aws_security_group" "security_group" {
name= var.name
description = var.description
vpc_id= var.vpc_id
tags= var.tags
模块/安全组/outputs.tf:
output "id" {
value= aws_security_group.security_group.id
}
模块/vm-deploy/main.tf:
resource "aws_instance" "ec2_instance" {
ami= var.ami
iam_instance_profile= var.iam_instance_role
instance_type= var.instance_type
key_name= var.key_name
private_ip= var.private_ip
subnet_id= var.subnet_id
user_data= var.user_data
vpc_security_group_ids= var.security_group_ids
root_block_device {
delete_on_termination = false
encrypted= true
kms_key_id= var.kms_key_id
volume_size= var.root_size
volume_type= "gp2"
}
}
当我执行地形计划时,我得到以下错误:
│ on main.tf line 45, in module "vm-deploy":
│ 45: vpc_security_group_ids= [module.security-groups.id]
│ ├────────────────
│ │ module.security-groups is object with 1 attribute "sg-default"
│
│ This object does not have an attribute named "id".
使用for_each
循环创建两个模块。因此,根模块中的vpc_security_group_ids = [module.security-groups.id]
行是不正确的,因为module.security-groups
不是单个对象,而是一个对象列表。
如果您打算传递由module.security-groups
创建的所有安全组id,您应该使用splat表达式,例如vpc_security_group_ids = module.security-groups[*].id
。或者,如果您想为每个实例选择一个SG模块,那么您应该这样访问它:vpc_security_group_ids = [module.security-groups["sg-default"].id]
,其中"sg-default"
是来自var.security-groups
的键,您在module.security-groups
的for_each
中使用它。如果你不明白最后一个例子,检查Terraform for_each docs。