第16/30天:精通 AWS IAM 用户管理与 Terraform

发布: (2025年12月11日 GMT+8 21:43)
5 min read
原文: Dev.to

Source: Dev.to

Architecture

架构图

IAM 是在大型组织中管理用户和权限的基石。此演示展示了如何使用 Terraform 管理 IAM 用户、组和成员关系——AWS 版的 Azure AD 用户管理——并演示 Terraform 的迭代构造(for_eachfor 表达式、条件过滤)。

本演示的功能

  • 获取 AWS 账户信息 – 获取当前 AWS 账户 ID。
  • 从 CSV 读取用户数据 – 从 CSV 文件加载用户信息。
  • 创建 IAM 用户 – 自动创建符合统一命名规范的用户。
  • 设置登录配置文件 – 配置控制台访问并强制密码重置。
  • 创建 IAM 组 – 设置组织组(Education、Managers、Engineers)。
  • 管理组成员关系 – 根据用户属性将用户分配到相应组。

小项目概览

目标: 批量创建 26 个 IAM 用户(基于 users.csv)。

关键特性

  • 动态组分配(Education、Engineers、Managers)。
  • 使用临时密码的控制台登录。
  • 使用 S3 远程后端管理状态。
  • 用户名格式:名的首字母 + 姓(例如 Michael Scott → mscott)。

创建的资源

  • 26 个拥有控制台访问的 IAM 用户。
  • 3 个 IAM 组(Education、Managers、Engineers)。
  • 根据用户属性生成的组成员关系。
  • 包含元数据的用户标签(DisplayNameDepartmentJobTitle)。

项目结构

day16/
├── backend.tf          # S3 后端配置,用于状态管理
├── provider.tf         # AWS 提供商配置
├── versions.tf         # Terraform 版本及所需提供商
├── main.tf             # 主用户创建逻辑
├── groups.tf           # IAM 组及成员管理
├── users.csv           # 用户数据源

CSV 处理

Terraform 的 csvdecode() 函数会把 CSV 文件转换为映射列表,便于迭代。

CSV 格式

first_name,last_name,department,job_title
Michael,Scott,Education,Regional Manager
Dwight,Schrute,Sales,Assistant to the Regional Manager

本地变量

locals {
  users = csvdecode(file("users.csv"))
}

users.csv 放在与 Terraform 配置相同的目录下。

IAM 用户创建

resource "aws_iam_user" "users" {
  for_each = { for user in local.users : user.first_name => user }

  name = lower("${substr(each.value.first_name, 0, 1)}${each.value.last_name}")
  path = "/users/"

  tags = {
    DisplayName = "${each.value.first_name} ${each.value.last_name}"
    Department  = each.value.department
    JobTitle    = each.value.job_title
  }
}
  • 用户名{first_initial}{last_name}(小写)。
  • 标签 传播部门和职位信息,以便后续组过滤。

控制台登录配置文件

resource "aws_iam_user_login_profile" "users" {
  for_each = aws_iam_user.users

  user                     = each.value.name
  password_reset_required = true

  lifecycle {
    ignore_changes = [password_reset_required, password_length]
  }
}

创建控制台登录配置文件,并在首次登录时强制密码重置。lifecycle 块可防止在密码更改时不必要的重新创建。

创建组和成员关系

创建 IAM 组

resource "aws_iam_group" "education" {
  name = "Education"
  path = "/groups/"
}

resource "aws_iam_group_membership" "education_members" {
  name  = "education-group-membership"
  group = aws_iam_group.education.name

  users = [
    for user in aws_iam_user.users : user.name
    if user.tags.Department == "Education"
  ]
}

类似的块可以为 EngineersManagers 创建。for 表达式配合 if 子句根据 Department 标签过滤用户。

Manager 组逻辑(高级)

resource "aws_iam_group_membership" "managers_members" {
  name  = "managers-group-membership"
  group = aws_iam_group.managers.name

  users = [
    for user in aws_iam_user.users :
    user.name
    if contains(keys(user.tags), "JobTitle") &&
       can(regex("Manager|CEO", user.tags.JobTitle))
  ]
}

can() 函数安全地检查 JobTitle 键是否存在,并匹配包含 “Manager” 或 “CEO” 的职位,将这些用户分配到 Managers 组。

执行命令

# 初始化 Terraform(下载提供商,配置后端)
terraform init

# 查看计划的变更
terraform plan

# 应用配置
terraform apply

运行配置后将总共创建 58 个资源

  • 26 个 IAM 用户
  • 26 个 IAM 用户登录配置文件
  • 3 个 IAM 组
  • 3 个 IAM 组成员关系

祝你玩得开心,Terraform 之旅顺利!

Back to Blog

相关文章

阅读更多 »