Milky's note

Google Analystic4(GA4) API 연결 (GCP 환경) 본문

Python/API Connect

Google Analystic4(GA4) API 연결 (GCP 환경)

밀뿌 2024. 4. 30. 20:41

 

 

이번 프로젝트에서 GCP 환경에서 GA4의 데이터를 불러와야하는 작업이 생겼다.

데이터 ETL 파이프라인을 개발하고 대시보드까지 구축해야하는데

As-Is에서는 대시보드를 lookerstudio로 썼기 때문에 바로 커넥터를 사용해서 연결을 했었다.

To-Be 환경은 태블로 서버를 GCP Instance에 구축할 것이라 GA의 API를 사용해서  데이터를 적재할 예정이다.

 

 

우선 GCP 환경이기 때문에 프로젝트를 생성해야한다.

만약 프로젝트부터 생성해야한다면 여기를 통해 생성하면 된다.

 

1. GA API enable

먼저 생성한 프로젝트에서 GA의 API를 사용할 수 있도록 API를 enable 해주어야한다.

[API 및 서비스] → [라이브러리]에서 GA 관련 API를 선택한다.

혹은 아래 링크를  통해 접속해도 된다.

https://console.cloud.google.com/apis/library?supportedpurview=project

 

 

우선 나는 제일  먼저 보이는 API를 선택했는데 내가 전처리해야 될 데이터가 더  있어서 다음 API를 추가로 사용해주었다. 

 

 

 

2. IAM Service Account 생성

다음으로는 API를 호출할 서비스 계정을 생성해주어야 한다.

서비스 계정으로 인증키를 생성하고 이 키를 이용해 서버 간의 인증을 한다.

 

[IAM & Admin] [Service Accounts]를 선택한다.

그러면 서비스 계정 생성이 보이는데 이걸 클릭해준다.

 

다음과 같이 account ID만 넣어주면 특별한 설정없이 생성은 빠르게 가능하다.

그러면 ~@~iam.gserviceaccount.com 이라는 계정이 만들어지고 이 계정이 앞으로 API 서비스를 이용할 때 사용할 계정이다.

 

생성한 서비스 계정을 선택하고 [KEYS] 항목으로 들어가면 키를 생성할 수 있는 화면이 뜬다.

다음처럼 키를 생성하면 된다.

 

어떤 방식으로 키를 생성할건지를 묻는 팝업이 뜨는데 JSON을 선택해주면 된다.

 

 

다음처럼 키가 생성된 것을 볼 수 있고 바로 JSON 형태로 파일이 다운받아지는데

이 파일은 키를 생성할 때 한 번만 생성되기 때문에 잘 보관을 해야한다.

만약 분실하였을 경우에는 키를 다시 만들고 코드마다 키의 이름을 변경해주어서 아주아주 귀찮은 일이 발생할 수 있다.

 

 

 

3. GA에 Service Account 권한 추가

이제 GCP 계정에서 API 호출할 준비는 끝났고

데이터를 불러올 GA에 위에서 생성한 서비스 계정에 권한을 부여해주어야 한다.

기존에 권한을 받았다고 하더라도 우리가 통신할 계정은 서비스 계정이기 때문에

~@~iam.gserviceaccount.com 이 계정에 최소 Read 권한을 주어야한다.

권한을 주지 않으면 데이터를 읽을 수가 없다.

 

관리자 권한으로 GA를 접속한다.

다음과 같이 Admin 페이지로 들어가서 계정 엑세스 관리를 클릭한다.

 

오른쪽 상단에 사용자 추가를 선택하고 위에서 생성한 서비스 계정을 추가해준다.

 

권한은 뷰어 이상만 주면 된다.

몇 번 강조하지만 꼭 서비스 계정( ~@~iam.gserviceaccount.com)에 부여해주어야 한다.

 

 

 

4. Python으로 API 호출

이제 파이썬으로 API를  호출해보는 간단한 코드를 실행시켜 보자.

아래에 지표들이 여러 개 나오는데 google docs를 찾아보면서 하면 조금 더 이해가 편할 것 같다!!

https://developers.google.com/analytics/devguides/reporting/data/v1/api-schema?hl=ko#metrics

 

import os

from google.analytics.data_v1beta import BetaAnalyticsDataClient
from google.analytics.data_v1beta.types import (
    DateRange,
    Dimension,
    Metric,
    RunReportRequest,
)

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'GCP-Keyfile.json'

property_id="GA4-PROPERTY-ID"
client = BetaAnalyticsDataClient()

request = RunReportRequest(
    property=f"properties/{property_id}",
    dimensions=[Dimension(name="city")],
    metrics=[Metric(name="activeUsers")],
    date_ranges=[DateRange(start_date="2024-04-01", end_date="today")],
)
response = client.run_report(request)

print("Report result:")
for row in response.rows:
    print(row.dimension_values[0].value, row.metric_values[0].value)

 

GOOGLE_APPLICATION_CREDENTIALS에는 2번에서 서비스 계정을 생성하고 다운로드 받은 Key Json 파일의 이름을 넣어주면 된다.

property_id는 GA로 가서 보면,,

보안 때문에 다 가려져서 안 보이기는 하는데 App 이름 밑에 숫자로 된 App ID가 있을 것이다.

이 숫자를 넣어주면 된다.

 

위 코드는 단순하게 Dimension을 City로 주고 활성 유저수를 Metrics로 주고 조회하는 코드이다.

다음처럼 응답을 잘 받으면 연동 완료이다.

 

 

API의 Metrics나 Dimension은 여러 개를 넣고 호출해도 가능하다.

request = RunReportRequest(
    property=f"properties/{property_id}",
    dimensions=[
        Dimension(name="pagePath"),
        Dimension(name="country"), 
        Dimension(name="deviceCategory"), 
    ],
    metrics=[
        Metric(name="totalUsers"),
        Metric(name="sessions"),
        Metric(name="screenPageViews"),
        Metric(name="bounceRate"),
    ],
    date_ranges=[DateRange(start_date='2024-04-01', end_date='2024-04-30')],
     dimension_filter=FilterExpression(
             filter=Filter(
                 field_name="pagePath",
                 string_filter=Filter.StringFilter(value="/tistory", 
                                                   match_type=Filter.StringFilter.MatchType.CONTAINS),
             )
         )
)


# run request
response = client.run_report(request)

data = []

for row in response.rows:
    dimension_values = [value.value for value in row.dimension_values]
    metric_values = [value.value for value in row.metric_values]
    data.append(dimension_values + metric_values)

columns = [dimension.name for dimension in response.dimension_headers] + [metric.name for metric in response.metric_headers]

df = pd.DataFrame(data, columns=columns)

 

위 코드는 여러 개의 Metrics, Dimension

추가로 filter로 원하는 조건만 추출할 수 있게 작성한 코드이다.

그리고 데이터프레임으로 만들어서 전처리를 해야하기 때문에 데이터 프레임으로 만들어 주었다.

 

이제 필요한 데이터로 만들어주면 된다.

Comments