Google Cloud BigQuery 설정

본 가이드에서는 BigQuery를 사용하여 앞서 설정한 데이터 세트의 데이터를 일정한 주기로 GCS에 내보낼 수 있도록 설정하는 방법을 안내합니다.

서비스 계정 생성 및 역할 할당

ℹ️
서비스 계정을 생성하고 권한을 부여할 수 있는 충분한 권한(조직 관리자, 프로젝트 관리자)을 가진 사용자가 수행할 수 있습니다. 서비스 계정 권한 및 역할 설정 가이드는 다음 해당 가이드 문서를 참고하세요.

  1. GCS와 BigQuery를 사용할 프로젝트가 올바른지 확인합니다.
  2. 서비스 계정 생성을 클릭합니다.

  1. 서비스 계정 이름(예: billing_bigquery_export_account)을 입력합니다. 식별하기 쉬운 이름으로 지정하는 것이 좋습니다.
  2. 완료를 클릭합니다.

왼쪽 상단의 탐색 메뉴(☰)에서 ‘IAM 및 관리자’ > ‘역할’을 선택합니다.

  1. 필터에 생성한 서비스 계정의 이름(billing_bigquery_export_account)을 입력합니다.
  2. 검색된 서비스 계정을 클릭합니다.

  1. 권한 탭으로 이동합니다.
  2. 권한 제어 버튼을 클릭하여 우측 사이드바를 활성화합니다.
  3. 다음 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 버킷 생성

왼쪽 상단의 탐색 메뉴(☰)에서 ‘클라우드 스토리지’ > ‘버킷’을 선택합니다.

⚠️
Region은 BigQuery에서 설정한 데이터 세트의 Billing 정보 Region과 동일해야 합니다. 이전 단계 가이드 문서를 참고하세요.
  1. 상단에서 프로젝트 선택을 확인 후 생성을 클릭합니다.
  2. 버킷 이름을 기입합니다.
  3. 글로벌 접근 방지가 활성화되어 있는지 확인합니다.
  4. 생성을 눌러 완료합니다.

예약 쿼리 생성

  1. 왼쪽 상단의 탐색 메뉴(☰)에서 ‘BigQuery’ > ‘예약 쿼리’를 선택합니다.
  2. 상단 프로젝트를 확인하고 예약 쿼리 생성을 클릭합니다.

  1. 하단의 일반 비용 , 조정 금액 쿼리를 지침에 따라 적절히 수정하여 스케줄을 두 개 생성합니다. 스케줄은 두 개지만 월별 파일은 동일한 패턴으로 덮어쓰기됩니다.
  2. 실행하여 쿼리가 정상적으로 실행되는지 확인합니다.
  3. 상단 도구에서 “스케줄"을 선택합니다.

쿼리는 다음 파일 트리를 생성합니다.

            • billing_data_YYYYMM-*.parquet
  • 일반 비용과 조정 금액

    일반 비용과 조정 금액은 수집 주기, 데이터 특성, 업데이트 시점, 그리고 최종 비용 산정 방식에 차이가 있습니다.

    • 일반 비용은 매일 집계되는 표준 사용량 기반의 비용 데이터로, 확정되지 않은 잠정적인 금액입니다. GCP 서비스 사용량이 발생하면 거의 실시간으로 집계되어 매일 데이터세트에 추가되며, 이 단계의 비용은 아직 할인이 적용되거나 최종 확정되지 않은 금액입니다.

    • 조정 금액은 월이 마감된 후 최종 청구 금액을 확정하기 위해 반영되는 모든 변동 사항으로, 크레딧, 프로모션, 세금 등 월말에 최종적으로 반영되는 모든 항목이 포함됩니다. 일반적으로 해당 월의 데이터는 다음 달 초에 확정되며, 이러한 조정은 양수(+) 또는 음수(-)의 형태로 나타날 수 있습니다.

    예약쿼리 SQL 1. 일반 비용

    SQL CODE

    일반적인 사용 금액에 대한 내보내기를 수행하는 쿼리입니다.

    다음 항목들을 적절히 기입합니다.

    -- 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

    조정 금액에 대한 사용 금액 내보내기를 수행하는 쿼리입니다.

    다음 항목들을 적절히 기입합니다.

    -- 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개씩 총 2개를 생성해야 합니다.
    1. 실행된 스케줄러의 이름을 입력합니다.
    2. 스케줄 옵션을 입력합니다.
    3. 일정 옵션을 설정합니다.
      • 예약 쿼리 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
    4. 실행 주체를 서비스 계정 생성 및 역할 할당 에서 생성한 서비스 계정으로 입력합니다.
    5. 저장 버튼을 눌러 완료합니다.

    실행 확인

    1. 좌측 사이드바 메뉴에서 스케줄 쿼리로 이동합니다.
    2. 화면에서 생성한 스케줄러의 정상 작동을 확인합니다.
      • 생성된 스케줄러는 최초 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일에 실행 예정 (아직 수집되지 않음)