# ============================================================ # AWS 전체 리소스 점검 및 삭제 통합 스크립트 # 사용법: 메뉴에서 실행할 항목을 선택하세요 # ⚠ 삭제 작업은 테스트 계정에서만 사용하세요! # ============================================================ function Show-Menu { Clear-Host Write-Host "=============================================" -ForegroundColor Cyan Write-Host " AWS 리소스 관리 통합 스크립트" -ForegroundColor Cyan Write-Host "=============================================" -ForegroundColor Cyan Write-Host "" Write-Host " [1] 전체 리전 리소스 점검" Write-Host " [2] 글로벌 서비스 점검 (S3, IAM, Route53 등)" Write-Host " [3] 전체 리소스 삭제 🚨 (테스트 계정 전용)" Write-Host " [Q] 종료" Write-Host "" Write-Host "=============================================" -ForegroundColor Cyan } # ============================================================ # 실행 1: 전체 리전 리소스 점검 # ============================================================ function Invoke-RegionCheck { Write-Host "`n🔍 AWS 전체 리전 리소스 점검 시작" -ForegroundColor Cyan Write-Host "=================================" $regions = (aws ec2 describe-regions --query "Regions[].RegionName" --output text).Split("`t") foreach ($region in $regions) { Write-Host "`n📍 Region: $region" -ForegroundColor Yellow Write-Host "-----------------------------" # EC2 $ec2 = aws ec2 describe-instances --region $region --query "Reservations[].Instances[].InstanceId" --output text if ($ec2) { Write-Host "⚠ EC2 Instances: $ec2" -ForegroundColor Yellow } # EBS (Available - 비연결 상태) $ebs = aws ec2 describe-volumes --region $region --query "Volumes[?State=='available'].VolumeId" --output text if ($ebs) { Write-Host "⚠ Detached EBS: $ebs" -ForegroundColor Red } # Elastic IP $eip = aws ec2 describe-addresses --region $region --query "Addresses[].PublicIp" --output text if ($eip) { Write-Host "⚠ Elastic IPs: $eip" -ForegroundColor Yellow } # NAT Gateway (고과금 주의) $nat = aws ec2 describe-nat-gateways --region $region --query "NatGateways[?State=='available'].NatGatewayId" --output text if ($nat) { Write-Host "🚨 NAT Gateway (고과금): $nat" -ForegroundColor Magenta } # RDS $rds = aws rds describe-db-instances --region $region --query "DBInstances[].DBInstanceIdentifier" --output text if ($rds) { Write-Host "⚠ RDS Instances: $rds" -ForegroundColor Yellow } # AMI (자체 소유) $amis = aws ec2 describe-images --region $region --owners self ` --query "Images[].ImageId" --output text if ($amis) { Write-Host "⚠ AMIs (자체 소유): $amis" -ForegroundColor Yellow } # EBS 스냅샷 (자체 소유) $snaps = aws ec2 describe-snapshots --region $region --owner-ids self ` --query "Snapshots[].SnapshotId" --output text if ($snaps) { Write-Host "⚠ Snapshots (자체 소유): $snaps" -ForegroundColor Yellow } } Write-Host "`n=================================" Write-Host "✅ 전체 리전 점검 완료" -ForegroundColor Green Pause } # ============================================================ # 실행 2: 글로벌 서비스 점검 # ============================================================ function Invoke-GlobalCheck { Write-Host "`n🌐 Global Services Check" -ForegroundColor Cyan Write-Host "========================" # S3 Buckets $s3 = aws s3 ls if ($s3) { Write-Host "⚠ S3 버킷 존재:" -ForegroundColor Yellow $s3 } else { Write-Host "ℹ S3 버킷 없음" -ForegroundColor Gray } # CloudTrail $trails = aws cloudtrail describe-trails --query "trailList[].Name" --output text if ($trails) { Write-Host "⚠ CloudTrail Trails: $trails" -ForegroundColor Yellow } else { Write-Host "ℹ 활성화된 CloudTrail이 없습니다." -ForegroundColor Gray } # IAM Users $users = aws iam list-users --query "Users[].UserName" --output text if ($users) { Write-Host "⚠ IAM Users: $users" -ForegroundColor Yellow } # Route53 $zones = aws route53 list-hosted-zones --query "HostedZones[].Name" --output text if ($zones) { Write-Host "⚠ Route53 Hosted Zones: $zones" -ForegroundColor Yellow } Write-Host "`n✅ 글로벌 리소스 점검 완료" -ForegroundColor Green Pause } # ============================================================ # 실행 3: 전체 리소스 삭제 (테스트 계정 전용) # ============================================================ function Invoke-ResourceDelete { Write-Host "`n🚨 [위험] AWS 전체 리소스 자동 삭제 스크립트" -ForegroundColor Red Write-Host "이 작업은 되돌릴 수 없으며 모든 데이터가 삭제됩니다." -ForegroundColor Yellow $confirm = Read-Host "정말 실행하려면 'YES'를 입력하세요" if ($confirm -ne "YES") { Write-Host "❌ 취소되었습니다." -ForegroundColor Green Pause return } $regions = (aws ec2 describe-regions --query "Regions[].RegionName" --output text).Split("`t") foreach ($region in $regions) { Write-Host "`n🔥 Region: $region 에서 삭제 작업 시작..." -ForegroundColor Magenta Write-Host "-------------------------------------------" # 1. EC2 인스턴스 종료 $ids = aws ec2 describe-instances --region $region --query "Reservations[].Instances[].InstanceId" --output text if ($ids) { Write-Host "Terminating EC2: $ids" aws ec2 terminate-instances --region $region --instance-ids ($ids.Split("`t")) } # 2. Auto Scaling Group 삭제 $asgs = aws autoscaling describe-auto-scaling-groups --region $region --query "AutoScalingGroups[].AutoScalingGroupName" --output text foreach ($asg in $asgs.Split("`t")) { if ($asg) { Write-Host "Deleting ASG: $asg" aws autoscaling update-auto-scaling-group --region $region --auto-scaling-group-name $asg --min-size 0 --max-size 0 --desired-capacity 0 aws autoscaling delete-auto-scaling-group --region $region --auto-scaling-group-name $asg --force-delete } } # 3. NAT Gateway 삭제 $nats = aws ec2 describe-nat-gateways --region $region --query "NatGateways[?State=='available'].NatGatewayId" --output text foreach ($nat in $nats.Split("`t")) { if ($nat) { Write-Host "Deleting NAT Gateway: $nat" aws ec2 delete-nat-gateway --region $region --nat-gateway-id $nat } } # 4. Load Balancer 삭제 $lbs = aws elbv2 describe-load-balancers --region $region --query "LoadBalancers[].LoadBalancerArn" --output text foreach ($lb in $lbs.Split("`t")) { if ($lb) { Write-Host "Deleting Load Balancer: $lb" aws elbv2 delete-load-balancer --region $region --load-balancer-arn $lb } } # 5. RDS 삭제 (최종 스냅샷 미생성) $rdsList = aws rds describe-db-instances --region $region --query "DBInstances[].DBInstanceIdentifier" --output text foreach ($db in $rdsList.Split("`t")) { if ($db) { Write-Host "Deleting RDS: $db" aws rds delete-db-instance --region $region --db-instance-identifier $db --skip-final-snapshot --delete-automated-backups } } # 6. Elastic IP 해제 $eips = aws ec2 describe-addresses --region $region --query "Addresses[].AllocationId" --output text foreach ($eip in $eips.Split("`t")) { if ($eip) { Write-Host "Releasing EIP: $eip" aws ec2 release-address --region $region --allocation-id $eip } } # 7. Lambda 삭제 $funcs = aws lambda list-functions --region $region --query "Functions[].FunctionName" --output text foreach ($func in $funcs.Split("`t")) { if ($func) { Write-Host "Deleting Lambda: $func" aws lambda delete-function --region $region --function-name $func } } # 8. AMI 등록 해제 + 연결 스냅샷 삭제 $amis = aws ec2 describe-images --region $region --owners self ` --query "Images[].ImageId" --output text foreach ($ami in $amis.Split("`t")) { if ($ami) { Write-Host "Deregistering AMI: $ami" # AMI에 연결된 스냅샷 ID 수집 $snapshots = aws ec2 describe-images --region $region --image-ids $ami ` --query "Images[].BlockDeviceMappings[].Ebs.SnapshotId" --output text # AMI 등록 해제 aws ec2 deregister-image --region $region --image-id $ami # 연결된 스냅샷 삭제 foreach ($snap in $snapshots.Split("`t")) { if ($snap) { Write-Host " └ Deleting Snapshot: $snap" aws ec2 delete-snapshot --region $region --snapshot-id $snap } } } } # 9. AMI 없이 남은 고아 스냅샷 삭제 $orphanSnaps = aws ec2 describe-snapshots --region $region --owner-ids self ` --query "Snapshots[].SnapshotId" --output text foreach ($snap in $orphanSnaps.Split("`t")) { if ($snap) { Write-Host "Deleting orphan Snapshot: $snap" aws ec2 delete-snapshot --region $region --snapshot-id $snap } } } Write-Host "`n=================================" Write-Host "✅ 모든 삭제 명령이 전송되었습니다." -ForegroundColor Green Pause } # ============================================================ # 메인 루프 # ============================================================ do { Show-Menu $choice = Read-Host "선택" switch ($choice.ToUpper()) { "1" { Invoke-RegionCheck } "2" { Invoke-GlobalCheck } "3" { Invoke-ResourceDelete } "Q" { Write-Host "종료합니다." -ForegroundColor Cyan; exit } default { Write-Host "잘못된 입력입니다. 다시 선택하세요." -ForegroundColor Red; Start-Sleep -Seconds 1 } } } while ($true)