GCP Cloud Functions + Cafe24 연동 Trouble Shooting

yeahcold·2025년 3월 23일
0

Data Engineering

목록 보기
1/20

✅ 목표

  • Cloud Functions에서 Cafe24 주문 데이터를 매일 수집하여 BigQuery에 적재
  • Refresh Token 기반 자동 토큰 갱신 + .env 실시간 업데이트 자동화

🗂️ 프로젝트 구조

cloudfunction/
└── cafe24/
    ├── main.py                 # Cloud Function 진입점
    ├── requirements.txt        # 의존성 정의
    ├── localpackage/
    │   ├── get_token.py        # 토큰 갱신 + .env GCS 동기화
    │   ├── extract_data.py     # 주문 데이터 조회
    │   └── load_to_bq.py       # BigQuery 적재
    └── deploy/
        └── cloudfunctions.sh   # 배포 스크립트

⚠️ 문제 발생 & 해결 과정

1️⃣ .env 접근 문제

  • Cloud Functions는 루트 경로에 파일 생성 불가
  • /tmp 경로에 .env를 다운로드해 사용
# get_token.py
from pathlib import Path
import tempfile

LOCAL_ENV_PATH = Path(tempfile.gettempdir()) / ".env"

2️⃣ Invalid refresh_token 오류

  • 문제: 첫 실행은 성공하지만 이후엔 invalid_grant 발생
  • 원인: 이전 refresh_token이 여전히 메모리에 남아있음
  • ✅ 해결: load_dotenv(..., override=True)로 강제 갱신
load_dotenv(dotenv_path=LOCAL_ENV_PATH, override=True)

3️⃣ .env는 바뀌는데 반영이 안 됨

  • 원인: os.getenv()는 이미 로드된 환경변수를 계속 참조
  • ✅ 해결: .env 갱신을 위해 매번 load_dotenv로 갱신 필요
    (추가적으로 custom get_env 함수도 고려 가능)

4️⃣ GCS 업로드 실패 (403 에러)

403: does not have storage.objects.delete access
  • 원인: Cloud Functions의 서비스 계정에 GCS 쓰기 권한 부족
  • ✅ 해결: IAM에서 해당 버킷에 Storage Object Admin 권한 부여

5️⃣ Postman 사용 후 서버 실패

  • Postman으로 토큰 재발급하면 이전 refresh_token바로 무효화
  • ✅ 주의:

    Postman으로 테스트 후엔 반드시 .env를 최신 토큰으로 업데이트해야 함
    동시에 사용 시 충돌 발생 가능 (토큰 1회성 특성 때문)


🔁 최종 Flow

  1. Cloud Function 실행
  2. GCS에서 .env 다운로드 → /tmp/.env
  3. load_dotenv(..., override=True)로 환경변수 로딩
  4. refresh_token → access_token 재발급
  5. .env 파일 업데이트
  6. GCS에 .env 재업로드
  7. API 데이터 조회 → BigQuery 적재

💡 팁 & 주의사항

  • .env 파일엔 공백 ❌ ' 따옴표 ❌
  • refresh_token오직 한 곳에서만 사용해야 함 (Postman ↔ Cloud Function 동시에 사용 금지)
  • 디버깅을 위해 다음과 같은 로그를 넣는 걸 추천함.
print(f"실제 요청한 refresh_token: {refresh_token}")
  • Cloud Scheduler로 테스트 시에도 .env 동기화 상태 꼭 체크할 것!
profile
Software Engineer

0개의 댓글