[ aws-nuke ] 리소스 전체 삭제 진행 ( use Cloudshell )
AWS를 사용하게 되면 다양한 리전에서 다양한 서비스들을 쓰게 될 텐데 작업하다 보면 비용 때문에 특정 AWS계정의 모든 리소스를 삭제하여야 하는 경우가 발생할 수 있습니다.
하여 이번 글에서는 aws nuke를 통해 모든 리전에 있는 모든 리소스를 삭제하는 방법에 대해 기재하겠습니다.
목차
▶ aws-nuke 실행파일 다운로드
▶ IAM 사용자 계정 설정
▶ aws-nuke에 대한 구성파일 생성
▶ 삭제 대상 리소스 조회
▶ 리소스 삭제
▶ aws-nuke 실행파일 다운로드 ➡️ 링크
윈도우 PC나 MAC에서도 작업이 가능하지만 AWS CLI 설치 없이 간단하게 Cloudshell에서도 작업이 가능합니다.
# 실행파일 다운로드
sudo wget [리눅스amd64 파일 링크]
# 압축 해제
tar -zxvf [다운로드파일명]
# 실행 파일명 변경 ( 실행시 편리를 위해 변경하는 것이며 해당 작업은 진행하지 않아도 됩니다. )
mv [aws-nuke-vx.xx.x-linux-amd64] aws-nuke
▶ IAM 사용자 계정 설정
Root 계정으로 작업을 실행해도 상관은 없지만 되도록이면 AWS 모든 작업은 사용자 계정을 생성 후 사용자 계정에 권한을 할당해서 작업하는 것을 권장드립니다.
♣ 권한 설정
전체 리소스에 대한 스캔 및 삭제 작업을 진행하기 때문에 AdministratorAccess 정책을 사용자 계정에 할당합니다.
♣ 사용자 계정 별칭 설정
아래와 같은 에러가 발생하면 계정의 alias를 설정하지 않아서 발생한 오류 이므로 콘솔에서 직접 설정하거나 command로 설정해 주어야 합니다. ( Error: The specified account doesn't have an alias. For safety reasons you need to specify an account alias. Your production account should contain the term 'prod'. )
- 콘솔에서 설정
- AWS CLI로 설정
aws iam create-account-alias --account-alias test-blue
▶ aws-nuke에 대한 구성파일 생성
config 설정 파일은 aws-nuke 실행파일이 있는 경로에 생성하면 됩니다.
➡️ 참고 링크
( 예시 )
regions:
- "global"
- "us-east-1"
account-blocklist:
- "999999999999" # production
accounts:
111111111111: # aws계정ID
filters:
IAMUser:
- "test-admin" # 삭제를 원하지 않는 사용자계정
IAMUserPolicyAttachment:
- "test-admin -> AdministratorAccess"
# 위 계정에 할당된 정책 삭제방지
- regions 에는 사용하고 있는 모든 리전을 기재하거나 삭제하고 싶은 리전만 기재할 수 있습니다.
- account-blocklist 는 org 레벨에서 리소스 삭제 작업을 진행 시 aws-nuke 실행을 제외시킬 AWS 계정을 명시하는 설정입니다. 개별 AWS 계정에서 사용자 계정을 생성하여 작업 시 해당 설정은 무시해 됩니다.
- accounts는 aws-nuke를 실행할 AWS 계정에서 filters 옵션을 통해 삭제를 원하지 않는 개별 리소스들을 지정할 수 있습니다. ( aws nuke 작업을 위해 생성한 사용자 계정은 삭제 대상에서 제외시켜야 합니다. )
- 그 외 resource-types 옵션에서 excludes 항목을 통해 지정된 리소스 유형의 삭제를 방지할 수도 있습니다.
( 예 )
---
regions:
- "eu-west-1"
account-blocklist:
- 1234567890
resource-types:
# don't nuke IAM users
excludes:
- IAMUser
- IAMUserAccessKey
accounts:
1111111111: {}
사용가능한 리소스 유형은 옵션 resource-types을 통해 조회가능합니다.
./aws-nuke resource-types
▶ 삭제 대상 리소스 조회
./aws-nuke -c config.yml
실행하면 아래와 같이 작업을 진행할 AWS ID 정보와 계정 alias정보를 확인하는 문구가 출력되며 설정한 alias를 입력하면 리소스 조회 작업이 시작됩니다.
🚨 이슈 : 삭제 대상 리소스 조회 중 실행이 멈추다가 자동 Killed 되는 현상이 발생할 수 있습니다.
🔍원인 1 : cloudshell이 아닌 다른 환경에서 aws configure 설정을 통해 작업을 진행할 경우 accounts 필터에 IAMUserAccessKey를 지정해 주거나 resource-types에서 IAMUserAccessKey 리소스 유형을 삭제 제외처리 하지 않으면 액세스키 삭제로 인해 해당 이슈가 발생할 수 있습니다.
🔍원인 2 : S3 버킷에 대용량 데이터가 저장되어 있지는 않은지 확인해 보아야 합니다. 있다면 수명주기 정책을 통해 삭제 진행을 하여야 합니다. 콘솔에서 수동으로 삭제를 진행할 경우 시간이 아~~~ 주 많이 소요되며 삭제가 제대로 진행되지 않을 수도 있습니다.
▶ 리소스 삭제
리소스 삭제는 --no-dry-run 옵션을 추가해서 진행합니다.
./aws-nuke -c config.yml --no-dry-run
삭제 대상 리소스 조회와 동일하게 AWS ID와 alias를 확인 및 재입력하라는 문구가 출력되며 alias를 입력하면 먼저 스캔 작업이 진행됩니다.
삭제대상은 "would remove"로 출력됩니다.
삭제 대상 리소스를 전부 스캔하고 나면 다시 한번 alias을 입력하라는 문구가 출력되며 alias를 입력하면 삭제 작업이 진행됩니다.
삭제중인 리소스는 "triggered remove"로 출력됩니다.
한 번의 스캔으로 모든 리소스를 삭제할 수 없기 때문에 삭제 대상 리소스들이 전부 삭제될 때까지 계속해서 반복 스캔&삭제 작업이 진행됩니다.
삭제를 기다리는 리소스는 "wating"으로 표시되며
삭제가 완료된 리소스는 "removed"으로 표시되며
삭제가 실패한 리소스들은 "failed"로 표시되다 일정 시간이 지나면 ERROR: failed라는 에러문구를 출력하고 실행이 중단됩니다.
삭제를 실패한 리소스들은 콘솔에 직접 접근하여 상위 조직에서 설정한 리소스들이거나 AWS 외부 서비스들과 연결된 리소스들은 아닌지 확인하여야 합니다.
[ 종합 ]
aws nuke는 여러 사용자가 사용하여 리소스 사용 현황이 파악 안 되는 AWS 계정의 리소스들을 일괄 삭제하는 데에 유리하며 대용량 S3 버킷이 존재하거나 상위 조직 또는 외부 서비스들과 연결된 리소스들은 삭제가 어려운 점이 있습니다.