Terraform遍历列表值Map:为每个应用创建关联团队的AWS IAM角色
解决方案
要实现每个应用单独创建IAM角色,同时能引用所属团队信息,核心是调整数据结构和遍历逻辑,确保每个应用对应独立的角色与信任策略。具体配置如下:
1. 扁平化应用-团队映射
先把嵌套的apps Map转换成每个应用对应所属团队的扁平结构,方便后续逐个遍历应用:
locals { # 生成结构示例:"team_1-app_1" = { team = "team_1", app = "app_1" } flat_apps = merge([ for team, apps in var.managed_apps : { for app in apps : "${team}-${app}" => { team = team app = app } } ]...) }
2. 为每个应用生成专属信任策略
用for_each遍历扁平化后的应用列表,为每个应用单独生成仅允许自身服务账号AssumeRole的信任策略:
data "aws_iam_policy_document" "app_trust_policy" { for_each = local.flat_apps statement { actions = ["sts:AssumeRoleWithWebIdentity"] condition { test = "StringEquals" variable = "${local.op_url}:sub" values = ["system:serviceaccount:${each.value.team}:${each.value.app}-sa"] } } }
3. 为每个应用创建独立IAM角色
基于扁平化的应用列表遍历,每个角色对应一个应用,同时可直接通过each.value.team获取所属团队信息:
resource "aws_iam_role" "application_role" { for_each = local.flat_apps name = "${each.value.team}-${each.value.app}-role" assume_role_policy = data.aws_iam_policy_document.app_trust_policy[each.key].json tags = merge(var.tags, { Team = each.value.team App = each.value.app }) }
关键调整说明
- 原配置按团队分组创建角色,现在改为按单个应用遍历,确保每个应用对应独立IAM角色
- 信任策略从全局统一改为应用专属,避免权限范围过大
- 通过扁平化后的
local.flat_apps,可在遍历过程中随时获取当前应用的所属团队信息
内容的提问来源于stack exchange,提问作者shxpark
相关产品推荐
相关产品推荐

