Amazon web services 迭代字典列表以创建具有不同值的地形资源

Amazon web services 迭代字典列表以创建具有不同值的地形资源,amazon-web-services,terraform,terraform0.12+,Amazon Web Services,Terraform,Terraform0.12+,目标 使用terraform创建两个名为aws\u athena\u的查询资源。每个查询的配置在单独的字典中定义。所有查询字典都嵌套在一个列表中(请参见query\u dictvariable) 这会导致错误: The given "for_each" argument value is unsuitable: "for_each" supports maps and sets of strings, but you have provided a set

目标 使用terraform创建两个名为aws\u athena\u的查询资源。每个查询的配置在单独的字典中定义。所有查询字典都嵌套在一个列表中(请参见
query\u dict
variable)

这会导致错误:

The given "for_each" argument value is unsuitable: "for_each" supports maps
and sets of strings, but you have provided a set containing type object.

  on main.tf line 57, in resource "aws_athena_named_query" "olap":
  57:   workgroup = query_dict[count.index]["workgroup"]

A reference to a resource type must be followed by at least one attribute
access, specifying the resource name.

尝试2:

resource "aws_athena_named_query" "olap" {
  for_each = [for query in tomap(var.query_dict): {
            name   = query.name
            workgroup = query.workgroup
            query = query.query}]
  name = each.value.name
  query = each.value.query
  database = "test"
  workgroup = each.value.workgroup
} 
resource "aws_athena_named_query" "olap" {
  count = length(var.query_dict)
  name = query_dict[count.index]["name"]
  query = query_dict[count.index]["query"]
  database = "test"
  workgroup = query_dict[count.index]["workgroup"]
}
# aws_athena_named_query.olap["query1"] will be created
  + resource "aws_athena_named_query" "olap" {
      + database  = "db"
      + id        = (known after apply)
      + name      = "query1"
      + query     = "SELECT * FROM foo"
      + workgroup = "bar"
    }

# aws_athena_named_query.olap["query2"] will be created
  + resource "aws_athena_named_query" "olap" {
      + database  = "db"
      + id        = (known after apply)
      + name      = "query2"
      + query     = "SELECT * FROM baz"
      + workgroup = "bar"
    }
其结果是:

Invalid value for "v" parameter: cannot convert tuple to map of any single
type.
尝试3:

resource "aws_athena_named_query" "olap" {
  for_each = [for query in tomap(var.query_dict): {
            name   = query.name
            workgroup = query.workgroup
            query = query.query}]
  name = each.value.name
  query = each.value.query
  database = "test"
  workgroup = each.value.workgroup
} 
resource "aws_athena_named_query" "olap" {
  count = length(var.query_dict)
  name = query_dict[count.index]["name"]
  query = query_dict[count.index]["query"]
  database = "test"
  workgroup = query_dict[count.index]["workgroup"]
}
# aws_athena_named_query.olap["query1"] will be created
  + resource "aws_athena_named_query" "olap" {
      + database  = "db"
      + id        = (known after apply)
      + name      = "query1"
      + query     = "SELECT * FROM foo"
      + workgroup = "bar"
    }

# aws_athena_named_query.olap["query2"] will be created
  + resource "aws_athena_named_query" "olap" {
      + database  = "db"
      + id        = (known after apply)
      + name      = "query2"
      + query     = "SELECT * FROM baz"
      + workgroup = "bar"
    }
哪个输出错误:

The given "for_each" argument value is unsuitable: "for_each" supports maps
and sets of strings, but you have provided a set containing type object.

  on main.tf line 57, in resource "aws_athena_named_query" "olap":
  57:   workgroup = query_dict[count.index]["workgroup"]

A reference to a resource type must be followed by at least one attribute
access, specifying the resource name.

预期输出:

resource "aws_athena_named_query" "olap" {
  for_each = [for query in tomap(var.query_dict): {
            name   = query.name
            workgroup = query.workgroup
            query = query.query}]
  name = each.value.name
  query = each.value.query
  database = "test"
  workgroup = each.value.workgroup
} 
resource "aws_athena_named_query" "olap" {
  count = length(var.query_dict)
  name = query_dict[count.index]["name"]
  query = query_dict[count.index]["query"]
  database = "test"
  workgroup = query_dict[count.index]["workgroup"]
}
# aws_athena_named_query.olap["query1"] will be created
  + resource "aws_athena_named_query" "olap" {
      + database  = "db"
      + id        = (known after apply)
      + name      = "query1"
      + query     = "SELECT * FROM foo"
      + workgroup = "bar"
    }

# aws_athena_named_query.olap["query2"] will be created
  + resource "aws_athena_named_query" "olap" {
      + database  = "db"
      + id        = (known after apply)
      + name      = "query2"
      + query     = "SELECT * FROM baz"
      + workgroup = "bar"
    }

我认为以下措施应该有效:

resource "aws_athena_named_query" "olap" {

  for_each = {for idx, query in var.query_dict: idx => query}
  
  name = each.value.name
  query = each.value.query
  database = "test"
  workgroup = each.value.workgroup
} 
在上面的示例中,您使用
idx
键创建地图:

{
  "0" = {
    "name" = "query1"
    "query" = "SELECT * FROM foo"
    "workgroup" = "bar"
  }
  "1" = {
    "name" = "query2"
    "query" = "SELECT * FROM baz"
    "workgroup" = "bar"
  }
}

在本例中,不需要对每个_使用
,因为您实际上是在迭代列表。您可以使用
count

resource "aws_athena_named_query" "olap" {
  count = length(var.query_dict)
  name = var.query_dict[count.index]['name']
  query = var.query_dict[count.index]['query']
  database = "test"
  workgroup = var.query_dict[count.index]['workgroup']
}

此代码块输出错误:``在main.tf行57上,在资源“aws_athena_named_query”“olap”中:57:workgroup=query_dict[count.index][“workgroup”]对资源类型的引用必须后跟至少一个属性访问,指定资源名称。``@Marshallm-Yes,因为
query_dict
是一个变量,当我复制和编辑您的代码时,我没有在前面加上
var.