我可以使用 terraform 数据创建 instanceid: valueOfNameTag 的地图吗?

Posted

技术标签:

【中文标题】我可以使用 terraform 数据创建 instanceid: valueOfNameTag 的地图吗?【英文标题】: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 列表。 【参考方案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"] 导出的属性,但上述算法更简洁,效率更高。

【讨论】:

谢谢,马特!我还有一个问题,你可能想看看***.com/q/69454592/10065458

以上是关于我可以使用 terraform 数据创建 instanceid: valueOfNameTag 的地图吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Terraform 创建一个 Azure Active Directory 自定义域

我可以使用 Terraform 创建 GCP API 密钥吗?

新AMI发布时,Terraform重新创建EC2实例

如何编写 terraform 代码来为过多的数据库连接创建 aws_cloudwatch_metric_alarm?

Terraform aws - 无法使用 terraform 脚本创建 AWS SFTP 服务器

Terraform:如何从数据类型中获取元素