【问题标题】:Can I create a map of {instanceid: valueOfNameTag} using terraform data?我可以使用 terraform 数据创建 {instanceid: valueOfNameTag} 的地图吗?
【发布时间】:2021-11-25 19:36:26
【问题描述】:

我想使用具有以下结构的 terraform 数据获取地图:

{
  instance-id(e.g. i-xxxx): ValueOfNameTag(e.g. MongoDB)
}

我可以像下面这样单独获取实例详细信息

data "aws_instance" "test" {
  instance_id = "i-0ecb3c2fb4436b6fe"
}

但不知道如何为所有人做这件事并从中创建一个地图。

【问题讨论】:

  • 如果您正在管理资源,这存在于 Terraform 状态。您不是在管理资源吗?
  • @MattSchuchard 不,我不管理实例。他们已经在那里了。我想使用数据源来获取详细信息,然后创建一个我可以使用的地图。
  • 您如何存储实例的 ID 列表?
  • @MattSchuchard 我正在使用数据“aws_instances”。这将返回实例 ID 列表。

标签: amazon-web-services amazon-ec2 tags terraform


【解决方案1】:

这基本上是一个三步过程。第一步(根据 cmets 已经存在)是检索所需的实例 ID 列表:

data "aws_instances" "this" {
  # arguments to select specific subset of instances
}

实例 ID 的list(string) 将存储在导出的资源属性ids 中。

第二步是检索每个实例的标签:

data "aws_instance" "this" {
  # iterate over subset of desired instances by ID
  for_each = toset(data.aws_instances.this.ids)

  instance_id = each.value
}

每个实例的标签将存储在导出的资源属性tags 中,因此可以按照 Terraform HCL2 DSL 中的正常情况通过命名空间 data.aws_instance.this["<instance id>"].tags 访问。

第三步,进行数据转换,构造一个map,其中key为instance ID,tag为value。问题中给出的示例是针对 Name 标记的值,因此我们将在示例中使用:

locals {
  instance_name = { for id, attributes in data.aws_instance.this : id => attributes.tags["Name"] }
}

以及所需的map 实例ID 到它们各自的Name 标记将按预期存储在local.instance_name 中。您也可以在 for lambda 表达式中迭代 data.aws_instances.this.ids list(string) 并映射到从 data.aws_instance.this[each.value].tags["Name"] 导出的属性,但上述算法更简洁,效率更高。

【讨论】:

猜你喜欢
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2011-05-11
  • 2021-12-24
  • 1970-01-01
  • 2020-10-07
相关资源
最近更新 更多