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

如何高效移除同一AWS组织下多账户IAM用户组的IAM策略

批量删除AWS组织各账户中IAM策略的解决方案

针对你提到的「未使用StackSet批量创建资源,现在需要跨账户删除同名IAM策略」的场景,以下是几个高效可行的方案:

方案1:AWS CLI + Shell脚本批量操作

利用AWS组织账户列表,结合STS角色切换,批量执行IAM清理操作:

  1. 获取组织内所有成员账户ID:
    aws organizations list-accounts --query 'Accounts[*].Id' --output text
    
  2. 编写Shell脚本批量处理(假设你能通过OrganizationAccountAccessRole切换到各账户):
    # 替换为你的组名和策略名
    GROUP_NAME="your-target-group"
    POLICY_NAME="your-target-policy"
    
    # 获取所有账户ID
    ACCOUNTS=$(aws organizations list-accounts --query 'Accounts[*].Id' --output text)
    
    for ACCOUNT in $ACCOUNTS; do
        POLICY_ARN="arn:aws:iam::$ACCOUNT:policy/$POLICY_NAME"
        # 切换到目标账户身份
        ROLE_ARN="arn:aws:iam::$ACCOUNT:role/OrganizationAccountAccessRole"
        CREDS=$(aws sts assume-role --role-arn "$ROLE_ARN" --role-session-name policy-cleanup-session)
        
        # 导出临时凭证
        export AWS_ACCESS_KEY_ID=$(echo "$CREDS" | jq -r '.Credentials.AccessKeyId')
        export AWS_SECRET_ACCESS_KEY=$(echo "$CREDS" | jq -r '.Credentials.SecretAccessKey')
        export AWS_SESSION_TOKEN=$(echo "$CREDS" | jq -r '.Credentials.SessionToken')
    
        # 先解除策略与组的关联
        aws iam detach-group-policy --group-name "$GROUP_NAME" --policy-arn "$POLICY_ARN"
        # 删除IAM策略
        aws iam delete-policy --policy-arn "$POLICY_ARN"
    
        # 清空临时凭证
        unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN
    done
    

方案2:批量删除CloudFormation栈(如果策略由独立栈创建)

如果每个账户的IAM策略是通过单独的CloudFormation栈部署的,直接批量删除对应栈即可,CloudFormation会自动清理关联资源:

STACK_NAME="your-policy-stack-name"
ACCOUNTS=$(aws organizations list-accounts --query 'Accounts[*].Id' --output text)

for ACCOUNT in $ACCOUNTS; do
   ROLE_ARN="arn:aws:iam::$ACCOUNT:role/OrganizationAccountAccessRole"
   CREDS=$(aws sts assume-role --role-arn "$ROLE_ARN" --role-session-name stack-delete-session)
   
   export AWS_ACCESS_KEY_ID=$(echo "$CREDS" | jq -r '.Credentials.AccessKeyId')
   export AWS_SECRET_ACCESS_KEY=$(echo "$CREDS" | jq -r '.Credentials.SecretAccessKey')
   export AWS_SESSION_TOKEN=$(echo "$CREDS" | jq -r '.Credentials.SessionToken')

   aws cloudformation delete-stack --stack-name "$STACK_NAME"

   unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN
done

方案3:临时StackSet执行清理操作

虽然StackSet无法直接删除非栈集创建的资源,但可以通过临时部署清理模板实现:

  1. 编写清理用的CloudFormation模板(替换占位符):
    AWSTemplateFormatVersion: '2010-09-09'
    Resources:
      # 关联目标策略与组,删除StackSet时会自动解除关联
      PolicyAttachmentCleanup:
        Type: AWS::IAM::GroupPolicyAttachment
        Properties:
          GroupName: YOUR_TARGET_GROUP
          PolicyArn: !Sub 'arn:aws:iam::${AWS::AccountId}:policy/YOUR_TARGET_POLICY'
      # 覆盖原策略,删除StackSet时会删除该策略
      PolicyCleanup:
        Type: AWS::IAM::Policy
        Properties:
          PolicyName: YOUR_TARGET_POLICY
          PolicyDocument:
            Version: '2012-10-17'
            Statement: []
    
  2. 创建StackSet并部署到组织内所有账户;
  3. 部署完成后删除该StackSet,StackSet会自动清理模板中定义的资源,间接完成原策略的解除关联与删除操作。

关键注意事项

  • 操作前务必在单个测试账户验证脚本/模板的有效性,避免批量操作失误;
  • 确保拥有足够权限:组织管理员权限、各账户的IAM操作权限(detach-group-policy、delete-policy、delete-stack等);
  • 如果目标策略被其他IAM实体(用户、角色)附加,需先清理这些关联才能成功删除策略。

内容的提问来源于stack exchange,提问作者Kin.Yip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 09:37:45