“テストアカウントなのにリソースが数百個…コンソールで一つずつ削除するのにうんざりした経験はありませんか?”
>
🎯 この記事で扱う内容
- 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は、AWSアカウント内のリソースを大量に削除するオープンソースのCLIツールです。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で削除可能なすべてのリソースが対象です。主要サービス別にまとめると以下の通りです。
| カテゴリ | 削除可能リソース |
|---|---|
| Compute | EC2 Instance, AMI, Snapshot, Auto Scaling Group, Lambda |
| Storage | S3 Bucket/Object, EBS Volume, EFS, Glacier |
| Database | RDS, DynamoDB, ElastiCache, Redshift, DocumentDB |
| Network | VPC, Subnet, IGW, NAT GW, ELB/ALB/NLB, Transit GW |
| IAM | User, Role, Policy, Group, Access Key, MFA Device |
| Container | ECR Repository, EKS Cluster, ECS Cluster/Service |
| Serverless | Lambda, API Gateway v1/v2, EventBridge |
| Security | KMS Key(スケジュール), Secrets Manager, ACM, WAF |
| Monitoring | CloudWatch Alarm, Log Group, Dashboard |
—
🔍 削除されないリソース
aws-nukeでも手が出せないものがあります。
❌ 構造的に不可能なもの
KMS Customer Managed Key (CMK): AWS API自体に即時削除機能はありません。ScheduleKeyDeletion APIを通じて最低7日間の待機後に削除されます。aws-nukeはこのスケジュール登録を行うだけで、実際のキーは7日後に消滅します。AWS管理型キー(aws/s3, aws/rdsなど)は削除自体が不可能です。
Secrets Manager Secret: 基本的に7〜30日間の復旧待機期間が存在します。–force-delete-without-recoveryオプションで即時削除できますが、削除後に同じ名前で再生成できない期間が発生します。
Default VPCの基本リソース: Default Security Group、Default Network ACLはAWSの構造上削除不可能です。aws-nuke実行時にはfilteredとして処理され、スキップされます。
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を実行するには、必ずアカウントエイリアスが設定されている必要があります。これは、誤って間違ったアカウントを削除してしまうのを防ぐための安全装置です。
# アカウントエイリアスの作成
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の核となる強みは、きめ細やかなフィルタリングです。リソースを保護する方法は3つあります。
方法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"
# グローブパターンで保護
S3Bucket:
- type: glob
value: "prod-*"
# Secretを保護
SecretsManagerSecret:
- "prod/db/password"
方法3: 削除するものだけを指定(最も安全)
resource-types:
targets:
- EC2Instance
- ECSCluster
- ECSService
- RDSInstance
- S3Bucket
明示されたタイプのみを削除し、残りはすべて保護します。初めて使用する際に最も推奨される方法です。
フィルター演算子の種類
| 演算子 | 説明 | 例 |
|---|---|---|
| exact | 完全一致(デフォルト) | “my-bucket” |
| glob | ワイルドカード | “prod-*” |
| regex | 正規表現 | “^prod-.*” |
| contains | 含むかどうか | “production” |
| dateOlderThan | 日付条件 | value: 7d |
—
💻 実践実行パターン
Step 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 → 構造的に削除不可
Step 2: リストを確認後、実際に実行
aws-nuke run --config nuke-config.yaml --no-dry-run
実行時には、アカウントエイリアスを直接入力する確認ステップを経ます。
Step 3: 複雑な環境では2〜3回繰り返す
EKS、ECSのように依存関係が複雑なリソースがある場合、1回の実行では完全に整理されないことがあります。エラーが残っている場合は、同じコマンドを繰り返し実行してください。
⚠️ 注意事項 / よくある失敗
- プロダクションアカウントは必ずaccount-blocklistに登録してください。configファイルに誤ってプロダクションアカウントIDを入れてしまうと、元に戻す方法はありません。
- EKSクラスターは削除順序が重要です。クラスターがプロビジョニングしたELB、ENIを先に整理しないと、VPC削除が失敗します。EKS環境では、kubectlでService/Ingressオブジェクトを先に削除してからaws-nukeを実行するのが安全です。
- KMSは即時削除ではありません。aws-nuke実行後、KMS CMKがKMS_KEY_DELETION_SCHEDULED状態のまま残るのは正常です。7日後に自動削除されます。
- Deletion Protectionが設定されているリソースは別途設定が必要です。RDS、EC2などに削除保護が設定されている場合、feature-flagsで明示的に解除する必要があります。
feature-flags:
disable-deletion-protection:
RDSInstance: true
EC2Instance: true
CloudformationStack: true
IAM依存性エラーは再試行で解決されます。 DeleteConflictエラーが発生しても、aws-nukeには再試行ロジックがあります。1回の実行でうまくいかない場合は、もう一度実行してください。
✅ まとめ / 終わりに
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の全メンバーアカウントに順次適用する自動化スクリプトを構成してみるのも良いでしょう。

コメントを残す