Amazon web services 迭代字典列表以创建具有不同值的地形资源
目标 使用terraform创建两个名为aws\u athena\u的查询资源。每个查询的配置在单独的字典中定义。所有查询字典都嵌套在一个列表中(请参见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
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.
。