第16天:使用 Terraform 管理 AWS IAM 用户

发布: (2026年1月7日 GMT+8 23:08)
5 min read
原文: Dev.to

Source: Dev.to

手动在 AWS 中管理 IAM 用户可以接受……但当情况不再如此时就会出现问题。
当团队规模扩大时,在控制台里点点点会变得既繁琐又混乱。

本演示展示了一个 基于 Terraform 的 IAM 用户管理系统,其特点包括:

  • 用户在 CSV 文件中定义
  • 组和成员关系自动分配
  • 所有内容均可复现、受版本控制且具可扩展性

概览

该演示管理:

  • IAM 用户
  • IAM 组
  • 组成员关系

所有操作均由单个 CSV 文件驱动。无需手动创建用户,只需更新 CSV,运行 terraform apply,即可完成。

前提条件

确保您已经:

  • 配置了 AWS CLI(aws configure
  • 安装了 Terraform v1.0+
  • 拥有创建用户和组的 IAM 权限
  • 拥有用于远程 Terraform 状态的 S3 存储桶

快速开始

1️⃣ 创建 S3 后端存储桶

terraform {
  backend "s3" {
    bucket = "my-aws-terraform-state-bucket-amit-123"
    key    = "Day-16/terraform/terraform.tfstate"
    region = "us-east-1"
  }
}

2️⃣ 初始化 Terraform

terraform init

3️⃣ 查看更改

terraform plan

4️⃣ 应用配置

terraform apply -auto-approve

5️⃣ 项目文件结构

Day16/terraform
├── backend.tf          # S3 backend configuration
├── provider.tf         # AWS provider setup
├── versions.tf         # Terraform & provider versions
├── main.tf             # IAM users + CSV parsing
├── groups.tf           # Groups and memberships
├── users.csv           # User data source
└── README.md           # Project overview

Source:

工作原理(逐步)

步骤 1 – 从 CSV 读取用户

# Read users from CSV
locals {
  users = csvdecode(file("users.csv"))
}

步骤 2 – 创建 IAM 用户

# Create IAM users
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}{lastname}(例如,Michael Scott → mscott

步骤 3 – 启用控制台访问

# Create IAM user login profile (password)
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_length,
      password_reset_required,
    ]
  }
}

步骤 4 – 创建组及成员关系

# Create IAM Groups
resource "aws_iam_group" "education" {
  name = "Education"
  path = "/groups/"
}

resource "aws_iam_group" "managers" {
  name = "Managers"
  path = "/groups/"
}

resource "aws_iam_group" "engineers" {
  name = "Engineers"
  path = "/groups/"
}

组只需创建一次;成员关系会动态分配(此处未展示以保持简洁)。

Terraform 输出

apply 之后,您可以检查:

terraform output account_id
terraform output user_names
terraform output user_passwords   # sensitive

有助于验证和自动化。

示例用户列表 (users.csv)

first_name,last_name,department,job_title
Michael,Scott,Education,Regional Manager
Dwight,Schrute,Sales,Assistant to the Regional Manager
Jim,Halpert,Sales,Sales Representative
Pam,Beesly,Reception,Receptionist
Ryan,Howard,Temps,Temp
Andy,Bernard,Sales,Sales Representative
Robert,California,Corporate,CEO
Stanley,Hudson,Sales,Sales Representative
Kevin,Malone,Accounting,Accountant
Angela,Martin,Accounting,Accountant
Oscar,Martinez,Accounting,Accountant
Phyllis,Vance,Sales,Sales Representative
Toby,Flenderson,HR,HR Representative
Kelly,Kapoor,Customer Service,Customer Service Representative
Darryl,Philbin,Warehouse,Warehouse Foreman
Creed,Bratton,Quality Assurance,Quality Assurance
Meredith,Palmer,Supplier Relations,Supplier Relations
Erin,Hannon,Reception,Receptionist
Gabe,Lewis,Corporate,Coordinating Director of Emerging Regions
Jan,Levinson,Corporate,Vice President of Northeast Sales
David,Wallace,Corporate,CFO
Holly,Flax,HR,HR Representative
Charles,Miner,Corporate,Vice President of the Northeast Region
Jo,Bennett,Corporate,CEO of Sabre
Clark,Green,Sales,Sales Representative
Pete,Miller,Customer Service,Customer Service Representative

清理

要删除所有已创建的资源:

terraform destroy

警告: 这将删除所有用户、组和成员关系。

故障排除

错误:后端访问被拒绝

检查您的 AWS 凭证:

aws sts get-caller-identity

错误:用户已存在

将现有用户导入状态:

terraform import aws_iam_user.users["Michael"] mscott

或手动删除现有用户:

aws iam delete-login-profile --user-name mscott
aws iam delete-user --user-name mscott

资源

成功!

您的 AWS IAM 基础设施现在已通过代码进行管理。您可以:

  • 通过编辑 CSV 添加新用户
  • 通过更改用户属性修改组成员资格
  • 对所有更改进行版本控制
  • 在多个 AWS 账户之间复制此设置

祝 Terraform 使用愉快! 🚀

Back to Blog

相关文章

阅读更多 »

为什么传统 DevOps 停止扩展

传统的 DevOps 运作良好……直到组织规模扩大。 在小规模时,一个集中式的 DevOps 团队负责部署、修复和处理所有问题,感觉很高效……

Terraform 堆栈

概述:一组可投入生产的 Terraform Stacks,展示了跨完整应用程序、多区域 fan‑out 和 Kubernetes 平台的企业模式。