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
相关产品推荐
相关产品推荐

