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

Terraform从用户列表生成密码:按组创建动态密钥对,同用户跨组密码不同

解决方案

1. 修正输入文件格式

首先修正users.yml中grp2的用户数组格式错误(原格式会被识别为单个用户字符串):

groups:
  - name: "grp1"
    path: "/grp1"
    description: "grp1 group"
    users: ["user1", "user2", "user3"]
  - name: "grp2"
    path: "/grp2"
    description: "grp2 group"
    users: ["user1", "user4"]

2. 动态生成用户-密码映射

通过random_password资源为每个组的每个用户生成独立密码(同一用户不同组密码不同),再通过本地值整理成目标格式:

修改locals.tf:

locals {
  # 解析YAML文件中的组信息
  group_details = yamldecode(file(var.secrets_file)).groups

  # 整理基础组元数据
  groups = {
    for group in local.group_details : group.name => {
      name        = group.name
      path        = group.path
      description = group.description
      users       = group.users
    }
  }

  # 生成组-用户-密码的映射结构
  grp_user_passwords = {
    for group_name, group in local.groups : group_name => {
      users = group.users
      psw   = [for user in group.users : random_password.user_password["${group_name}_${user}"].result]
    }
  }
}

# 为每个组的每个用户生成独立随机密码
resource "random_password" "user_password" {
  for_each = {
    for group in local.group_details :
    "${group.name}_${user}" => user
    for user in group.users
  }

  length           = 16
  special          = true
  override_special = "!@#$%^&*()"
}

3. 更新Secrets Manager资源配置

修改secrets.tf,使用动态生成的密码数据构建Secret内容:

resource "aws_secretsmanager_secret" "sm" {
  for_each                = local.groups
  name                    = each.value.path
  description             = each.value.description
  tags                    = var.tags
  recovery_window_in_days = var.recovery_window_in_days
}

resource "aws_secretsmanager_secret_version" "sm-sv" {
  for_each      = local.groups
  secret_id     = aws_secretsmanager_secret.sm[each.key].id
  secret_string = jsonencode(zipmap(local.grp_user_passwords[each.key].users, local.grp_user_passwords[each.key].psw))
  
  depends_on = [aws_secretsmanager_secret.sm]

  lifecycle {
    ignore_changes = [secret_string]
  }
}

核心说明

  • random_password资源通过组名_用户名作为唯一标识,确保同一用户在不同组生成不同密码,且密码会被Terraform状态持久化,不会每次执行apply都变更。
  • grp_user_passwords本地值自动生成了你需要的{组名: {users: [...], psw: [...]}}格式映射,无需硬编码。
  • 用zipmap将用户数组和密码数组转为键值对,再JSON编码后存入Secrets Manager。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:05:38