Terraform for_each参数不兼容错误求助:tuple类型不符合要求
Terraform for_each 参数错误解决方法
错误提示明确指出:for_each 仅接受map或字符串集合(set(string))类型,你当前传入的是tuple(列表)类型,所以需要将列表转换为符合要求的类型。
解决方法一:将列表转换为字符串集合(set)
直接使用Terraform内置的 toset() 函数将列表转为set,修改sns.tf中的for_each参数即可:
resource "aws_sns_topic" "jobs-sns" { for_each = toset(local.sns-topic) name = each.key # 必须指定SNS Topic的name属性,这里直接用集合元素作为名称 sqs_success_feedback_sample_rate = "100" }
locals.tf保持不变,toset()会自动将列表转换为无序的字符串集合,each.key对应集合中的每个元素值。
解决方法二:将列表转换为map类型
如果需要更明确的键值对结构,可以将列表转为map。有两种方式:
方式1:直接定义map类型的local变量
修改locals.tf:
locals { sns-topic = { "jobs-sns00" = "jobs-sns00", "jobs-sns01" = "jobs-sns01", "jobs-sns02" = "jobs-sns02", "jobs-sns03" = "jobs-sns03", "jobs-sns04" = "jobs-sns04" } }
此时sns.tf中的for_each可以直接使用local.sns-topic,each.key和each.value分别对应map的键和值。
方式2:用for表达式动态生成map
无需修改locals.tf,直接在for_each中通过for表达式转换:
resource "aws_sns_topic" "jobs-sns" { for_each = { for name in local.sns-topic : name => name } name = each.key sqs_success_feedback_sample_rate = "100" }
这种方式适合需要基于原列表动态生成map的场景。
注意:创建AWS SNS Topic必须指定
name属性,你原来的代码中缺少该字段,即使解决了for_each的问题,也会触发新的错误,所以务必加上name = each.key(或对应的值)。
内容的提问来源于stack exchange,提问作者CPdev
相关产品推荐
相关产品推荐

