每个嵌套解决方案的Terraform(_E)



我需要访问嵌套映射的元素,但我做不到,并且我得到了一个错误。不能访问基元类型值(字符串(上的属性。

# GLUE
locals {
glue_catalog_resources = {
uni = {
name = "mst_business_units",
description = "Unidades de negocios"
columns = [
{
name = "codigouni"
type = "int"
comment = "Code"
},{
name = "descuni"
type = "varchar(256)"
comment = "Description"
},{
name = "estado"
type = "varchar(256)"
comment = "Current status"
}
]
}
}
}
resource "aws_glue_catalog_table" "glue_catalogs_redshift" {
for_each      = local.glue_catalog_resources
name          = each.value.name
database_name = aws_glue_catalog_database.cl_sales.name
description   = each.value.description
retention     = 0
table_type    = "EXTERNAL_TABLE"
parameters = {
EXTERNAL         = "TRUE"
"classification" = "parquet"
}
storage_descriptor {
location = ""
input_format = "org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat"
output_format = "org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat"
number_of_buckets = 0
compressed = "false"
stored_as_sub_directories = "false"
ser_de_info {
serialization_library = "org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe"
parameters = {
"serialization.format" = 1
}
}
parameters = {
"typeOfData": "kinesis"
}
columns {
name = [ for column in each.value.columns: [ for row in column: row.name ] ]
type = [ for column in each.value.columns: [ for row in column: row.type ] ]
comment = [ for column in each.value.columns: [ for row in column: row.comment ] ]
}
}
}

我需要在列中包含标签列名称、类型和注释,从上面的地图中读取它,但我做不到,读取它的正确方法是什么

columns {
name = [ for column in each.column.value: [ for row in column: row.name ] [ for row in column: row.name ] [ for row in column: row.name ] [ for row in column: row.name
type = [ for column in each.value.columns: [ for row in column: row.type ]
comment = [ for column in each.value.columns: [ for row in column: row.comment ] ] ]
}

在这种情况下,columns是键值对的列表,因此您需要稍微调整第二个for

name    = [for column in local.columns : [for k, v in column : v if k == "name"]]
type    = [for column in local.columns : [for k, v in column : v if k == "type"]]
comment = [for column in local.columns : [for k, v in column : v if k == "comment"]]

编辑:答案的第一部分解决了访问列表元素的问题。然而,为了让这项工作如您所愿,我建议您进行一些更改。在局部变量中,可以将columns更改为对象的映射:

locals {
glue_catalog_resources = {
uni = {
name        = "mst_business_units",
description = "Unidades de negocios"
columns = {
"codigouni" = {
name    = "codigouni"
type    = "int"
comment = "Code"
},
"descuni" = {
name    = "descuni"
type    = "varchar(256)"
comment = "Description"
},
"estado " = {
name    = "estado"
type    = "varchar(256)"
comment = "Current status"
}
}
}
}
}

然后,在列块中,您将执行以下操作:

resource "aws_glue_catalog_table" "glue_catalogs_redshift" {
for_each      = local.glue_catalog_resources
name          = each.value.name
database_name = aws_glue_catalog_database.cl_sales.name
description   = each.value.description
retention     = 0
table_type    = "EXTERNAL_TABLE"
parameters = {
EXTERNAL         = "TRUE"
"classification" = "parquet"
}
storage_descriptor {
location                  = ""
input_format              = "org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat"
output_format             = "org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat"
number_of_buckets         = 0
compressed                = "false"
stored_as_sub_directories = "false"
ser_de_info {
serialization_library = "org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe"
parameters = {
"serialization.format" = 1
}
}
parameters = {
"typeOfData" : "kinesis"
}
dynamic "columns" {
for_each = each.value.columns
content {
name    = columns.value.name
type    = columns.value.type
comment = columns.value.comment
}
}
}
}

这种方法使用dynamic[1]和for_each[2]对所有列进行迭代,并将所需的值分配给参数。


[1]https://developer.hashicorp.com/terraform/language/expressions/dynamic-blocks

[2]https://developer.hashicorp.com/terraform/language/meta-arguments/for_each

相关内容

  • 没有找到相关文章

最新更新