"테스트 계정인데 리소스가 수백 개... 콘솔에서 하나씩 지우다가 지쳐본 적 있으신가요?"
🎯 이 글에서 다루는 것
aws-nuke가 무엇인지, 왜 쓰는지
삭제 가능한 리소스와 삭제 불가능한 리소스의 차이
config 파일 작성법 (보호할 리소스 골라내기)
dry-run으로 안전하게 사용하는 실전 패턴
실무에서 자주 겪는 실패 패턴과 해결책
📌 도입 / 배경
클라우드 환경에서 일하다 보면 이런 상황이 반드시 찾아옵니다.
개발팀이 테스트용으로 만들어 놓은 EC2 인스턴스, S3 버킷, RDS, Lambda, IAM Role, 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 파이프라인 정리
테스트 후 자동 cleanup
🔍 삭제 가능한 리소스 범위
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 (Binary 직접)
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를 실행하려면 반드시 계정 Alias가 설정되어 있어야 합니다. 실수로 잘못된 계정을 날리는 것을 방지하기 위한 안전장치입니다.
# 계정 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"
# 글로브 패턴으로 보호
S3Bucket:
- type: glob
value: "prod-*"
# Secret 보호
SecretsManagerSecret:
- "prod/db/password"