GCP Cloud Functions & Cloud Scheduler 배포 과정

한빈수윤·2025년 3월 7일

이 글에서는 Google Cloud Functions를 배포하고, Cloud Scheduler를 이용해 정기적으로 실행하는 과정을 정리합니다.


1. Cloud Function 배포 과정

배포할 Cloud Function 코드 작성

import functions_framework
from flask import Request, Response
import subprocess

@functions_framework.http
def export_naver_search_ad_stats(request: Request = None) -> Response:
    """
    Cloud Function Entry Point - backfill.py를 실행합니다.
    """
    try:
        # backfill.py 실행 및 결과 캡처
        result = subprocess.run(
            ["python3", "backfill.py"],
            check=True,
            capture_output=True,
            text=True
        )
        return Response(f"backfill.py 실행 완료!\n{result.stdout}", status=200)
    except subprocess.CalledProcessError as e:
        return Response(f"실행 중 오류 발생: {e.stderr}", status=500)

# 로컬 테스트용
if __name__ == "__main__":
    from functions_framework import create_app
    app = create_app("export_naver_search_ad_stats")
    app.run(host="0.0.0.0", port=8080)
  • backfill.py를 실행하여 데이터를 처리하는 Cloud Function 생성
  • Cloud Functions에 HTTP 트리거 추가
  • 로컬 테스트용 코드 포함

1.2 Cloud Function 배포 스크립트 (cloud_function.sh)

#!/bin/bash

# 환경 변수 설정
ACCOUNT="your-email@example.com"
GCP_PROJECT_ID="your-project-id"
GCP_REGION="asia-northeast3"
GCP_TIMEZONE="Asia/Seoul"

FUNCTION_NAME="export_naver_search_ad_stats"
ENTRY_POINT="export_naver_search_ad_stats"
SVC_ACCOUNT="data-exporter@$GCP_PROJECT_ID.email"

DESCRIPTION="네이버 검색 광고 데이터 처리"
MESSAGE_BODY='{"company": "your-company"}'
SCHEDULE="0 8 * * *"  # 매일 오전 8시 실행

# GCP 인증
gcloud auth application-default login --project="$GCP_PROJECT_ID"
gcloud config set account "$ACCOUNT"
gcloud config set project "$GCP_PROJECT_ID"

echo "[Authentication] GCP_PROJECT=$(gcloud config get-value project), SVC_ACCOUNT=$(gcloud config get-value account)"

# Cloud Function 배포
echo "Deploying Cloud Function: $FUNCTION_NAME"
gcloud functions deploy "$FUNCTION_NAME" \
  --gen2 \
  --entry-point="$ENTRY_POINT" \
  --source="." \
  --max-instances=50 \
  --memory=512MB \
  --region="$GCP_REGION" \
  --service-account="$SVC_ACCOUNT" \
  --project="$GCP_PROJECT_ID" \
  --runtime=python311 \
  --timeout=3600s \
  --trigger-http

echo "Deployment command finished."

# Cloud Function URL 가져오기
echo "Waiting for function URL to be available..."
sleep 30
FUNCTION_URL=$(gcloud functions describe "$FUNCTION_NAME" --region="$GCP_REGION" --format="value(serviceConfig.uri)")

# 기존 Cloud Scheduler 삭제 후 재생성
echo "Deleting existing Cloud Scheduler job if exists"
gcloud scheduler jobs delete "$FUNCTION_NAME" --location="$GCP_REGION" --quiet --project="$GCP_PROJECT_ID" || echo "No existing scheduler job found"

# Cloud Scheduler 새로 생성
echo "Creating new Cloud Scheduler job"
gcloud scheduler jobs create http "$FUNCTION_NAME" \
  --quiet \
  --http-method="POST" \
  --location="$GCP_REGION" \
  --headers="Content-Type=application/json,User-Agent=Google-Cloud-Scheduler" \
  --schedule="$SCHEDULE" \
  --uri="$FUNCTION_URL" \
  --time-zone="$GCP_TIMEZONE" \
  --description="$DESCRIPTION" \
  --message-body="$MESSAGE_BODY" \
  --oidc-service-account-email="$SVC_ACCOUNT" \
  --oidc-token-audience="$FUNCTION_URL"

echo "Cloud Scheduler job $FUNCTION_NAME deployed successfully, running daily at 8:00 AM KST"
  • gcloud functions deploy 명령어로 Cloud Function 배포
  • Cloud Scheduler 삭제 후 재생성 (스케줄러 업데이트 문제 해결)
  • Cloud Function의 URL을 가져와 스케줄러에 등록

2. Cloud Scheduler 실행

2.1 Cloud Scheduler 직접 실행

gitbash에서 실행합니다.

gcloud scheduler jobs run export_naver_search_ad_stats --location=asia-northeast3
  • 스케줄러를 수동 실행하여 Cloud Function이 정상적으로 실행되는지 확인
  • 실행 후 로그 확인

2.2 실행 로그 확인

gcloud functions logs read export_naver_search_ad_stats --region=asia-northeast3 --limit=20
  • 최근 20개의 실행 로그 조회
  • 에러 발생 시 수정 필요

3. 배포 및 실행 과정

3.1 Cloud Function 배포

./cloud_function.sh

결과예시

Deploying Cloud Function: export_naver_search_ad_stats
Deployment command finished.
Waiting for function URL to be available...
Cloud Scheduler job export_naver_search_ad_stats deployed successfully, running daily at 8:00 AM KST

3.2 스케쥴러 수동 실행

gcloud scheduler jobs run export_naver_search_ad_stats --location=asia-northeast3

예약한 시간이 아닌 지금 스케쥴러를 실행해서 확인해봅니다.!


  • 최종정리
  1. Cloud Function 코드 작성 (export_naver_search_ad_stats)
  2. 배포 스크립트 (cloud_function.sh) 실행
  3. Cloud Scheduler를 생성하고 정기 실행 설정
  4. 수동 실행 (gcloud scheduler jobs run) 후 로그 확인
  5. Cloud Function 실행 및 BigQuery 데이터 처리 확인
profile
버거운 컴공 적응기>**<^*^##

0개의 댓글