基于AWS CLI的AWS组织多账户批量列用户自动化最佳实践
AWS组织多账户IAM用户批量列出自动化最佳实践
前提条件
- 管理账户需具备以下IAM权限:
organizations:ListAccounts:用于获取组织内所有成员账户列表sts:AssumeRole:允许切换到成员账户的指定IAM角色
- 所有成员账户需预先创建一个共享IAM角色(例如
Org-IAM-Viewer),该角色需包含以下权限:iam:ListUsers:列出账户内所有IAM用户iam:GenerateCredentialReport+iam:GetCredentialReport(可选,若需获取用户凭证状态)- 角色信任策略需允许管理账户的IAM实体(用户/角色)进行AssumeRole操作
- 已在本地配置管理账户的AWS CLI凭证(通过
aws configure或环境变量) - AWS CLI版本≥2.0(确保支持最新的组织API)
核心实现步骤
- 获取组织内所有账户列表:从管理账户调用AWS Organizations API拉取全部活跃成员账户ID与名称
- 批量切换角色到成员账户:通过STS AssumeRole获取每个成员账户的临时凭证
- 执行用户查询操作:使用临时凭证在每个账户内调用IAM API列出用户,可选生成并获取凭证报告
- 汇总结果:将所有账户的用户数据统一输出到文件,方便后续分析
自动化脚本示例(Bash)
#!/bin/bash # 配置参数 ROLE_NAME="Org-IAM-Viewer" # 成员账户中创建的共享角色名称 OUTPUT_FILE="aws_all_account_users.json" ERROR_LOG="aws_account_errors.log" # 清空现有输出文件和错误日志 > "$OUTPUT_FILE" > "$ERROR_LOG" # 获取组织内所有活跃账户(排除已关闭/挂起的账户) ACCOUNTS=$(aws organizations list-accounts --query 'Accounts[?Status==`ACTIVE`].[Id,Name]' --output json) # 遍历每个账户 echo "$ACCOUNTS" | jq -c '.[]' | while read -r ACCOUNT; do ACCOUNT_ID=$(echo "$ACCOUNT" | jq -r '.[0]') ACCOUNT_NAME=$(echo "$ACCOUNT" | jq -r '.[1]') echo "Processing account: $ACCOUNT_NAME ($ACCOUNT_ID)" # 尝试获取临时凭证 ROLE_ARN="arn:aws:iam::$ACCOUNT_ID:role/$ROLE_NAME" STS_RESPONSE=$(aws sts assume-role --role-arn "$ROLE_ARN" --role-session-name "ListUsersSession-$ACCOUNT_ID" 2>> "$ERROR_LOG") if [ $? -ne 0 ]; then echo "Failed to assume role for $ACCOUNT_NAME ($ACCOUNT_ID)" >> "$ERROR_LOG" continue fi # 提取临时凭证 AWS_ACCESS_KEY_ID=$(echo "$STS_RESPONSE" | jq -r '.Credentials.AccessKeyId') AWS_SECRET_ACCESS_KEY=$(echo "$STS_RESPONSE" | jq -r '.Credentials.SecretAccessKey') AWS_SESSION_TOKEN=$(echo "$STS_RESPONSE" | jq -r '.Credentials.SessionToken') # 列出当前账户的IAM用户 USERS=$(AWS_ACCESS_KEY_ID="$AWS_ACCESS_KEY_ID" AWS_SECRET_ACCESS_KEY="$AWS_SECRET_ACCESS_KEY" AWS_SESSION_TOKEN="$AWS_SESSION_TOKEN" aws iam list-users --output json 2>> "$ERROR_LOG") if [ $? -eq 0 ]; then # 将账户信息与用户数据合并后写入输出文件 echo "{\"account_id\": \"$ACCOUNT_ID\", \"account_name\": \"$ACCOUNT_NAME\", \"users\": $(echo "$USERS" | jq '.Users')}" >> "$OUTPUT_FILE" else echo "Failed to list users for $ACCOUNT_NAME ($ACCOUNT_ID)" >> "$ERROR_LOG" fi # 可选:生成并获取凭证报告(若需要) # AWS_ACCESS_KEY_ID="$AWS_ACCESS_KEY_ID" AWS_SECRET_ACCESS_KEY="$AWS_SECRET_ACCESS_KEY" AWS_SESSION_TOKEN="$AWS_SESSION_TOKEN" aws iam generate-credential-report >> "$ERROR_LOG" # sleep 2 # 等待报告生成 # CRED_REPORT=$(AWS_ACCESS_KEY_ID="$AWS_ACCESS_KEY_ID" AWS_SECRET_ACCESS_KEY="$AWS_SECRET_ACCESS_KEY" AWS_SESSION_TOKEN="$AWS_SESSION_TOKEN" aws iam get-credential-report --query 'Content' --output text | base64 --decode) # echo "$CRED_REPORT" >> "credential_report_$ACCOUNT_ID.csv" done echo "Processing complete. Results saved to $OUTPUT_FILE. Errors logged to $ERROR_LOG"
优化与注意事项
- 并行处理:若300+账户串行处理耗时过长,可改用
xargs实现并行(注意控制并发数,避免触发AWS API速率限制),示例:echo "$ACCOUNTS" | jq -c '.[]' | xargs -P 10 -I {} bash -c 'ACCOUNT="{}"; # 此处放入单个账户的处理逻辑' - 速率限制:AWS IAM API默认速率限制为100次/秒,并行数建议控制在10-20之间,避免被限流
- 错误处理:脚本中已加入基础错误捕获,可根据需求扩展重试机制
- 结果格式化:若需要CSV格式输出,可使用
jq将JSON结果转换为CSV,示例:jq -r '. | [.account_id, .account_name, .users[].UserName, .users[].CreateDate] | @csv' "$OUTPUT_FILE" > aws_all_account_users.csv - 权限验证:提前选取2-3个成员账户测试脚本,确保角色信任策略和权限配置正确
- 日志分析:定期查看错误日志,处理权限缺失或账户异常的情况
内容的提问来源于stack exchange,提问作者Jason Millert
相关产品推荐
相关产品推荐

