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

Terraform单资源中多for_each循环的实现方案咨询

问题

在AWS Lake Formation权限资源中,我通过for_each遍历IAM组内的用户分配权限,现在需要为多个数据库授权,请问能否在database块内使用第二个for_each语句?或是需要采用其他实现方式?

现有代码:

resource "aws_lakeformation_permissions" "admin-lf-permissions" {
  for_each = { for usr in data.aws_iam_group.admin.users: usr.user_name => usr.arn }
  principal   = each.value
  permissions = ["ALL"]

  database {
    name       = data.terraform_remote_state.glue_catalog_database.outputs.map_glue_catalog_db_name
   
  }
}

我的locals.tf配置,希望遍历其中的admin_dbs为管理员用户授权所有指定数据库:

glue_catalog_dbs = {
    admin_dbs= {
     db-1                  =   data.terraform_remote_state.glue_catalog_database.outputs.map_glue_catalog_db_name.prod-database
      db-2            =   data.terraform_remote_state.glue_catalog_database.outputs.map_glue_catalog_db_name.test-database
     db-3           =   data.terraform_remote_state.glue_catalog_database.outputs.map_glue_catalog_db_name.dev-database
    },
    data_engineer_dbs= {
       db-1                  =   data.terraform_remote_state.glue_catalog_database.outputs.map_glue_catalog_db_name.prod-database
      db-2            =   data.terraform_remote_state.glue_catalog_database.outputs.map_glue_catalog_db_name.test-database
     db-3           =   data.terraform_remote_state.glue_catalog_database.outputs.map_glue_catalog_db_name.dev-database
    }
}

解决方案

Terraform的aws_lakeformation_permissions资源不支持在database块内使用for_each。要实现给每个IAM用户批量授权多个数据库,需要生成用户-数据库的组合作为资源级for_each的遍历对象,具体实现如下:

1. 生成用户与数据库的组合映射

在locals.tf中添加组合逻辑,创建每个用户对应所有目标数据库的键值对:

locals {
  # 生成"用户名-数据库标识"为唯一键的组合映射,包含用户ARN和数据库名称
  admin_user_db_pairs = merge([
    for user_name, user_arn in { for usr in data.aws_iam_group.admin.users : usr.user_name => usr.arn } : {
      for db_key, db_name in local.glue_catalog_dbs.admin_dbs : "${user_name}-${db_key}" => {
        user_arn = user_arn
        db_name  = db_name
      }
    }
  ]...)
}

2. 调整权限资源的for_each逻辑

修改aws_lakeformation_permissions资源,使用上述组合映射作为遍历数据源:

resource "aws_lakeformation_permissions" "admin-lf-permissions" {
  for_each = local.admin_user_db_pairs
  
  principal   = each.value.user_arn
  permissions = ["ALL"]

  database {
    name = each.value.db_name
  }
}

实现说明

  • 嵌套的for表达式会遍历所有管理员用户,再为每个用户遍历对应的数据库,生成唯一的用户名-数据库标识键,确保每个权限资源实例的唯一性
  • 每个用户-数据库组合会创建独立的Lake Formation权限资源,既符合Terraform的资源管理逻辑,也方便后续单独调整某个用户对特定数据库的权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 16:32:32