이 글에서는 Google Cloud Functions를 배포하고, Cloud Scheduler를 이용해 정기적으로 실행하는 과정을 정리합니다.
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 트리거 추가
- 로컬 테스트용 코드 포함
#!/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을 가져와 스케줄러에 등록
gitbash에서 실행합니다.
gcloud scheduler jobs run export_naver_search_ad_stats --location=asia-northeast3
- 스케줄러를 수동 실행하여 Cloud Function이 정상적으로 실행되는지 확인
- 실행 후 로그 확인
gcloud functions logs read export_naver_search_ad_stats --region=asia-northeast3 --limit=20
- 최근 20개의 실행 로그 조회
- 에러 발생 시 수정 필요
./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
gcloud scheduler jobs run export_naver_search_ad_stats --location=asia-northeast3
예약한 시간이 아닌 지금 스케쥴러를 실행해서 확인해봅니다.!