如何在Terraform/Terragrunt中优雅遍历字符串列表?
问题
现有Terraform变量结构如下:
iam_access = { external_iam_users = { "environment1" = { iam_users = ["user1", "user2", "user3"] }, "environment2" = { iam_users = ["user4", "user5"] }, } }
已定义本地值:
locals { user_access = merge([ for external_iam_users in var.iam_access: { for key,iam_users in external_iam_users : "${key}" => { for key1,users in iam_users : "${key1}" => { users = users } } } ]...) }
在编写aws_iam_user_policy_attachment资源时,目前只能通过user = each.value.iam_users.users[0]获取用户列表的第一个用户,如何修改代码实现遍历所有用户?
解决方案
1. 重构本地值,扁平化用户列表
原有的user_access把用户列表嵌套在多层结构中,不利于遍历。我们可以直接生成一个扁平化的用户集合,把所有环境下的用户提取到一维结构里:
locals { # 生成包含环境名和用户名的扁平化列表,方便后续唯一标识用户 flattened_users = flatten([ for env_name, env_data in var.iam_access.external_iam_users : [ for username in env_data.iam_users : { environment = env_name username = username } ] ]) }
2. 遍历扁平化列表创建策略附件
利用for_each遍历扁平化后的用户列表,为每个用户单独创建IAM策略附件:
resource "aws_iam_user_policy_attachment" "user_policy" { # 用「环境名-用户名」作为唯一键,避免资源重复 for_each = { for user_item in local.flattened_users : "${user_item.environment}-${user_item.username}" => user_item } user = each.value.username policy_arn = "arn:aws:iam::123456789012:policy/Your-Target-Policy" # 替换为你的目标策略ARN }
简化版(无需环境信息)
如果不需要关联环境信息,也可以直接生成纯用户列表:
locals { all_users = flatten([ for env_data in var.iam_access.external_iam_users : env_data.iam_users ]) } resource "aws_iam_user_policy_attachment" "user_policy" { # 用「索引-用户名」作为唯一键,确保每个用户对应唯一资源 for_each = { for idx, username in local.all_users : "${idx}-${username}" => username } user = each.value policy_arn = "arn:aws:iam::123456789012:policy/Your-Target-Policy" }
内容的提问来源于stack exchange,提问作者retne
相关产品推荐
相关产品推荐

