将地形输出从一个模块传递到另一个模块



我在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-groupsfor_each中使用它。如果你不明白最后一个例子,检查Terraform for_each docs。

相关内容

最新更新