Intel Platform — Collector API Key 운영자 가이드
Intel Platform 의 8개 collector 가 외부 API 호출에 사용하는 키를 Vault → External Secrets Operator (ESO) → K8s Secret → gend-api Pod env 경로로 주입하는 방법입니다.
- ESO 경로가 아직 적용돼 있지 않습니다 —
intel-collector-keysExternalSecret 리소스가 prod 에 없고, 동명의 K8s Secret 은 수동 생성본입니다. 즉 아래 §1 대로 Vault 만 갱신하면 Pod 에 반영되지 않습니다. ESO 를 적용(§2)하기 전까지는kubectl patch secret intel-collector-keys로 K8s Secret 을 직접 갱신 후 §3 재시작이 실효 경로입니다. - 8개 키 중 실값은
GEND_FRED_API_KEY,GEND_SEC_USER_AGENT(+별도 Secret 의GEND_DART_API_KEY) 뿐이며 ECOS/NAVER/POLYGON/YOUTUBE/KIPRIS 는 빈 문자열 — 해당 collector 소스는 키 발급·주입 전까지 실행 불가입니다.
소스별 vault_secret_path 로 Vault 를 직접 참조시키는 경우, resolver 는 해당 KV2 secret 안의 api_key 필드를 읽습니다 (services/intel/vault_resolver.py). 본 문서의 공유 경로(secret/gend/intel-collector-keys)처럼 GEND_* 필드명으로 저장된 secret 을 가리키면 해석에 실패해 항상 env fallback 됩니다. per-source Vault 참조를 쓰려면 secret/intel/<collector>/<source_id> 경로에 api_key=<값> 필드로 저장하세요.
키 매트릭스
| Collector | env var | 발급처 | 가이드 |
|---|---|---|---|
dart | GEND_DART_API_KEY | opendart.fss.or.kr | 회원가입 → API 키 발급 (무료) |
sec_edgar | GEND_SEC_USER_AGENT | (자체) | "이름 email@example.com" 형식 — SEC 요구. 키 발급 아님 |
fred | GEND_FRED_API_KEY | research.stlouisfed.org/docs/api | API key request 무료 |
ecos | GEND_ECOS_API_KEY | ecos.bok.or.kr | 한국은행 ECOS API key |
naver_news | GEND_NAVER_CLIENT_ID + GEND_NAVER_CLIENT_SECRET | developers.naver.com | Naver 검색 API 신청 |
polygon | GEND_POLYGON_API_KEY | polygon.io | 무료 tier 가능 (한도 5 req/min) |
youtube | GEND_YOUTUBE_API_KEY | console.cloud.google.com | YouTube Data API v3 활성화 + 키 발급 |
kipris | GEND_KIPRIS_API_KEY | kipris.or.kr | KIPRIS plus 신청 |
rss,pykrx는 키 불필요 (공개 스크래핑).
권장 경로 — admin UI 에서 키 관리 (#2460)
/admin/intel-sources 페이지의 "수집기 API 키" 섹션에서 kubectl 없이 키를 설정합니다:

- 대상 collector 행의 키 설정(또는 회전) 클릭 → 발급받은 키 입력 → 저장
- 키는 DB 에 Fernet 암호문으로 저장되며 (GEND_PROVIDER_KEY_ENC_KEY 마스터키, #1853 과 공유) pod 재시작 없이 즉시 수집에 반영됩니다
- 저장 후에는 말미 4자 힌트만 표시 — 원문은 어떤 화면/API 에도 다시 노출되지 않습니다
- "사용 소스" 배지:
DB (UI 관리)>환경변수>미설정— 키 해석 순서는 DB → IntelSource.vault_secret_path → env 입니다
삭제 시 env/Vault 폴백으로 동작하며, 폴백이 없으면 해당 collector 는 실행되지 않습니다.
naver_news는 2-credential — 키 다이얼로그에서 CLIENT_ID + CLIENT_SECRET 를 함께 입력합니다 (#2499 부터 둘 다 UI 관리, 최초 설정 시 SECRET 필수·이후 키만 회전 가능). 한계: Dagster 자산 중 env 를 직접 읽는intel_ohlcv_minute/intel_trades(Polygon 분봉·체결, 현재 미가동) 는 env 경로가 필요합니다.
레거시 경로 — K8s Secret/env 주입
아래 절차는 UI 도입 전 방식이며, env 폴백을 쓰거나 UI 를 쓸 수 없는 환경에서만 필요합니다.
1. Vault 에 키 등록
# AKS prod
kubectl --context aks-genos-prod exec -n gend vault-0 -- sh
vault login <root-token>
vault kv put secret/gend/intel-collector-keys \
GEND_SEC_USER_AGENT="GenD Intel <ops@example.com>" \
GEND_FRED_API_KEY="..." \
GEND_ECOS_API_KEY="..." \
GEND_NAVER_CLIENT_ID="..." \
GEND_NAVER_CLIENT_SECRET="..." \
GEND_POLYGON_API_KEY="..." \
GEND_YOUTUBE_API_KEY="..." \
GEND_KIPRIS_API_KEY="..."
일부 키만 발급된 경우 — Vault path 에 일부 키만 PUT 해도 됨. ESO 는 missing key 시 해당 entry fail. IntelSource 인스턴스화 시
ValueError("...API key 필요")발생 — Prometheus 알람 가능.
2. ExternalSecret 적용
kubectl apply -f infra/external-secrets/intel-collector-keys-externalsecret.yaml
ESO 가 1분마다 Vault polling → K8s Secret intel-collector-keys 생성.
3. gend-api 재시작 (env 픽업)
kubectl rollout restart deploy/gend-api -n gend
kubectl rollout status deploy/gend-api -n gend --timeout=120s
4. 검증
POD=$(kubectl get pod -n gend -l app=gend-api -o name | head -1 | cut -d/ -f2)
kubectl exec -n gend "$POD" -c gend-api -- bash -c 'env | grep -E "GEND_(SEC|FRED|ECOS|NAVER|POLYGON|YOUTUBE|KIPRIS)" | sed "s/=.*/=***/"'
8개 env 확인되면 IntelSource row 의 collector_type 에 따라 자동으로 픽업됩니다.
IntelSource 등록
키 주입 완료 후 collector 별 IntelSource row 를 등록해야 Dagster sensor 가 실제 실행:
-- 예: SEC EDGAR 분기보고서
INSERT INTO intel_sources (id, name, collector_type, domain, params_json, schedule_cron, enabled, last_status)
VALUES (gen_random_uuid(), 'sec-edgar-10k', 'sec_edgar', 'filings',
'{"form_types": ["10-K", "10-Q"]}', '0 */2 * * *', true, 'idle');
또는 UI /admin/intel-sources 에서 등록합니다 (admin 전용 — Intel 수집기 관리 참조).
domain='financials' (DART 재무제표) 소스는 params_json 에 8자리 DART
고유번호를 반드시 지정해야 합니다 — 누락 시 매 실행이 ValueError 로
last_status=failed 가 됩니다 (2026-07 prod 에서 1개월+ 방치된 실사례).
{"corp_codes": ["00126380", "00164779", "00266961", "00877059"]}
(예시는 삼성전자·SK하이닉스·NAVER·삼성바이오로직스. 고유번호는 DART
corpCode API 또는 기존 intel_filings.corp_code 값에서 확인.)
corp_codes 설정으로 수집→Bronze(iceberg.bronze.intel_financials_raw)
까지 동작합니다. Silver intel_financials 반영은 financials 전용
normalizer 구현(#2459) 전까지 미지원 — 조회는 Trino Bronze 테이블 사용.
Troubleshooting
| 증상 | 원인 | 조치 |
|---|---|---|
intel-collector-keys Secret 없음 | Vault path 미등록 또는 ESO 가 sync 안 함 | kubectl describe externalsecret -n gend intel-collector-keys |
| Pod env 에 키 없음 | gend-api 재시작 안 함 | kubectl rollout restart deploy/gend-api -n gend |
ValueError: collector 는 API key 필요 | Vault entry 누락 | 해당 키만 vault kv patch 로 추가 |
IntelSource last_status=failed | collector 인증 거부 / 키 만료 | kubectl logs deploy/gend-api -n gend | grep -i intel |
참고
- 설계: docs/DESIGN_INTEL_PLATFORM.md §3.5
- 사용자 가이드: features/intel-platform
- ESO: admin-ops/installation/external-secrets (Epic #1107)