“测试账户中却有数百个资源…您是否曾因在控制台中逐一删除而感到筋疲力尽?”
>
🎯 本文涵盖内容
- aws-nuke 是什么,为何使用它
- 可删除资源与不可删除资源的区别
- config 文件编写方法(选择要保护的资源)
- 使用 dry-run 安全操作的实践模式
- 实际工作中常见的失败模式及解决方案
📌 引言 / 背景
在云环境中工作时,您一定会遇到这样的情况。
开发团队为测试目的创建的EC2实例、S3存储桶、RDS、Lambda、IAM角色、EKS集群…这些不知何时创建的资源堆积在AWS账户的各个角落。在控制台中逐一点击删除,面对数十个区域、数百个资源,令人望而却步;而Terraform destroy在没有state文件的情况下也无能为力。
在这种情况下,aws-nuke 应运而生。
当您需要在AWS Organizations环境中完全初始化成员账户,或者定期清理学习/实践账户时,aws-nuke 是最强大的选择。但是,正如其名称所示,它是一个核弹级别的工具,因此必须准确了解其使用方法。

🔍 什么是 aws-nuke?
aws-nuke 是一个开源的 CLI 工具,用于批量删除 AWS 账户中的资源。它使用 Go 语言编写,通过 AWS SDK 检测并删除 300 多种资源类型。
它最初始于 rebuy-de/aws-nuke,但目前 ekristen/aws-nuke 分支正在积极维护。它已重写为 v3 版本,基于 libnuke 库运行,并正在扩展到 azure-nuke、gcp-nuke 等。
为什么要使用 aws-nuke?
| 情况 | 原因 |
|---|---|
| 定期清理测试账户 | 减少因闲置资源产生的成本 |
| 初始化 Organizations 成员账户 | 在账户重用前确保干净状态 |
| 安全审计后整理 | 删除不必要的 IAM、开放的 SG 等 |
| CI/CD 流水线清理 | 测试后自动清理 |
—
🔍 可删除资源范围
aws-nuke 基于 AWS SDK 运行,因此 所有可通过 AWS API 删除的资源 都是其目标。按主要服务分类如下:
| 类别 | 可删除资源 |
|---|---|
| 计算 | EC2 Instance, AMI, Snapshot, Auto Scaling Group, Lambda |
| 存储 | S3 Bucket/Object, EBS Volume, EFS, Glacier |
| 数据库 | RDS, DynamoDB, ElastiCache, Redshift, DocumentDB |
| 网络 | VPC, Subnet, IGW, NAT GW, ELB/ALB/NLB, Transit GW |
| IAM | User, Role, Policy, Group, Access Key, MFA Device |
| 容器 | ECR Repository, EKS Cluster, ECS Cluster/Service |
| 无服务器 | Lambda, API Gateway v1/v2, EventBridge |
| 安全 | KMS Key(计划删除), Secrets Manager, ACM, WAF |
| 监控 | CloudWatch Alarm, Log Group, Dashboard |
—
🔍 不可删除的资源
即使是 aws-nuke,也有一些资源无法触及。
❌ 结构上无法删除的资源
KMS 客户管理密钥 (CMK): AWS API 本身不提供即时删除功能。它通过 ScheduleKeyDeletion API 在至少 7 天的等待期后删除。aws-nuke 仅注册此计划,实际密钥将在 7 天后消失。AWS 托管密钥(如 aws/s3, aws/rds 等)根本无法删除。
Secrets Manager Secret: 默认情况下,存在 7-30 天的恢复等待期。虽然可以使用 –force-delete-without-recovery 选项立即删除,但在删除后的一段时间内,无法以相同名称重新创建密钥。
默认 VPC 基本资源: Default Security Group 和 Default Network ACL 由于 AWS 结构原因无法删除。aws-nuke 执行时会将其过滤并跳过。
AWS 托管 IAM Policy: 带有 arn:aws:iam::aws:policy/ 前缀的 AWS 拥有的策略无法删除。
Root IAM User: 由于 AWS 账户结构原因,无法删除。
⚠️ 有条件失败的资源
EKS/ECS 创建的相关资源: 如果在删除 EKS 集群之前,集群创建的 ENI、ELB、Security Group 仍然存在,则在删除 VPC 时会发生 DependencyViolation 错误。
IAM Role + Policy 依赖性: 如果 IAM Role 附加了 Policy,错误的删除顺序可能导致 DeleteConflict 错误。尽管 aws-nuke 具有重试逻辑,但并非总是完美的。
💻 安装与配置
安装
# macOS (Homebrew)
brew install ekristen/tap/aws-nuke
# Linux (直接二进制)
wget https://github.com/ekristen/aws-nuke/releases/latest/download/aws-nuke-v3.x.x-linux-amd64.tar.gz
tar -xzf aws-nuke-*.tar.gz
mv aws-nuke /usr/local/bin/
先决条件
运行 aws-nuke 必须设置账户别名 (Account Alias)。这是为了防止意外删除错误账户的安全措施。
# 创建账户别名
aws iam create-account-alias --account-alias my-test-account
# 确认
aws iam list-account-aliases
编写基本 config 文件
# nuke-config.yaml
regions:
- ap-northeast-2 # 首尔区域
- global # IAM 等全球资源
# 绝不能触碰的账户(如生产环境)
account-blocklist:
- "111111111111"
accounts:
"222222222222": # 要清理的账户 ID
filters: {} # 无过滤器 = 全部删除
💻 选择要保护的资源(过滤)
aws-nuke 的核心优势在于其精细的过滤功能。您可以通过三种方式保护资源:
方法 1: 排除整个资源类型
resource-types:
excludes:
- IAMUser # 保护所有 IAM 用户
- KMSKey # 保护所有 KMS 密钥
- Route53HostedZone
方法 2: 仅保护特定资源(过滤)
accounts:
"222222222222":
filters:
# 按名称保护
IAMRole:
- "OrganizationAccountAccessRole"
- "prod-deploy-role"
# 按标签保护
EC2Instance:
- type: exact
property: tag:DoNotNuke
value: "true"
# 按 glob 模式保护
S3Bucket:
- type: glob
value: "prod-*"
# 保护 Secret
SecretsManagerSecret:
- "prod/db/password"
方法 3: 仅指定要删除的资源(最安全)
resource-types:
targets:
- EC2Instance
- ECSCluster
- ECSService
- RDSInstance
- S3Bucket
仅删除明确指定的类型,其余全部保护。这是首次使用时最推荐的方式。
过滤运算符类型
| 运算符 | 说明 | 示例 |
|---|---|---|
| exact | 完全匹配(默认) | “my-bucket” |
| glob | 通配符 | “prod-*” |
| 正则表达式 | 正则表达式 | “^prod-.*” |
| contains | 包含 | “production” |
| dateOlderThan | 日期条件 | value: 7d |
—
💻 实战执行模式
步骤 1: 首先通过 Dry-run 确认
aws-nuke run --config nuke-config.yaml --dry-run
输出示例:
ap-northeast-2 - EC2Instance - 'i-0abc1234def' - would remove
ap-northeast-2 - IAMRole - 'OrganizationAccountAccessRole' - filtered by config
ap-northeast-2 - EC2SecurityGroup - 'sg-default' - cannot delete group 'default'
- would remove → 计划删除
- filtered by config → 受配置保护
- cannot delete → 结构上无法删除
步骤 2: 审查列表后实际执行
aws-nuke run --config nuke-config.yaml --no-dry-run
执行时,需要经过一个确认步骤,手动输入账户别名。
步骤 3: 对于复杂环境重复 2-3 次
对于 EKS、ECS 等具有复杂依赖关系的资源,一次执行可能无法完全清理。如果仍有错误,请重复执行相同的命令。
⚠️ 注意事项 / 常见错误
- 务必将生产账户注册到 account-blocklist 中。如果意外将生产账户 ID 放入 config 文件,将无法撤销。
- EKS 集群的删除顺序很重要。如果集群预置的 ELB、ENI 未先清理,VPC 删除将失败。在 EKS 环境中,更安全的做法是先使用 kubectl 删除 Service/Ingress 对象,然后再运行 aws-nuke。
- KMS 不是即时删除。aws-nuke 运行后,KMS CMK 保持 KMS_KEY_DELETION_SCHEDULED 状态是正常的。它们将在 7 天后自动删除。
- 启用了删除保护的资源需要单独配置。如果 RDS、EC2 等资源设置了删除保护,则必须在 feature-flags 中明确禁用。
feature-flags:
disable-deletion-protection:
RDSInstance: true
EC2Instance: true
CloudformationStack: true
IAM 依赖性错误可通过重试解决。 即使发生 DeleteConflict 错误,aws-nuke 也有重试逻辑。如果一次执行不成功,请再次运行。
✅ 总结 / 结束语
aws-nuke 是目前清理 AWS 账户最强大的工具。它支持 300 多种资源类型,可以通过精细过滤选择要保护的资源,并支持通过 dry-run 模式进行执行前验证。
核心原则总结如下:
- 始终将生产账户注册到 account-blocklist 中。
- 初次使用时,仅通过 resource-types.targets 明确指定删除目标。
- 务必先运行 –dry-run 并审查列表。
- 对于 EKS/ECS 环境,考虑在解决依赖关系后重复运行 2-3 次。
- 了解 KMS 和 Secrets Manager 并非即时删除。
下一步,您可以考虑将 aws-nuke 与 AWS Lambda + EventBridge 集成,构建一个周期性自动清理流水线,或者配置自动化脚本,将其顺序应用于 AWS Organizations 中的所有成员账户。

发表回复