💣 一键清理AWS账户的工具 — aws-nuke完全攻略

“测试账户中却有数百个资源…您是否曾因在控制台中逐一删除而感到筋疲力尽?”

>


🎯 本文涵盖内容

  • 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 中的所有成员账户。


Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注