Cloud/GCP

GCP 프로젝트의 VPC 와 종속된 리소스 삭제 스크립트

달빛궁전- 2025. 9. 18. 17:23
GCP 테스트시 많은 VPC와 그에 종석되는 방화벽, 경로, 서브넷등을 만들게 됩니다.
그냥 프로젝트를 닫아도 되지만, 남겨두어야할 일도 있습니다.
쉘스크립트와 gcloud명령을 조합하여, GCP VPC관련 리소스를 삭제하는 스크립트를 작성하였습니다.

#!/bin/bash

# 프로젝트 내 모든 VPC 네트워크 및 관련 리소스 일괄 삭제 스크립트 (default 네트워크 제외)
# 매우 위험하므로 충분히 숙지 후 사용 요망
# 절대 운영 환경에서 사용 금지!

# 색상 코드
RED='\033[0;31m'
YELLOW='\033[1;33m'
GREEN='\033[0;32m'
NC='\033[0m' # No Color

# Bash 버전 확인 (Associative array 사용 위해 4 이상 필요)
if (( BASH_VERSINFO[0] < 4 )); then
    echo -e "${RED}오류: 이 스크립트는 Bash 4 이상이 필요합니다. 현재 버전: ${BASH_VERSION}${NC}"
    exit 1
fi

# 사용자로부터 프로젝트 ID 입력받기
read -p "모든 VPC를 삭제할 GCP 프로젝트 ID를 입력하세요: " PROJECT_ID
if [[ -z "$PROJECT_ID" ]]; then
  echo -e "${RED}오류: 프로젝트 ID가 입력되지 않았습니다.${NC}"
  exit 1
fi

# 최종 경고 및 실행 전 대기
echo -e "\n${RED}!!!!!!!!!!!!!!!!!!!!! 최종 경고 !!!!!!!!!!!!!!!!!!!!!"
echo -e "프로젝트 '${PROJECT_ID}' 내 'default' VPC를 제외한 모든 VPC와"
echo -e "${RED}관련 리소스(인스턴스, 방화벽, 경로 등)를 즉시 삭제합니다.${NC}"
echo -e "이 작업은 되돌릴 수 없으며 서비스 중단을 초래할 수 있습니다."
echo -e "운영 환경에서는 절대 실행하지 마십시오."
echo -e "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!${NC}"
echo -e "\n${YELLOW}5초 후 삭제 작업이 시작됩니다. 중단하려면 Ctrl+C를 누르세요.${NC}"
for i in {5..1}; do
  echo "$i..."
  sleep 1
done
echo -e "${RED}삭제 작업을 시작합니다!${NC}"

# 프로젝트 내 모든 VPC 목록 조회
echo -e "\n${YELLOW}프로젝트 '${PROJECT_ID}'의 VPC 네트워크 목록 조회 중...${NC}"
ALL_VPC_NAMES=$(gcloud compute networks list --project="$PROJECT_ID" --format='value(name)' 2>/dev/null)
if [[ -z "$ALL_VPC_NAMES" ]]; then
  echo -e "${GREEN}삭제할 VPC 네트워크가 없습니다.${NC}"
  exit 0
fi

total_deleted_vpcs=0
total_failed_vpcs=0

for VPC_NAME in $ALL_VPC_NAMES; do
  if [[ "$VPC_NAME" == "default" ]]; then
    echo -e "\n${GREEN}--- 'default' VPC는 건너뜁니다 ---${NC}"
    continue
  fi

  echo -e "\n${YELLOW}===== '${VPC_NAME}' VPC 삭제 작업 시작 =====${NC}"

  # 리소스 집합 초기화
  declare -a SUBNET_NAMES=()
  declare -a SUBNET_REGIONS=()
  declare -a SUBNET_URLS=()
  declare -a INSTANCES=()
  declare -a TEMPLATES=()
  declare -a REGIONAL_FW_RULES=()
  declare -a GLOBAL_FW_RULES=()
  declare -a ROUTERS=()
  declare -a ROUTES=()
  declare -a FIREWALLS=()
  declare -a PEERINGS=()
  declare -a resources_to_delete=()
  declare -A regions_map
  delete_failed=0

  # VPC URL 조회
  VPC_URL=$(gcloud compute networks describe "$VPC_NAME" --project="$PROJECT_ID" --format='value(selfLink)' 2>/dev/null)
  if [[ -z "$VPC_URL" ]]; then
    echo -e "${RED}VPC '${VPC_NAME}'을 찾을 수 없습니다. 넘어갑니다.${NC}"
    ((total_failed_vpcs++))
    continue
  fi

  # 서브넷 조회
  subnet_output=$(gcloud compute networks subnets list --project="$PROJECT_ID" --filter="network=$VPC_URL" --format="value(name,region,selfLink)" 2>/dev/null)
  if [[ -n "$subnet_output" ]]; then
    while IFS=$'\t' read -r name region url; do
      [[ -z "$name" ]] && continue
      SUBNET_NAMES+=("$name")
      SUBNET_REGIONS+=("$(basename "$region")")
      SUBNET_URLS+=("$url")
    done <<< "$subnet_output"
  fi

  # VM 인스턴스, 템플릿, 전달 규칙, 라우터, 경로, 방화벽, 피어링, 서브넷 등 리소스 조회 및 삭제 대상 목록 생성

  # 삭제 실행 함수 정의
  delete_gcp_resource_no_confirm() {
    local label=$1
    local gcloud_type=$2
    local name=$3
    local project=$4
    local region_flag=$5

    echo -e "  ${YELLOW}삭제: ${label} '${name}'${NC}"
    local cmd="gcloud compute ${gcloud_type} delete ${name} --project=${project} ${region_flag} --quiet"
    echo "    실행: $cmd"
    eval "$cmd"
    local code=$?
    if (( code != 0 )); then
      echo -e "    ${RED}삭제 실패: ${label} '${name}' (코드: $code)${NC}"
      return 1
    else
      echo -e "    ${GREEN}삭제 성공: ${label} '${name}'${NC}"
      return 0
    fi
  }

  # 실제 리소스 삭제 순서 실행

  # VPC 삭제
  if (( delete_failed == 0 )); then
    echo -e "\n${YELLOW}--- '${VPC_NAME}' VPC 네트워크 삭제 ---${NC}"
    cmd="gcloud compute networks delete ${VPC_NAME} --project=${PROJECT_ID} --quiet"
    echo "  실행: $cmd"
    eval "$cmd"
    if (( $? != 0 )); then
      echo -e "${RED}VPC '${VPC_NAME}' 삭제 실패.${NC}"
      ((total_failed_vpcs++))
    else
      echo -e "${GREEN}VPC '${VPC_NAME}' 삭제 성공.${NC}"
      ((total_deleted_vpcs++))
    fi
  else
    echo -e "${RED}리소스 삭제 실패로 '${VPC_NAME}' VPC 삭제 건너뜀.${NC}"
    ((total_failed_vpcs++))
  fi

  echo -e "\n${YELLOW}--- '${VPC_NAME}' 작업 완료 ---${NC}"

done

echo -e "\n========================"
echo -e "${GREEN}모든 VPC 삭제 작업 완료${NC}"
echo -e " - 삭제 성공: ${total_deleted_vpcs}"
echo -e " - 실패 또는 건너뜀: ${total_failed_vpcs}"
echo -e "========================"
echo -e "\n스크립트 종료."