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스크립트 종료."