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

基于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)

核心实现步骤

  1. 获取组织内所有账户列表:从管理账户调用AWS Organizations API拉取全部活跃成员账户ID与名称
  2. 批量切换角色到成员账户:通过STS AssumeRole获取每个成员账户的临时凭证
  3. 执行用户查询操作:使用临时凭证在每个账户内调用IAM API列出用户,可选生成并获取凭证报告
  4. 汇总结果:将所有账户的用户数据统一输出到文件,方便后续分析

自动化脚本示例(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:31:06