问题描述:
我正在开发 Terraform 设置,其中使用自定义模块 (splunk_instances) 管理多个 EC2 实例(用于 Splunk 服务),并且我尝试将这些实例附加到 AWS Application Load Balancer (ALB) 中的特定目标组).
在我的根 main.tf 中,我使用一个模块来创建多个 Splunk 实例,例如搜索头 (splunk_sh)、索引器等。这些实例是使用自定义 EC2 模块创建的。我想从此模块收集实例 ID 并将它们传递给 ALB 模块,以将每个实例附加到其相应的目标组。
我当前的设置:
根 main.tf(使用 splunk_instances 模块):
module "splunk_instances" {
source = "./modules/ec2" # Path to the module
for_each = {
"splunk_sh" = "Search Head"
"splunk_idx1" = "Indexer 1"
"splunk_idx2" = "Indexer 2"
"splunk_idx3" = "Indexer 3"
"splunk_cm" = "Cluster Manager"
"splunk_lm_ds_mc" = "License Manager / Deployment Server / Monitoring Console"
}
instance_name = each.value
instance_type = var.instance_types[each.key]
ami_id = var.ami_id
key_name = var.key_name
network_interface_id = aws_network_interface.splunk_eni[each.key].id
# Other variables...
}
# ALB configuration
module "load_balancer" {
source = "./modules/alb"
instance_ids = module.splunk_instances.instance_ids # Reference to instance IDs from splunk_instances module
# Other variables...
}
模块/ec2/outputs.tf:
output "instance_id" {
value = aws_instance.this.id
}
预期输出:
在我的根模块的输出中,我想聚合所有实例 ID:
output "instance_ids" {
value = {
for instance_key, instance_module in module.splunk_instances :
instance_key => instance_module.instance_id
}
}
问题:
Terraform 抛出错误:
Error: Unsupported attribute
│
│ on main.tf line 55, in module "load_balancer":
│ 55: instance_ids = module.splunk_instances.instance_ids
│ ├────────────────
│ │ module.splunk_instances is object with 6 attributes
│
│ This object does not have an attribute named "instance_ids".
instance_id 输出似乎没有从 splunk_instances 模块创建的每个 EC2 实例正确传递。我不确定如何在 ALB 目标组附件中正确聚合和引用这些实例 ID。
我尝试过的:
期望的结果:
我希望能够:
问题:
如何正确聚合 splunk_instances 模块的 instance_id 输出并在 ALB 模块中使用它们将 EC2 实例附加到目标组?
由于 EC2 模块在调用时已根据
for_each
元参数中的值创建实例,这意味着任何输出都应使用键值对:
output "instance_ids" {
value = values(module.splunk_instances)[*].instance_id
}
values
功能与所有按键和 instance_id
输出一起使用。您可以得出结论,您必须根据错误使用按键来引用输出:
module.splunk_instances 是具有 6 个属性的对象
因为当您使用
for_each
调用模块时会创建六个 Splunk 实例。