如何使用 Terraform 从模块聚合 EC2 实例 ID 并附加到 AWS ALB 中的目标组

问题描述 投票:0回答:1

问题描述:

我正在开发 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。

我尝试过的:

  • 确保在 ec2 模块中正确定义了 instance_id 输出。
  • 尝试聚合根outputs.tf中的instance_id输出。
  • 已验证 terraform plan 将实例 ID 显示为输出,但在将它们附加到 ALB 目标组时无法按预期引用它们。

期望的结果:

我希望能够:

  • 从 splunk_instances 模块聚合实例 ID。
  • 将这些 ID 传递到 load_balancer 模块中的 ALB 目标组附件。

问题:

如何正确聚合 splunk_instances 模块的 instance_id 输出并在 ALB 模块中使用它们将 EC2 实例附加到目标组?

amazon-web-services terraform load-balancing aws-application-load-balancer terraform-modules
1个回答
0
投票

由于 EC2 模块在调用时已根据

for_each
元参数中的值创建实例,这意味着任何输出都应使用键值对:

output "instance_ids" {
  value = values(module.splunk_instances)[*].instance_id
}

这里内置的

values
功能与所有按键和
instance_id
输出一起使用。您可以得出结论,您必须根据错误使用按键来引用输出:

module.splunk_instances 是具有 6 个属性的对象

因为当您使用

for_each
调用模块时会创建六个 Splunk 实例。

© www.soinside.com 2019 - 2024. All rights reserved.