如何高效移除同一AWS组织下多账户IAM用户组的IAM策略
批量删除AWS组织各账户中IAM策略的解决方案
针对你提到的「未使用StackSet批量创建资源,现在需要跨账户删除同名IAM策略」的场景,以下是几个高效可行的方案:
方案1:AWS CLI + Shell脚本批量操作
利用AWS组织账户列表,结合STS角色切换,批量执行IAM清理操作:
- 获取组织内所有成员账户ID:
aws organizations list-accounts --query 'Accounts[*].Id' --output text - 编写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无法直接删除非栈集创建的资源,但可以通过临时部署清理模板实现:
- 编写清理用的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: [] - 创建StackSet并部署到组织内所有账户;
- 部署完成后删除该StackSet,StackSet会自动清理模板中定义的资源,间接完成原策略的解除关联与删除操作。
关键注意事项
- 操作前务必在单个测试账户验证脚本/模板的有效性,避免批量操作失误;
- 确保拥有足够权限:组织管理员权限、各账户的IAM操作权限(
detach-group-policy、delete-policy、delete-stack等); - 如果目标策略被其他IAM实体(用户、角色)附加,需先清理这些关联才能成功删除策略。
内容的提问来源于stack exchange,提问作者Kin.Yip
相关产品推荐
相关产品推荐

