2023. 11. 5. 18:27ใAWS
โ๏ธ ๊ฐ์
์ด์ํ๋ ์๋น์ค๊ฐ ์ข ๋ฃ๋์ด AWS ๊ณ์ ์ ํด์งํ๊ธฐ ์ ํด๋น AWS ๊ณ์ ์ ์๋ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ์ญ์ ํ๋ ์์ ์ด ํ์ํ๋ค. AWS ๊ณ์ ๋ด ์กด์ฌํ๋ ํ ์์คํ ์ ์ข ๋ฃํ๋ ค ํ๋ฉด EC2 ๋ฐ RDS ์ญ์ ๋ฟ๋ง ์๋๋ผ ์ค๋ ์ท, ๋ณผ๋ฅจ, ์ฐ๊ฒฐ๋ ๋ณด์ ๊ทธ๋ฃน, ๋ฑ๋ฑ ํจ๊ป ์ญ์ ๋ฅผ ๊ณ ๋ คํด์ผํ ์์๋ค์ด ๋ง๋ค. ๊ณ์ ์ ์์ฑ๋ ๋ฆฌ์์ค๋ฅผ ํ ๋์ ํ์ ํ๊ธฐ ์ฝ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ฝ๋๋ ์์๋ค๋ ์๊ธด๋ค. ๋ฟ๋ง ์๋๋ผ ์ ํ๊ด๊ณ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์์๋ฅผ ๊ณ ๋ คํด์ ์ญ์ ํด์ผ ํ๋ ์์๋ค๋ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๊ฝค ๋ฒ๊ฑฐ๋ก์ด ์์ ์ด๋ค. IaC๋ฅผ ํตํด ๋ง๋ค์ด์ง ์ํคํ ์ฒ๋ผ๋ฉด destroy ๋ช ๋ น์ด ๋ฐ ์คํ ์ญ์ ๋ฑ์ผ๋ก ๋ฆฌ์์ค ์ญ์ ๋ฅผ ํ ์๋ ์๊ฒ ์ง๋ง, ํ๋ก๋น์ ๋ ์ดํ ๊ณ์ํด์ sync๋ฅผ ๋ง์ถ์ด ์ด์ํ๊ณ ์์๋ ๊ฒ ์๋๋ผ๋ฉด ๋๋ฝ๋๋ ์์๋ค๋ ์กด์ฌํ ๊ฒ์ด๋ค. ๋ณด๋ค ๊ฐํธํ ์ญ์ ๋ฅผ ์ํด ํ์ฌ ๋๋ฃ๊ฐ ์ถ์ฒํด์ค AWS-nuke๋ฅผ ์ด์ฉํ๊ธฐ๋ก ํ๋ค.
๐ฃ AWS-nuke๋?
nuke๋ ํต๋ฌด๊ธฐ๋ผ๋ ๋ป์ผ๋ก AWS ๊ณ์ ๊ณผ AWS ๋ฆฌ์ ์ ๊ฑฐ์ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ์ญ์ ํ๋ ์คํ ์์ค ๋๊ตฌ์ด๋ค. AWS-nuke๋ ๊ณต์ Github:README์์ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ์ญ์ ํด๋ ๊ด์ฐฎ์ AWS ๊ณ์ ์์๋ง aws-nuke๋ฅผ ์คํํ๋๋ก ๊ฐ๋ ฅํ ๊ถ๊ณ ํ๊ณ ์๋ค. ์ฃผ์ํด์ ์ฌ์ฉํ๋๋ก ํ์.
๐ ํ๊ฒฝ
- macOS Monterey
๐ซ ์ฌ์ฉ ๋ฐฉ๋ฒ
1. aws-nuke ์ค์น
brew install aws-nuke
*Windows ๋๋ Linux์ ๊ฒฝ์ฐ์๋ ๊ณต์ Github:Releases์์ ์์ถ ํ์ผ์ ๋ค์ด ๋ฐ์ ์ ์๋ค.
2. Account Alias ์ค์
AWS-nuke ์ญ์ ์คํ ์, aws account alias๋ฅผ ๋๋ฒ ์ ๋ ฅํ๋๋ก ํ์ฌ ์ญ์ ๋ฅผ ์ฌํ์ธํ๊ธฐ ๋๋ฌธ์ aws accoung alias๊ฐ ์ค์ ๋์ด ์์ด์ผ ํ๋ค. alias์๋ "prod" ๋ฌธ์์ด์ ํฌํจํ์ง ์์์ผ ํ๋ค. AWS Account๋ IAM ์ฝ์ ๋๋ CLI๋ฅผ ํตํด ์ค์ ํ ์ ์๋ค.
aws iam create-account-alias --account-alias {account-alias}
3. AWS Credentials ์ค์
์ญ์ ๋ฅผ ์ํด admin ๊ถํ์ด ์๋ AWS IAM ์ ์ ๋ฅผ ์ด์ฉํ์๋ค. aws-nuke๋ฅผ ์คํํ ๋ก์ปฌ์ ~/.aws/credentials ํ์ผ์ aws_access_key_id์ aws_secret_access_key๋ฅผ ์ ์ฅํ๊ณ ~/.aws/config ํ์ผ์ profile์ ์ง์ ํ์๋ค.
4. Config ํ์ผ ์์ฑ
์ญ์ ๋ฅผ ์งํํ ๋ฆฌ์ ๊ณผ ๊ณ์ ์ ๋ช ์ํ๋ config ํ์ผ์ ์์ฑํ๋ค.
regions:
- ap-northeast-2
account-blocklist:
- "999999999999"
accounts:
"{Account-ID}": {}
account-blocklist๋ ์ญ์ ํ์ง ์์ account ID ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฅํ๋ ์์ฑ์ผ๋ก, ์ญ์ ์ค์ ๋ฐฉ์ง๋ฅผ ์ํด ์ต์ 1๊ฐ์ account ID์ ๋ํด ๋ช ์๊ฐ ํ์ํ๋ค. config file ๋ด account-blocklist๊ฐ ์๋ ๊ฒฝ์ฐ ํ๊ธฐ์ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ์ฌ ์์์ id "999999999999"๋ฅผ ์ ๋ ฅํ์๋ค.
Error: The config file contains an empty blocklist. For safety reasons you need to specify at least one account ID. This should be your production account.
5. ์ญ์ ๊ฐ๋ฅํ ์์ ๋ชฉ๋ก ํ์ธํ๊ธฐ
aws-nuke ๋ช ๋ น์ด๋ ๋จ์ง nukeableํ ๋ฆฌ์์ค๋ง ๋ฆฌ์คํธํ๊ธฐ ๋๋ฌธ์ ์์ฌํ๊ณ ์ํํ๋ค. ๋ฆฌ์คํธ ์ถ๋ ฅ ๋ํ alias ์ ๋ ฅ์ ํ์ํ๋ค.
aws-nuke -c config.yaml --profile {3์์ ์ง์ ํ profile}
6. ์ผ๊ด ์ญ์ ํ๊ธฐ
์ค์ ๋ก ์์๋ค์ ์ญ์ ํ๊ธฐ ์ํด์๋ --no-dry-run ์ต์ ์ ์ถ๊ฐํด์ผ ํ๋ค.
aws-nuke -c config.yaml --no-dry-run --profile {3์์ ์ค์ ํ profile}
--no-dry-run์ ํตํด ๋ฆฌ์์ค ์ญ์ ์๋ ์, alias 2๋ฒ ์ ๋ ฅํ๋๋ก ํ์ฌ ์ญ์ ํ๊ณ ์ ํ๋ ๊ณ์ ์ ์ฌํ์ธํ๋ค. ์ฒซ๋ฒ์งธ๋ ์ฒซ๋ฒ์งธ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ช ๋ น์ด ์คํ ์งํ, ๋๋ฒ์งธ๋ ๋๋ฒ์งธ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด nukeableํ ์์์ ๋ชจ๋ ๋ฆฌ์คํธํ ๋ค alias๋ฅผ ์ ๋ ฅํ๋ค.
7. ๊ฒํ ํ๊ธฐ
ap-northeast-2 - RDSInstance - {DB-Instance} - [AvailabilityZone: "ap-northeast-2b", DeletionProtection: "true", Engine: "postgres", EngineVersion: "12.14", Identifier: "{DB-Instance}", InstanceClass: "{db-instance-type}", InstanceCreateTime: "2022-10-01T06:36:56Z", MultiAZ: "false", PubliclyAccessible: "false", tag:aws:cloudformation:logical-id: "{DB-Instance}", tag:aws:cloudformation:stack-id: "arn:aws:cloudformation:ap-northeast-2:{Account-ID}:{CF-Stack}", tag:aws:cloudformation:stack-name: "{Stack-Name}"] - failed
๋ก๊ทธ์์ ์์ ๊ฐ์ด ์ญ์ ์ ์คํจํ ์์๋ค์ ๋ฐ๊ฒฌํ๋ค. ๋์ฒด๋ก Termination Protection(์ข ๋ฃ ๋ณดํธ)๋ฅผ ํ์ฑํํ EC2 ์ธ์คํด์ค ๋ฐ Deletion Protection(์ญ์ ๋ณดํธ)๋ฅผ ํ์ฑํํ RDS ์ธ์คํด์ค๋ค์ด์์ผ๋ฉฐ ํด๋น ์ธ์คํด์ค์์ ๋ณดํธ๋ฅผ ๋นํ์ฑํํ ํ ๋ค์ aws-nuke --no-dry-run ๋ช ๋ น์ด๋ฅผ ์ํํ๋ ์ ์์ ์ผ๋ก ์ญ์ ๊ฐ ๋์๋ค.
ํ๋ฒ ๋ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ๋ ์ด์ ์ญ์ ํ ๋ฆฌ์์ค๊ฐ ์๋ค๋ ์ถ๋ ฅ์ ๋ฐ์๋ค. ์ค์ ๋ก ์์๋ค์ด ์ญ์ ๋๋์ง ํ์ธํ๊ธฐ ์ํด ์ฝ์์ ๋ค์ด๊ฐ์ ๋ฉ์ธ ์๋น์ค๋ค์ ํ์ธํ๋๋ฐ, Route53 ํธ์คํ ์์ญ์ ์ญ์ ๋์ง ์์๋ค. ๊ณต์ Github: Resources์๋ Route53HostedZone์ด๋ผ๋ ๋ฆฌ์์ค๊ฐ ์กด์ฌํ๋๋ฐ ์ ์ญ์ ๊ฐ ๋์ง ์์์ง๋ ์๋ฌธ์ด๋ค. ๊ณต์ Github: config-example์ ์ฐธ๊ณ ํด config.yaml ํ์ผ์ ์๋์ ๊ฐ์ด ํ๊ฒ์ ์ง์ ํ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ์๋๋ฐ๋ ์ญ์ ํ ๋ฆฌ์์ค๊ฐ ์๋ค๋ ์ถ๋ ฅ์ด ๋์ Route53์ hosted zone์ ์๋์ผ๋ก ์ญ์ ํด์ฃผ์๋ค.
resource-types:
targets:
- Route53HostedZone
๐ก ๋๋ ์
์๋์ผ๋ก Route53์ ์ญ์ ํด์ฃผ๊ธด ํ์ง๋ง, ๋ช ๋ น์ด ํ๋๋ก AWS Account ๋ด ์์๋ค์ ์ผ๊ด๋ก ์ญ์ ํ ์ ์์ด ๋๋ฌด ํธ๋ฆฌํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํํธ์ผ๋ก๋ ์ํํ ํด์ด๊ธฐ๋ ํ์ง๋ง, ๊ณ์ ํด์ง๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋ ์ข ์ข aws-nuke๋ฅผ ์ด์ฉํ ๊ฒ ๊ฐ๋ค.
๐ ์ฐธ๊ณ ๋งํฌ
- AWS Docs: Automate deletion of AWS resources by using aws-nuke
- Github: aws-nuke
- ๊ธฐ์ ๋ธ๋ก๊ทธ: [AWS] aws-nuke๋ก ๋ฆฌ์์ค ์ผ๊ด์ญ์