비밀번호

커뮤니티2

  • 구름많음속초22.8박무북춘천22.8흐림철원23.2구름많음동두천23.8흐림파주22.2흐림대관령19.6흐림춘천22.7비백령도19.8흐림북강릉24.1구름많음강릉25.0흐림동해23.8비서울24.4비인천22.1흐림원주22.0구름많음울릉도23.4흐림수원23.4흐림영월21.2흐림충주23.1흐림서산24.4흐림울진24.1흐림청주24.3흐림대전23.6흐림추풍령21.0흐림안동21.8흐림상주21.1구름많음포항24.7흐림군산23.9구름많음대구23.7비전주24.3흐림울산24.2흐림창원25.3흐림광주24.4흐림부산24.8흐림통영24.6비목포25.5흐림여수24.7비흑산도24.1흐림완도24.8흐림고창23.9흐림순천21.2비홍성24.3흐림서청주23.1흐림제주26.8흐림고산25.8흐림성산27.3흐림서귀포27.3흐림진주24.0흐림강화21.4흐림양평22.8흐림이천22.6구름많음인제21.8흐림홍천22.1흐림태백20.5흐림정선군20.7흐림제천21.1흐림보은20.5흐림천안23.3흐림보령24.7흐림부여24.1흐림금산21.7흐림세종23.2흐림부안24.4흐림임실22.0흐림정읍25.1흐림남원22.8흐림장수21.8흐림고창군24.6흐림영광군23.7흐림김해시25.8흐림순창군23.3흐림북창원26.4흐림양산시26.0흐림보성군24.0흐림강진군24.7흐림장흥24.4흐림해남26.0흐림고흥24.4흐림의령군22.7흐림함양군21.3흐림광양시24.5흐림진도군25.5흐림봉화20.7흐림영주21.5흐림문경20.8흐림청송군20.5흐림영덕23.4흐림의성21.6흐림구미23.0흐림영천22.5흐림경주시23.8흐림거창21.1흐림합천23.0구름많음밀양25.7흐림산청21.8흐림거제25.2흐림남해25.5흐림북부산26.1
  • 2025.07.16(수)

데이터 엔지니어링데이터 엔지니어링

Big Query Export Notification 구축 방법

안녕하세요, GCP cloud function을 이용해 Big Query Export Notification(빅쿼리 내보내기 알림) 설정을 하는 방법에 대해 스터디 한 내용을 정리해보겠습니다. 


참고 문헌: https://ayudante.jp/column/2022-07-22/11-00/


[개요]

GA4 속성을 빅쿼리에 연결하여 내보내기를 사용할때, 전날의 데이터가 정확히 어느 시점에 빅쿼리로 내보내지는지는 알 수 없습니다. 빅쿼리 내보내기는 정해진 시간에 도착하지 않으며, 알림 메커니즘 또한 따로 존재하지 않습니다. 이를 위한 사용 가능한 대안 사항에는 크게 2가지가 있습니다.


1. 내보내기가 최소 x 시간 이후에는 도착할꺼라는 가정을 바탕으로 다운스트림 작업을 지연시키기

    - 내보내기가 예상보다 일찍 도착하면 작업이 더욱 지연되는 문제가 있습니다.

2. 내보내기가 도착 했는지 정기적으로 확인하기

    - 데이터 파이프라인이 복잡해지고, 데이터에 대한 접근이 늦어지는 문제가 있습니다.


따라서 GCP에서 제공하는 컴포넌트들을 활용하여 일련의 과정을 통해 솔루션을 구축할 필요가 있습니다.


[솔루션 구축]


아래의 3가지 컴포넌트를 사용하여 빅쿼리 내보내기 알림을 위한 Cloud Event Driven 솔루션을 구현할 수 있습니다.


1. Cloud Logging: GCP 프로젝트에서 발생하는 모든 이벤트에 대한 정보를 구조화된 로그 형식으로 저장 (빅쿼리 데이터 세트 / 테이블 생성, 쿼리 실행, 프로젝트 권한 추가 / 제거 등)

2. Pub/Sub: 확장 가능한 이벤트 수집 메시징 대기열 시스템. 이벤트 데이터가 게시되는 지점(publisher)과 이 이벤트 데이터를 독립적으로 수신하는 링크된 구독자(subscriber)로 구성. 사용자 정의 코드를 통해 구독자는 게시 시 원하는 비즈니스 로직을 통해 이벤트 데이터를 처리 가능

3. Cloud Functions: 클라우드 서버리스 실행 환경에서 모든 커스텀 코드를 실행 (현재 Python/Go/Java/Node.js/PHP/Ruby 지원) 단일 목적으로 코드를 작성하고 이 코드가 실행될 때 트리거를 설정. 엔드포인트에 대한 HTTP 요청, Pub/Sub 주제에 게시된 메시지, Cloud Storage에서 생성/수정/삭제된 파일 객체 등의 트리거 지원중



111.png


[구축 절차]

1. gcp log explorer에서 아래의 로그 쿼리 실행


resource.type="bigquery_dataset"

protoPayload.authenticationInfo.principalEmail="firebase-measurement@system.gserviceaccount.com"

protoPayload.serviceName: "bigquery.googleapis.com"

protoPayload.methodName="google.cloud.bigquery.v2.JobService.InsertJob"

protoPayload.metadata.tableDataChange.reason="JOB"


(gcp log explorer에서는 로그의 키를 활용하여 다양한 정보를 필터링해서 확인 할 수 있습니다.)

 

Untitled (1).png


2. GA4 일일 내보내기가 BigQuery에 도착할 때 Pub/Sub에 알리는 알림 메커니즘을 설정


- Log Explorer 결과 화면에서 "추가 작업" > "싱크 만들기" 클릭

- 로그 라우팅 싱크 만들기 새 창이 열리고, Sink name & Sink description 작성 후 다음 클릭

- 싱크 서비스 선택 > “Cloud Pub/Sub 주제”, Cloud Pub/Sub 주제 선택 > “주제 만들기” 클릭

- 주제 ID 입력 후 만들기


설정 완료 후 클라우드 프로젝트 내 Pub/Sub 서비스로 이동하면 방금 생성한 새로운 게시자 주제를 확인할 수 있습니다.

(프로젝트 간 설정 시 싱크를 사용하여 로그를 다른 cloud 프로젝트로 라우팅하는 경우 필요한 권한을 부여하기 위해 설정이 필요 할 수 있습니다.)



Untitled (2).png


3. 게시자 주제에 게시된 새 메시지를 수신하고, 새 메시지가 게시될 때마다 맞춤 코드를 실행하는 Cloud 함수를 배포

- Cloud Functions로 이동하여 '함수 만들기'를 클릭

- 함수 이름 입력

- 게시자 주제와 동일한 지역 선택 (클라우드 프로젝트 조직 정책에 리소스 위치 제한 조직 정책이 없으면 일반적으로 모든 지역이 작동함)

- 트리거 유형 Cloud Pub/Sub으로 설정

- Cloud Pub/Sub 주제를 이전 단계에서 생성한 게시자 주제로 선택

- 코드 설정 화면으로 넘어와서, 런타임 > 파이썬 3.11 선택 (Go / JAVA / Node.js / PHP / Ruby 사용 가능)

- 진입점에 함수 이름 입력 (사용자 정의 코드의 함수 이름과 동일해야함)

- 함수 내용을 지우고 아래 내용을 입력 후 배포


from google.cloud import pubsub

import base64

import json

from google.cloud import bigquery

from datetime import datetime


def ga4_exports_arrived(event, context):

    # 1) receive export notifications - Pub/Sub message

    log_entry = json.loads(base64.b64decode(event.get("data")).decode('utf-8'))

    protoPayload = log_entry.get("protoPayload")

    destinationTable = protoPayload.get("resourceName")

    

    # 2) notify downstream job

    client = bigquery.Client()

    rows_to_insert = [

        {

            "notify_timestamp": datetime.utcnow().isoformat(),

            "datasetId": destinationTable.split("/")[3],

            "tableId": destinationTable.split("/")[5],

            "event_timestamp": log_entry.get("timestamp"), # str

            "log_receive_timestamp": log_entry.get("receiveTimestamp")  # str

         },

    ]

    errors = client.insert_rows_json("[Your BQ table ID to store export notificatins], rows_to_insert)  # Make an API request.

    if errors == []:

        print("New rows have been added.")

    else:

        print("Encountered errors while inserting rows: {}".format(errors))



- requirements.txt에 아래 텍스트 추가

google-cloud-pubsub

google-cloud-bigquery


코드에서는 내보낸 테이블 이름, 시간 등의 이벤트 로그 메타 데이터가 포함된 Pub/Sub 메시지를 수신한 뒤, 메시지를 처리하고 BigQuery에 수집된 새 내보내기 테이블의 다운 스트림 작업을 알립니다. 해당 코드는 BigQuery에 저장하고 있으며 실제 응용 프로그램에서는 HTTP 후크, 다른 Pub/Sub 주제 등, 이메일이나 Slack 알림, BigQuery 예약 쿼리 등을 포함 할 수 있습니다.



[결과]

모든 단계 수행시 BigQuery 내보내기 알림 솔루션이 완전히 배포되어 실행됩니다.  BigQuery에 새 내보내기가 도착하면 Pub/Sub는 내보내기 로그 알림을 받은 후 클라우드 함수 코드를 트리거 시킵니다. 맞춤 코드가 이러한 알림을 다른 BigQuery 테이블에 저장하고 있으며, 이는 일일 내보내기가 도착할 때 아래 사진과 같이 표시됩니다.



Untitled (3).png


틀린 부분이 있거나 추가 할 내용이 있다면 알려주시면 감사하겠습니다. 감사합니다.


전체댓글0

검색결과는 총 26건 입니다.    글쓰기
1 2