第16/30天:精通 AWS IAM 用户管理与 Terraform
Source: Dev.to
Architecture
IAM 是在大型组织中管理用户和权限的基石。此演示展示了如何使用 Terraform 管理 IAM 用户、组和成员关系——AWS 版的 Azure AD 用户管理——并演示 Terraform 的迭代构造(for_each、for 表达式、条件过滤)。
本演示的功能
- 获取 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)。
- 根据用户属性生成的组成员关系。
- 包含元数据的用户标签(
DisplayName、Department、JobTitle)。
项目结构
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"
]
}
类似的块可以为 Engineers 和 Managers 创建。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 之旅顺利!
