如何通过Terraform的for_each创建关联的AWS Glue表、库及S3桶
解决方案
要实现每个Glue数据库对应创建其tablenames列表中的所有表,核心是将原有的var.my_map转换为以每个表为单位的扁平结构,让aws_glue_catalog_table的for_each遍历每个表条目。以下是完善后的完整代码:
variable "my_map" { type = map(object({ name = string tablenames = list(string) })) default = { obj1 = { name = "NameA1" tablenames = ["TableA1", "TableA2", "TableA3"] }, obj2 = { name = "NameB1" tablenames = ["TableB1"] }, } } resource "aws_s3_bucket" "my_bucket" { for_each = var.my_map bucket = lower(each.value.name) } resource "aws_glue_catalog_database" "my_glue_database" { for_each = var.my_map name = each.value.name } # 构建扁平的表条目映射,用于Glue表的for_each locals { glue_tables = merge([ for db_key, db_data in var.my_map : { for table_name in db_data.tablenames : "${db_key}-${table_name}" => { db_key = db_key db_name = db_data.name table_name = table_name bucket_name = lower(db_data.name) } } ]...) } resource "aws_glue_catalog_table" "my_glue_table" { # 遍历每个表条目 for_each = local.glue_tables name = each.value.table_name database_name = aws_glue_catalog_database.my_glue_database[each.value.db_key].name table_type = "EXTERNAL_TABLE" partition_keys { name = "date" type = "date" } storage_descriptor { columns { name = "file_name" type = "string" } # 这里可以继续添加其他列定义 compressed = false # 拼接S3路径:桶名/表名/ location = "s3://${aws_s3_bucket.my_bucket[each.value.db_key].id}/${each.value.table_name}/" input_format = "org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat" output_format = "org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat" ser_de_info { name = "ParquetHiveSerDe" serialization_library = "org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe" } } }
关键说明:
扁平映射构建:
通过locals.glue_tables将原有的嵌套结构展开,每个表对应一个唯一键(格式为数据库键-表名),同时存储该表关联的数据库信息、桶信息,确保后续资源引用的正确性。Glue表资源配置:
for_each:使用展开后的local.glue_tables,确保每个表都被单独创建。name:直接引用each.value.table_name,取自原tablenames列表。database_name:通过each.value.db_key关联到对应的Glue数据库资源。location:拼接S3桶ID和当前表名,形成每个表独立的存储路径。
资源关联验证:
最终会创建:- 2个S3桶:
namea1、nameb1 - 2个Glue数据库:
NameA1、NameB1 - 4个Glue表:
TableA1(属于NameA1)、TableA2(属于NameA1)、TableA3(属于NameA1)、TableB1(属于NameB1)
- 2个S3桶:
内容的提问来源于stack exchange,提问作者krishna hegde
相关产品推荐
相关产品推荐

