You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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"
    }
  }
}

关键说明:

  1. 扁平映射构建:
    通过locals.glue_tables将原有的嵌套结构展开,每个表对应一个唯一键(格式为数据库键-表名),同时存储该表关联的数据库信息、桶信息,确保后续资源引用的正确性。

  2. Glue表资源配置:

    • for_each:使用展开后的local.glue_tables,确保每个表都被单独创建。
    • name:直接引用each.value.table_name,取自原tablenames列表。
    • database_name:通过each.value.db_key关联到对应的Glue数据库资源。
    • location:拼接S3桶ID和当前表名,形成每个表独立的存储路径。
  3. 资源关联验证:
    最终会创建:

    • 2个S3桶:namea1、nameb1
    • 2个Glue数据库:NameA1、NameB1
    • 4个Glue表:TableA1(属于NameA1)、TableA2(属于NameA1)、TableA3(属于NameA1)、TableB1(属于NameB1)

内容的提问来源于stack exchange,提问作者krishna hegde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 11:05:17