如何在Terraform中为整数类型变量使用for_each?
Terraform 用数字变量创建指定数量RDS副本的问题
我在Terraform中写了这段代码,想通过整数变量创建对应数量的RDS只读副本:
resource "aws_db_instance" "replica_rds_instance" { for_each = var.rds_number_of_replicas // 该变量必须保持整数类型 // 其他配置项 }
运行时直接报错:
给定的"for_each"参数值不适用:"for_each"参数必须是映射或字符串集合,而你提供的是数字类型的值。
我尝试用toset(range(var.rds_number_of_replicas))转换,结果又触发新错误:
给定的"for_each"参数值不适用:"for_each"支持映射和字符串集合,但你提供的集合包含数字类型元素。
解决办法
Terraform的for_each仅支持字符串集合或映射类型,所以需要把range生成的数字序列转成字符串集合。可以通过列表推导式将每个数字转为字符串,再转成集合:
修改后的代码示例:
resource "aws_db_instance" "replica_rds_instance" { for_each = toset([for n in range(var.rds_number_of_replicas) : tostring(n)]) // 示例:用each.key给每个副本添加唯一标识后缀 identifier = "my-db-replica-${each.key}" // 其他必要配置示例 source_db_instance_identifier = aws_db_instance.primary.id engine = "mysql" // ... 其他必填参数 }
如果想要更具可读性的键名,也可以构造映射,直接用副本名称作为键:
resource "aws_db_instance" "replica_rds_instance" { for_each = { for idx in range(var.rds_number_of_replicas) : "replica-${tostring(idx+1)}" => idx } identifier = each.key // 其他配置项... }
这样既保留了变量的整数类型,又完全符合for_each的参数要求,能正常创建指定数量的RDS副本。
内容的提问来源于stack exchange,提问作者Edgar Peixoto
相关产品推荐
相关产品推荐

