Google Cloud BigQuery 설정
본 가이드에서는 BigQuery를 사용하여 앞서 설정한 데이터 세트의 데이터를 일정한 주기로 GCS에 내보낼 수 있도록 설정하는 방법을 안내합니다.
서비스 계정 생성 및 역할 할당
- GCS와 BigQuery를 사용할 프로젝트가 올바른지 확인합니다.
- 서비스 계정 생성을 클릭합니다.
- 서비스 계정 이름(예: billing_bigquery_export_account)을 입력합니다. 식별하기 쉬운 이름으로 지정하는 것이 좋습니다.
- 완료를 클릭합니다.
왼쪽 상단의 탐색 메뉴(☰)에서 ‘IAM 및 관리자’ > ‘역할’을 선택합니다.
- 필터에 생성한 서비스 계정의 이름(billing_bigquery_export_account)을 입력합니다.
- 검색된 서비스 계정을 클릭합니다.
- 권한 탭으로 이동합니다.
- 권한 제어 버튼을 클릭하여 우측 사이드바를 활성화합니다.
- 다음 3개 역할(BigQuery 데이터 뷰어, BigQuery 작업 사용자, 저장소 개체 관리자)을 추가합니다.
BigQuery 데이터 뷰어 (BigQuery Data Viewer)
- bigquery.tables.get
- bigquery.tables.getData
BigQuery 작업 사용자 (BigQuery Job User)
- bigquery.jobs.create
저장소 개체 관리자 (Storage Object Admin)
- storage.objects.create
- storage.objects.list
- storage.objects.delete
GCS 버킷 생성
왼쪽 상단의 탐색 메뉴(☰)에서 ‘클라우드 스토리지’ > ‘버킷’을 선택합니다.
- 상단에서 프로젝트 선택을 확인 후 생성을 클릭합니다.
- 버킷 이름을 기입합니다.
- 글로벌 접근 방지가 활성화되어 있는지 확인합니다.
- 생성을 눌러 완료합니다.
예약 쿼리 생성
- 왼쪽 상단의 탐색 메뉴(☰)에서 ‘BigQuery’ > ‘예약 쿼리’를 선택합니다.
- 상단 프로젝트를 확인하고 예약 쿼리 생성을 클릭합니다.
- 하단의 일반 비용 , 조정 금액 쿼리를 지침에 따라 적절히 수정하여 스케줄을 두 개 생성합니다. 스케줄은 두 개지만 월별 파일은 동일한 패턴으로 덮어쓰기됩니다.
- 실행하여 쿼리가 정상적으로 실행되는지 확인합니다.
- 상단 도구에서 “스케줄"을 선택합니다.
쿼리는 다음 파일 트리를 생성합니다.
- billing_data_YYYYMM-*.parquet
일반 비용과 조정 금액
일반 비용과 조정 금액은 수집 주기
, 데이터 특성
, 업데이트 시점
, 그리고 최종 비용 산정 방식
에 차이가 있습니다.
일반 비용
은 매일 집계되는 표준 사용량 기반의 비용 데이터로, 확정되지 않은 잠정적인 금액입니다. GCP 서비스 사용량이 발생하면 거의 실시간으로 집계되어 매일 데이터세트에 추가되며, 이 단계의 비용은 아직 할인이 적용되거나 최종 확정되지 않은 금액입니다.조정 금액
은 월이 마감된 후 최종 청구 금액을 확정하기 위해 반영되는 모든 변동 사항으로, 크레딧, 프로모션, 세금 등 월말에 최종적으로 반영되는 모든 항목이 포함됩니다. 일반적으로 해당 월의 데이터는 다음 달 초에 확정되며, 이러한 조정은 양수(+) 또는 음수(-)의 형태로 나타날 수 있습니다.
예약쿼리 SQL 1. 일반 비용
SQL CODE
일반적인 사용 금액에 대한 내보내기를 수행하는 쿼리입니다.
다음 항목들을 적절히 기입합니다.
- GCS_BUCKET
- PROJECT_ID
- DATA_SET_ID
-- run_date 변수 선언: DATE 타입이며, 기본값으로 어제 날짜를 설정합니다.
-- 이 날짜는 데이터 조회 기간의 종료일 및 파일 경로 생성의 기준이 됩니다.
DECLARE run_date DATE DEFAULT DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY);
-- start_of_month 변수 선언: DATE 타입이며, 'run_date'(어제)가 속한 달의 시작일(1일)을 설정합니다.
-- 예: 오늘이 2025년 9월 4일이면, run_date는 9월 3일이고, start_of_month는 9월 1일이 됩니다.
DECLARE start_of_month DATE DEFAULT DATE_TRUNC(run_date, MONTH);
-- EXPORT DATA 구문: 쿼리 결과를 Google Cloud Storage(GCS)로 내보냅니다.
EXPORT DATA OPTIONS(
-- uri: 데이터가 저장될 GCS 경로와 파일명을 지정합니다.
-- 경로는 'run_date'(어제)의 연도와 월을 기준으로 동적으로 생성됩니다.
uri=CONCAT(
'gs://{GCS_BUCKET}/{PROJECT_ID}/',
FORMAT_DATE('%Y/%m', run_date), -- 'YYYY/MM' 형식의 폴더 경로 (어제 기준)
'/billing_data_',
FORMAT_DATE('%Y%m', run_date), -- 'YYYYMM' 형식의 파일명 일부 (어제 기준)
'-*.parquet'
),
format='PARQUET', -- 파일 형식은 Parquet
compression='GZIP', -- 압축 방식은 GZIP
overwrite=true -- 기존 파일 덮어쓰기 허용
) AS
-- AS 이하의 SELECT 쿼리 결과를 내보냅니다.
SELECT *
FROM `{DATA_SET_ID}`
WHERE
-- _PARTITIONTIME을 기준으로 '이달 1일'부터 '어제'까지의 데이터 파티션만 스캔합니다.
-- 이를 통해 쿼리 성능을 높이고 비용을 절감합니다.
DATE(_PARTITIONTIME) BETWEEN start_of_month AND run_date
-- invoice.month 필드가 '어제'가 속한 월('YYYYMM' 형식)과 일치하는 데이터만 필터링합니다.
-- 예: run_date가 2025-09-03 이면, invoice.month가 '202509'인 데이터만 선택됩니다.
AND invoice.month = FORMAT_DATE('%Y%m', run_date);
예약 쿼리 SQL 2. 조정 금액
SQL CODE
조정 금액에 대한 사용 금액 내보내기를 수행하는 쿼리입니다.
다음 항목들을 적절히 기입합니다.
- GCS_BUCKET
- PROJECT_ID
- DATA_SET_ID
-- run_date 변수 선언: DATE 타입이며, 기본값으로 어제 날짜를 설정합니다.
-- CURRENT_DATE()는 오늘 날짜를 반환하며, INTERVAL 1 DAY를 빼서 어제를 계산합니다.
DECLARE run_date DATE DEFAULT DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY);
-- prev_month_start 변수 선언: DATE 타입이며, 기본값으로 지난달의 시작일(1일)을 설정합니다.
-- 예: 오늘이 2025년 9월 4일이라면, (1) CURRENT_DATE()에서 한 달을 빼고 (2025년 8월 4일),
-- (2) DATE_TRUNC 함수를 사용해 해당 월의 첫 날(2025년 8월 1일)로 변환합니다.
DECLARE prev_month_start DATE DEFAULT DATE_TRUNC(DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH), MONTH);
-- EXPORT DATA 구문: 쿼리 결과를 Google Cloud Storage(GCS)로 내보냅니다.
EXPORT DATA OPTIONS(
-- uri: 데이터가 저장될 GCS 경로와 파일명을 지정합니다.
-- CONCAT 함수를 사용하여 동적으로 경로를 생성합니다.
uri=CONCAT(
'gs://{GCS_BUCKET}/{PROJECT_ID}/',
FORMAT_DATE('%Y/%m', prev_month_start), -- 'YYYY/MM' 형식의 폴더 경로 생성
'/billing_data_',
FORMAT_DATE('%Y%m', prev_month_start), -- 'YYYYMM' 형식의 파일명 일부 생성
'-*.parquet' -- BigQuery가 여러 파일로 분할하여 내보낼 수 있음을 나타내는 와일드카드(*)
),
format='PARQUET', -- 파일 형식은 Parquet으로 지정
compression='GZIP', -- 압축 방식은 GZIP으로 지정
overwrite=true -- 동일한 이름의 파일이 이미 존재할 경우 덮어쓰기 설정
) AS
-- AS 이하의 SELECT 쿼리 결과를 내보냅니다.
SELECT * -- 모든 열을 선택합니다.
FROM `{DATA_SET_ID}` -- 대상이 되는 GCP 결제 데이터 테이블
WHERE
-- _PARTITIONTIME은 파티션된 테이블의 파티션 날짜를 의미합니다.
-- 이 조건을 사용하면 스캔하는 데이터 양을 줄여 쿼리 비용을 절감하고 성능을 높일 수 있습니다.
-- 여기서는 '지난달 1일'부터 '어제'까지의 데이터 파티션만 스캔하도록 제한합니다.
DATE(_PARTITIONTIME) BETWEEN prev_month_start AND run_date
-- invoice.month 필드가 '지난달'과 일치하는 데이터만 필터링합니다.
-- _PARTITIONTIME 필터링과 함께 사용하여 정확히 지난달의 청구 데이터만 추출합니다.
AND invoice.month = FORMAT_DATE('%Y%m', prev_month_start);
DATA_SET_ID
DATA_SET_ID는 이전 Google Cloud Billing export 설정
단계에서 정상적으로 데이터 세트가 생성된 후 획득할 수 있습니다.
- 왼쪽 상단의 탐색 메뉴(☰)에서 ‘BigQuery’ > ‘Studio’을 선택합니다.
- 생성된 데이터 세트를 펼쳐 존재하는 세트의 옵션에서 ID 복사를 수행합니다.
- 다음 형식의 ID를 획들할 수 있습니다.
{PROJECT_ID}.{DATA_SET_NAME}.gcp_billing_export_v1_XXXXXX_XXXXXX_XXXXXX
GCS_BUCKET
GCS_BUCKET은 이전 GCS 버킷 생성 단계에서 정상적으로 버킷을 생성한 후 획득할 수 있습니다.
- 왼쪽 상단의 탐색 메뉴(☰)에서 Cloud Storage > ‘Bucket’을 선택합니다.
- GCS 버킷 생성 단계에서 정상적으로 버킷을 선택합니다.
- 경로 옆 복사 아이콘을 클릭하여 경로를 복사합니다.
- 다음 버킷 이름을 복사할 수 있습니다.
test_billing_data
예약 쿼리 스케줄 설정
- 실행된 스케줄러의 이름을 입력합니다.
- 스케줄 옵션을 입력합니다.
- 일정 옵션을 설정합니다.
- 예약 쿼리 1: 일반적인 사용 금액에 대한 내보내기
매일 UTC 23시 실행
(실행 시간은 플러그인 설정을 참고)- days / 23:00 / Start now / End never
- 예약 쿼리 2: 조정 금액에 대한 사용 금액 내보내기
매월 1-10일 UTC 23시 실행
(실행 시간은 플러그인 설정을 참고)- Months / 1,2,3,4,5,6,7,8,9,10 / 23:00 / Start now / End never
- 예약 쿼리 1: 일반적인 사용 금액에 대한 내보내기
- 실행 주체를 서비스 계정 생성 및 역할 할당 에서 생성한 서비스 계정으로 입력합니다.
- 저장 버튼을 눌러 완료합니다.
실행 확인
- 좌측 사이드바 메뉴에서 스케줄 쿼리로 이동합니다.
- 화면에서 생성한 스케줄러의 정상 작동을 확인합니다.
- 생성된 스케줄러는 최초 1회 자동으로 실행됩니다.
- 정상적으로 작동하지 않는다면, 해당 스케줄러를 클릭하여 오류 내용을 확인하거나 수정할 수 있습니다.
실행 경과 확인
일반 사용 금액은 매일 실행되어 월별로 누적 데이터를 수집하며, 조정 금액은 월 마감 후 다음 달 초에 이전 달 데이터를 수집합니다. 데이터는 연도/월/일별로 체계적으로 정리되어 있어 분석이 용이하며, 일반 사용 금액은 거의 실시간으로 업데이트되고 조정 금액은 월 단위로 업데이트됩니다.
수집 기간: 2025년 8월 11일부터 10월 15일까지 (약 3개월간)
- billing_data_202508-000000.parquet
- billing_data_202508-000001.parquet
- billing_data_202508-NNNNNN.parquet
- billing_data_202509-000000.parquet
- billing_data_202509-000001.parquet
- billing_data_202509-NNNNNN.parquet
- billing_data_202510-000000.parquet
- billing_data_202510-NNNNNN.parquet
예약 쿼리 1 (일반 사용 금액):
- 실행 주기: 매일 UTC 23:00에 실행
- 데이터 범위: 해당 월 1일부터 실행 전날까지의 사용량 데이터
- 수집 결과:
- 8월: 8월 11일 ~ 31일 실행으로 8월 1일 ~ 30일 데이터 수집
- 9월: 9월 1일 ~ 30일 실행으로 9월 1일 ~ 30일 데이터 수집
- 10월: 10월 1일 ~ 15일 실행으로 10월 1일 ~ 14일 데이터 수집
예약 쿼리 2 (조정 금액):
- 실행 주기: 매월 1일부터 10일까지 UTC 23:00에 실행
- 데이터 범위: 이전 달의 조정 데이터 (크레딧, 할인, 세금 등)
- 수집 결과:
- 8월 조정 데이터: 9월 1-10일에 실행하여 수집 완료
- 9월 조정 데이터: 10월 1-10일에 실행하여 수집 완료
- 10월 조정 데이터: 11월 1-10일에 실행 예정 (아직 수집되지 않음)