자꾸 여기서 막히나봐 찾아줘




지금 막히는 지점은 “무슨 값이 실제로 앱에 들어오느냐”가 계속 뒤섞여서 그래요.

한 번에 정리해서 더는 base64 에러가 못 나오게 만들자는 플랜입니다. (이미 헬스체크는 OK)

지금부터 이렇게만 하세요 (깨끗이 초기화 → 단일 파일 마운트)

  1. 코드는 ‘파일만 읽기’로 고정 (이미 했다면 스킵)

  • 경로: /etc/gsa/sa.json (변경 금지)

python
# util_sheets.py (요지) from google.oauth2 import service_account from googleapiclient.discovery import build import os SA_PATH="/etc/gsa/sa.json" def load_sheets_service(): if not os.path.exists(SA_PATH): raise RuntimeError(f"Service account file missing: {SA_PATH}") creds = service_account.Credentials.from_service_account_file( SA_PATH, scopes=["https://www.googleapis.com/auth/spreadsheets"] ) return build("sheets","v4",credentials=creds,cache_discovery=False)
  1. Cloud Run에서 꼬인 설정 전부 제거

bash
gcloud run services update youtube-auto-collector \ --region=asia-northeast3 \ --remove-env-vars=GOOGLE_SHEETS_SERVICE_ACCOUNT_JSON,GOOGLE_SHEETS_SPREADSHEET_ID \ --remove-secrets=GOOGLE_SHEETS_SERVICE_ACCOUNT_JSON
  1. (선택) 기존 시크릿을 지우지 말고, “정상 JSON”으로 새 버전 추가

삭제는 다른 서비스 의존성 깨질 수 있어요. 그냥 새 버전 추가가 안전.

bash
# 로컬의 service-account.json(평문 JSON)로 새 버전 추가 (base64 금지!) gcloud secrets versions add gcp-service-account-json --data-file=service-account.json
  1. Cloud Run에 ‘딱 1개’ 시크릿 파일 마운트만 연결

bash
gcloud run services update youtube-auto-collector \ --region=asia-northeast3 \ --update-secrets=/etc/gsa/sa.json=gcp-service-account-json:latest
  • describevolumes/volumeMounts 확인 시 /etc/gsa/sa.json만 보여야 합니다.

    (다른 경로로 마운트된 시크릿이 있으면 제거 필요)

  1. 권한 확인 (가장 자주 놓침)

bash
# Cloud Run이 쓰는 서비스계정 확인 gcloud run services describe youtube-auto-collector \ --region=asia-northeast3 \ --format='value(spec.template.spec.serviceAccountName)' # 그 계정에 secretAccessor 부여 gcloud secrets add-iam-policy-binding gcp-service-account-json \ --member="serviceAccount:<<위에서 나온-서비스계정>>" \ --role="roles/secretmanager.secretAccessor"
  1. 시트 ID만 단일 ENV로 설정 (PowerShell이면 반드시 “한 줄씩”)

bash
# PowerShell 예시(한 줄) gcloud run services update youtube-auto-collector ` --region=asia-northeast3 ` --set-env-vars GOOGLE_SHEETS_SPREADSHEET_ID=1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms
  1. 배포 리비전에 트래픽 100% 고정

bash
gcloud run services update-traffic youtube-auto-collector \ --region=asia-northeast3 --to-latest
  1. 검증 포인트 (필수)

bash
# 시크릿 파일만 마운트되어 있는지 gcloud run services describe youtube-auto-collector \ --region=asia-northeast3 \ --format='value(spec.template.spec.volumes,spec.template.spec.containers[0].volumeMounts)' # ENV에 시트 ID만 있는지 gcloud run services describe youtube-auto-collector \ --region=asia-northeast3 \ --format='value(spec.template.spec.containers[0].env)'
  • ENV에 GOOGLE_SHEETS_SERVICE_ACCOUNT_JSON 없어야 함 (파일만 쓰니까).

  • volumeMounts/etc/gsa/sa.json 하나만 있어야 함.

이렇게 하면:

  • base64/평문/쉼표/타입 충돌 → 원천 차단

  • Secret 값이 무엇이든 앱은 파일만 읽음

  • 권한 없어서 파일을 못 읽는 경우만 남는데, 위 ⑤로 해결

진행하시다가 describe 출력 두 줄(ENV, volumeMounts)만 캡처 주시면, 바로 추가 체크로 마무리 도와드릴게요.

댓글 남기기