본문으로 건너뛰기
블로그로 돌아가기
AI Agents

Google Cloud Scheduler + Flask로 마케팅 자동화 구축하기: 실전 가이드

하이프마크 데이터팀
2025년 2월 14일
Google Cloud Scheduler + Flask로 마케팅 자동화 구축하기: 실전 가이드

왜 마케팅 자동화에 Cloud Scheduler가 필요한가

마케팅팀의 아침은 보통 이렇게 시작됩니다:

  1. GA4 대시보드 열기 → 어제 트래픽 확인
  2. 네이버 광고 관리자 열기 → 소진 예산과 CPC 확인
  3. 카카오 모먼트 열기 → 캠페인 성과 확인
  4. 메타 광고 관리자 열기 → ROAS 확인
  5. 엑셀에 데이터 취합 → 일간 리포트 작성

매일 1-2시간. 이 반복 작업에 사라지는 시간은 연간 300시간 이상입니다.

Google Cloud Scheduler + Flask 조합은 이 모든 과정을 자동화합니다. 매일 아침 출근하면 슬랙에 완성된 리포트가 올라와 있고, 이상이 감지되면 즉시 알림이 옵니다.


아키텍처 개요

Google Cloud Scheduler (cron 스케줄)
         │
         │  HTTP POST 요청 (매일 09:00 KST)
         ▼
   Cloud Run (Flask App)
         │
    ┌────┼────┬────────┬──────────┐
    ▼    ▼    ▼        ▼          ▼
  네이버  카카오  메타    구글 Ads   GA4
  API    API   API     API       BigQuery
    │    │     │       │          │
    └────┴─────┴───────┴──────────┘
                   │
              데이터 통합 + AI 분석
                   │
           ┌───────┴───────┐
           ▼               ▼
        BigQuery        Slack/이메일
       (데이터 저장)     (리포트 발송)

구성 요소별 역할

구성 요소역할비용 (월 기준)
Cloud Scheduler지정 시간에 HTTP 요청 발생무료 (3개 job까지)
Cloud RunFlask 앱 실행 (요청 시에만)~$3-10
BigQuery데이터 저장 + 분석무료 (10GB까지)
Secret ManagerAPI 키 안전 보관~$0.06/키/월
월 총 비용$5-15

단계별 구축 가이드

Step 1: Flask 앱 작성

# app.py
from flask import Flask, request, jsonify
from datetime import datetime, timedelta
import pandas as pd
from google.cloud import bigquery
import requests
import json

app = Flask(__name__)

# ====== 데이터 수집 함수들 ======

def fetch_naver_ads(date_str: str) -> pd.DataFrame:
    """네이버 검색광고 API에서 전일 데이터 수집"""
    headers = {
        'X-API-KEY': os.environ['NAVER_ADS_API_KEY'],
        'X-Customer': os.environ['NAVER_ADS_CUSTOMER_ID'],
    }
    # 캠페인별 성과 데이터 조회
    response = requests.get(
        'https://api.naver.com/stats',
        headers=headers,
        params={'since': date_str, 'until': date_str}
    )
    df = pd.DataFrame(response.json()['data'])
    df['platform'] = 'naver'
    return df

def fetch_kakao_moment(date_str: str) -> pd.DataFrame:
    """카카오 모먼트 API에서 전일 데이터 수집"""
    # ... 유사한 구조
    pass

def fetch_meta_ads(date_str: str) -> pd.DataFrame:
    """메타 광고 API에서 전일 데이터 수집"""
    # ... 유사한 구조
    pass

def fetch_google_ads(date_str: str) -> pd.DataFrame:
    """구글 Ads API에서 전일 데이터 수집"""
    # ... 유사한 구조
    pass

# ====== AI 분석 함수 ======

def generate_ai_analysis(unified_df: pd.DataFrame) -> dict:
    """통합 데이터에 대한 AI 분석 리포트 생성"""
    from openai import OpenAI
    client = OpenAI()

    summary = unified_df.groupby('platform').agg({
        'impressions': 'sum',
        'clicks': 'sum',
        'cost': 'sum',
        'conversions': 'sum',
        'revenue': 'sum',
    }).to_string()

    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[{
            "role": "system",
            "content": """마케팅 데이터 분석 전문가입니다.
            다음 규칙을 따르세요:
            1. 전일 대비 변화가 ±20% 이상인 지표를 강조
            2. ROAS가 가장 높은/낮은 채널 식별
            3. 구체적인 액션아이템 3개 제안
            4. 한국어로 작성"""
        }, {
            "role": "user",
            "content": f"전일 마케팅 성과 데이터:\n{summary}"
        }],
        temperature=0.3,
    )

    return {
        "narrative": response.choices[0].message.content,
        "data_summary": summary,
        "generated_at": datetime.now().isoformat(),
    }

# ====== 메인 엔드포인트 ======

@app.route('/api/daily-report', methods=['POST'])
def daily_report():
    """Cloud Scheduler가 매일 호출하는 엔드포인트"""

    yesterday = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d')

    try:
        # 1. 전 채널 데이터 수집
        naver = fetch_naver_ads(yesterday)
        kakao = fetch_kakao_moment(yesterday)
        meta = fetch_meta_ads(yesterday)
        google = fetch_google_ads(yesterday)

        # 2. 데이터 통합
        unified = pd.concat([naver, kakao, meta, google], ignore_index=True)

        # 3. AI 분석
        analysis = generate_ai_analysis(unified)

        # 4. BigQuery 저장
        save_to_bigquery(unified, analysis)

        # 5. 슬랙 리포트 발송
        send_slack_report(analysis)

        # 6. 이상 탐지 (비용 급증, 전환율 급감 등)
        alerts = detect_anomalies(unified)
        if alerts:
            send_urgent_alert(alerts)

        return jsonify({"status": "success", "date": yesterday})

    except Exception as e:
        send_error_alert(str(e))
        return jsonify({"status": "error", "message": str(e)}), 500

Step 2: Docker 컨테이너화

FROM python:3.11-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .

CMD ["gunicorn", "--bind", "0.0.0.0:8080", "app:app"]
# requirements.txt
flask==3.1.0
gunicorn==23.0.0
pandas==2.2.0
google-cloud-bigquery==3.27.0
google-cloud-secret-manager==2.21.0
openai==1.58.0
requests==2.32.0

Step 3: Cloud Run 배포

# 프로젝트 설정
gcloud config set project YOUR_PROJECT_ID

# Docker 이미지 빌드 & 푸시
gcloud builds submit --tag gcr.io/YOUR_PROJECT_ID/marketing-agent

# Cloud Run 배포
gcloud run deploy marketing-agent \
  --image gcr.io/YOUR_PROJECT_ID/marketing-agent \
  --platform managed \
  --region asia-northeast3 \
  --memory 1Gi \
  --timeout 300 \
  --no-allow-unauthenticated

Step 4: Cloud Scheduler 설정

# 일간 리포트: 매일 오전 9시 (한국 시간)
gcloud scheduler jobs create http daily-marketing-report \
  --schedule="0 9 * * *" \
  --time-zone="Asia/Seoul" \
  --uri="https://marketing-agent-xxxxx.run.app/api/daily-report" \
  --http-method=POST \
  --oidc-service-account-email=scheduler@YOUR_PROJECT.iam.gserviceaccount.com

# 주간 리포트: 매주 월요일 오전 10시
gcloud scheduler jobs create http weekly-marketing-report \
  --schedule="0 10 * * 1" \
  --time-zone="Asia/Seoul" \
  --uri="https://marketing-agent-xxxxx.run.app/api/weekly-report" \
  --http-method=POST \
  --oidc-service-account-email=scheduler@YOUR_PROJECT.iam.gserviceaccount.com

# 이상 탐지: 매시간
gcloud scheduler jobs create http hourly-anomaly-check \
  --schedule="0 * * * *" \
  --time-zone="Asia/Seoul" \
  --uri="https://marketing-agent-xxxxx.run.app/api/anomaly-check" \
  --http-method=POST \
  --oidc-service-account-email=scheduler@YOUR_PROJECT.iam.gserviceaccount.com

자동화 시나리오별 구현 예시

시나리오 1: 일간 성과 리포트

트리거: 매일 오전 9:00 실행 내용:

  1. 4개 광고 플랫폼 + GA4 데이터 수집
  2. 채널별 ROAS, CPA, CTR 계산
  3. AI가 전일 대비 변화 분석 + 인사이트 생성
  4. 슬랙에 포맷된 리포트 발송
  5. BigQuery에 히스토리 저장

시나리오 2: 예산 소진 모니터링

트리거: 매 4시간 실행 내용:

  1. 각 캠페인의 일일 예산 대비 소진율 확인
  2. 소진율이 기대치의 ±30% 벗어나면 알림
  3. 과소진 캠페인은 AI가 원인 분석 (CPC 급등? 경쟁 심화?)
  4. 예산 재배분 제안

시나리오 3: 주간 경쟁사 분석

트리거: 매주 월요일 오전 8:00 실행 내용:

  1. 주요 키워드 순위 변동 추적
  2. 경쟁사 광고 노출 현황 수집
  3. AI가 경쟁 환경 변화 분석
  4. 대응 전략 제안

시나리오 4: 월간 전략 리포트

트리거: 매월 1일 오전 10:00 실행 내용:

  1. 전월 전체 데이터 종합 분석
  2. 채널별 ROI 순위 및 추세
  3. AI가 다음 달 예산 배분 제안
  4. 크리에이티브 성과 분석 + 갱신 제안
  5. PDF 리포트 생성 → 이메일 발송

비용 비교: Cloud Scheduler vs 대안

월 기준 비용 (일간 리포트 기준)

솔루션월 비용비고
Cloud Scheduler + Cloud Run$5-15실행 시에만 과금
N8N Cloud (Pro)$50/월~실행 건수 제한 있음
Make (Pro)$29/월~오퍼레이션 수 제한
Zapier (Professional)$49.99/월~태스크 수 제한
AWS Lambda + EventBridge$3-10유사 비용, 세팅 더 복잡
Cron + 상시 서버$30-10024/7 서버 유지 비용

핵심 차이: Cloud Run은 실행될 때만 비용이 발생합니다. 하루에 5분만 동작하는 리포트 에이전트라면, 나머지 23시간 55분은 비용 $0입니다.


하이프마크가 이 스택을 쓰는 이유

하이프마크의 모든 마케팅 자동화 에이전트는 Google Cloud Scheduler + Flask + Cloud Run 스택으로 운영됩니다.

이 아키텍처의 장점:

  • 안정성 — Google Cloud의 SLA 99.95% 보장
  • 확장성 — 고객이 10명이든 1,000명이든 동일한 구조
  • 비용 — 고객당 추가 인프라 비용이 거의 없음
  • 보안 — 고객 데이터가 Google Cloud 내에서만 처리
  • 모니터링 — Cloud Monitoring으로 실행 상태 실시간 추적

그리고 모든 에이전트의 실행 결과는 하이프마크.AI 대시보드에 통합되어, 고객이 직접 자동화 성과를 확인하고 인사이트를 활용할 수 있습니다.


시작하기

자체적으로 구축하고 싶다면 이 글의 코드를 참고하세요. 전문 팀의 도움이 필요하다면 하이프마크가 기획부터 배포, 운영까지 전 과정을 지원합니다.

마케팅 자동화 상담 신청 →

더 많은 인사이트가 필요하신가요?

AI 마케팅 전문가와 상담하고 비즈니스를 성장시키세요

문의하기
Google Cloud Scheduler + Flask로 마케팅 자동화 구축하기: 실전 가이드 - Hypemarc Blog | Hypemarc