Terraform中移除映射项及yamldecode输出列表指定元素的实现方案
解决Terraform列表元素移除与映射项删除问题
一、移除列表中的特定元素(比如"fargate")
你当前的代码已经通过yamldecode和distinct完成了标签值的提取与去重,要移除"fargate",只需要在提取过程中加入条件过滤即可,用Terraform的for表达式就能实现:
output "product" { value = distinct([ for tag in yamldecode(file("resource/lab/abc.yaml"))["account_list"]["resource_tags"] : tag["TAG:product"] if tag["TAG:product"] != "fargate" ]) }
这里的逻辑很直观:
- 遍历
resource_tags中的每一个标签对象 - 提取
TAG:product的值,但只保留不等于"fargate"的项 - 最后用
distinct去重,就能得到仅包含"CRM"的目标列表
二、移除映射(Map)中的项
在Terraform中删除映射里的特定键值对,最常用且可靠的方式是**for表达式过滤**,以下是具体实现方法:
假设你有一个示例映射:
variable "my_map" { type = map(string) default = { app = "crm" runtime = "fargate" region = "us-east-1" } }
1. 移除单个键
如果要移除键为runtime的项,代码如下:
output "filtered_map" { value = { for k, v in var.my_map : k => v if k != "runtime" } }
这个表达式会遍历映射的所有键值对,只保留键不等于runtime的条目,最终输出就会彻底去掉runtime这个键值对。
2. 移除多个键
如果需要同时移除多个键,扩展条件判断即可:
output "filtered_map_multiple" { value = { for k, v in var.my_map : k => v if k != "runtime" && k != "region" } }
这样就会同时删除runtime和region两个键值对。
注意:别用
merge(var.my_map, {runtime = null})的方式,这种方法只会把runtime的值设为null,并不会真正移除这个键,所以优先推荐for表达式过滤的方案。
内容的提问来源于stack exchange,提问作者Felixrobin antony
相关产品推荐
相关产品推荐

