What Nobody Is Using in Your Google Cloud Projects, and What It Costs
Google Cloud 프로젝트에서 쓰지 않는 리소스와 그 비용을 찾는 방법
zombiescan은 Google Cloud의 20종 유휴 리소스를 읽기 전용으로 검사하고, Cloud Billing Catalog 가격을 적용해 프로젝트별 월 비용을 산출하는 도구입니다. 작성자는 75개 프로젝트에서 79초 동안 713건을 찾아 월 387.74달러의 낭비를 추정했으며, 가격 기준과 권한·탐지 범위의 한계도 설명합니다.
- 주제
AI 요약
Persistent Disk는 인스턴스를 지운 뒤에도 남고, 정적 IP와 GKE 클러스터도 쓰임이 사라진 뒤 비용을 청구할 수 있습니다. Google Cloud Billing 콘솔은 전체 지출을 보여주고 Recommender는 정리 후보를 제시하지만, 이 글은 개별 리소스와 프로젝트를 짚어 월 비용까지 계산하는 오픈소스 도구 zombiescan을 소개합니다.
설치와 인증
zombiescan은 Python 3.11 이상과 uv를 사용하며, Google Cloud Application Default Credentials(ADC)로 인증합니다. gcloud auth application-default login으로 로그인하면 별도 키 파일이나 서비스 계정을 만들 필요가 없습니다. 기본 검사는 읽기 전용이며 모든 호출은 목록 조회나 단건 조회입니다. 스캔 코드에는 리소스를 삭제·변경·해제하는 경로가 없습니다.
여러 작업 스레드가 인증 정보를 공유할 때 토큰 갱신이 동시에 일어나 프로세스가 종료되는 문제를 막기 위해, 토큰을 스레드 시작 전에 받아두고 갱신 작업은 잠금으로 직렬화합니다. 프로젝트별로 각 검사를 한 번 실행합니다. Compute Engine의 aggregatedList가 여러 리전과 존의 리소스를 한 번에 조회하고, 다수 API는 locations/- 와일드카드로 모든 위치를 검색합니다. 이를 지원하지 않는 Cloud KMS와 Artifact Registry는 위치 목록을 조회한 뒤 병렬로 순회하며, 각 작업자에 별도 클라이언트를 할당합니다.
20개 검사와 가격 산정
검사는 두 팩으로 나뉩니다. core 팩에 19개, 별도 API와 가격 조회기가 필요한 GKE 팩에 1개가 들어갑니다. Compute Engine, Cloud SQL, Cloud Storage, Cloud DNS, KMS, Secret Manager, Artifact Registry, Filestore, Cloud Logging, Cloud Monitoring, GKE 등을 대상으로 미연결 디스크, 미사용 IP, 오래된 스냅샷, 중지된 인스턴스, 유휴 GKE 클러스터 등을 찾습니다. 검사별 API 선언에서 API 목록과 16개 권한으로 구성된 읽기 전용 사용자 지정 역할을 생성하며, 테스트는 검사에 필요한 API가 역할에서 빠지지 않았는지 확인합니다.
가격표는 Cloud Billing Catalog API에서 생성해 패키지에 포함합니다. 스캔은 이를 로컬에서 읽으므로 오프라인으로 동작하고, 실행 중 가격 조회 호출도 발생하지 않습니다. 보고서에는 가격표 생성 시각과 온디맨드 USD 목록 가격 기준을 기록합니다. 약정 사용 할인, 지속 사용 할인, 비공개 가격, 크레딧은 계산에서 제외합니다. 무료 가격 구간을 그대로 읽어 유료 리소스를 0달러로 오판하지 않도록, 가격 조회기는 첫 번째 유료 구간을 사용합니다. Cloud DNS처럼 구간별 가격이 다른 항목은 지정한 티어를 따로 선택합니다.
예를 들어 us-central1 기준으로 표준 Persistent Disk는 GB당 월 0.04달러, SSD는 0.17달러이며, 미사용 정적 IP는 시간당 0.010달러입니다. 월 730시간으로 환산하면 미사용 IP는 7.30달러, 전달 규칙은 최소 18.25달러, 노드가 없는 GKE 클러스터도 관리 비용으로 월 73달러가 듭니다. 일부 SKU는 전역 가격으로 게시되므로 지역별 요금이 없는 항목은 global 범위로 따로 처리합니다.
75개 프로젝트 스캔 결과
작성자는 75개 프로젝트에서 검사 20개씩, 총 1,500개 프로젝트·검사 조합을 살폈습니다. API가 활성화되지 않은 조합 411개는 건너뛰었고, 전체 실행에는 79초가 걸렸습니다. 713건이 발견됐으며 추정 낭비 비용은 월 387.74달러, 연 4,652.87달러였습니다. 미연결 디스크 36개가 월 153.53달러, 미사용 정적 IP 12개가 89.06달러, 미사용 이미지 64개가 75.25달러로 집계됐습니다.
발견 항목 713건 중 527건은 비용이 발생하지 않는 리소스였습니다. 비어 있는 VPC 네트워크, 수명 주기 규칙이 없는 버전 관리 버킷, 아무것도 매치하지 않는 방화벽 규칙, 미사용 서브넷, 삭제된 리소스를 감시하는 업타임 체크가 여기에 포함됩니다. 비용이 0이어도 계속 쌓이거나 삭제 작업을 막을 수 있어 보고서에 표시합니다. 권한이 없는 프로젝트 4곳에서는 검사 조합 42개가 추가로 건너뛰어졌으며, 비용 합계는 읽을 수 있었던 프로젝트만 반영합니다.
보고서와 정리 계획
결과는 콘솔 표, JSON, 자체 완결형 HTML로 출력합니다. JSON에는 검사 시각, 소요 시간, 조회한 프로젝트, 접근 불가 조합 수, 가격 기준과 합계가 담깁니다. 각 항목에는 리소스 ID, 위치, 발견 이유, 월 비용, 근사치 여부, 정리 명령과 세부 계산 정보가 들어갑니다. Artifact Registry 비용은 이미지 간 공유 레이어를 중복 계산할 수 있어 상한 추정치로 표시합니다.
--script는 정리용 셸 스크립트를 출력하지만 실행하지 않습니다. 명령마다 프로젝트를 지정하고 리소스 ID를 셸에 맞게 인용합니다. clean도 기본 동작은 미리보기입니다. --apply를 지정해야 계획된 작업을 Google Cloud에 전송합니다. 가능한 경우 삭제 전에 백업 단계를 두고, 단계가 실패하면 해당 발견 항목의 나머지 작업을 중단합니다. 복구 기간이 없는 작업은 IRREVERSIBLE로 표시합니다. 비어 있는 VPC 네트워크는 서브넷, 경로, 방화벽 규칙, Cloud Router, 피어링 등 연결된 리소스를 먼저 정리해야 하며 순서가 참조 관계에 따라 달라지므로 자동 정리 명령을 제공하지 않습니다.
적용 범위와 한계
가격은 목록 가격이며 실제 청구액과 다를 수 있습니다. Cloud SQL 연결 수나 KMS 감사 로그처럼 일정 기간의 지표를 봐야 하는 유휴 판정은 20개 검사 범위에 없습니다. 또한 검사를 건너뛴 API가 비활성화된 프로젝트에서는, 해당 API가 꺼지기 전에 남은 리소스를 확인할 수 없습니다. 검사기는 읽을 수 있는 프로젝트에서만 결과를 계산하며, 작성자는 이 도구가 보고하는 개별 비용을 빠르게 확인해야 하는 경우에 적합하다고 설명합니다. 문서에 실린 테스트는 오프라인 기록 응답을 사용해 실행했으며, 324개가 통과하고 실제 프로젝트를 조회하는 테스트 4개는 제외됐습니다.
dev.to 반응
- @compoundlabs — 스캐너는 API가 비활성화된 프로젝트와, API가 꺼져 있어 사용하지 않는 리소스가 보이지 않는 프로젝트를 어떻게 구분하나요? API를 건너뛰면 오류를 피할 수 있지만, 서비스를 끄기 전에 남겨둔 리소스도 숨길 수 있습니다.
원문: dev.to / 번역·요약: Trawling