Phase 3 — Governance (LogPath, PDPA, Purge) 구현 요약
Ref: implementation plan §5.
구현된 항목
| 기획서 항목 | 구현 |
|---|---|
| P3-2 trace_id 주입 | Control Plane에서 provision 생성 시 trace_id 생성·전달, trace_events 기록 |
| P3-3 trace_events region 등 | D1 trace_events (0004)에 region, pulumi_stack, gh_run_id 컬럼 존재; Control Plane에서 region·payload 기록 |
| P3-4 Audit Log 정책 | audit_logs에만 INSERT, DELETE 없음. Control Plane·Purge Worker에서 tenant_created, subscription_deleted, hard_purge_* 기록 |
| P3-6 Soft Delete | customer.subscription.deleted → tenants_master.status = ‘Pending_Deletion’, audit_log 기록 |
| P3-7 Hard Purge Job | workers/purge-job: Cron 30일 경과 후 §5.8 순서(Hetzner workflow_dispatch → R2 prefix 삭제 → D1 tenant 계열 삭제), audit_logs 유지 |
| P3-8 0006 | migrations/0006_multiregion.sql 적용 |
Control Plane 변경
writeTraceEvent(): STRIPE_WEBHOOK_RECEIVED, BILLING_STATUS_UPDATED, PROVISION_JOB_CREATED 기록writeAuditLog(): tenant_created, subscription_deleted (Pending_Deletion 고지) 기록
Purge Worker (workers/purge-job)
- Cron 매일 02:00 UTC (설정 가능)
POST /purge수동 실행 가능- D1·R2 바인딩; 선택적으로 GITHUB_PAT·PURGE_DESTROY_WORKFLOW_ID로 pulumi-destroy workflow_dispatch
미구현·팀 보완
- P3-1 결정 ③: trace_events 고빈도 저장(R2 오프로드/하이브리드) — 현재 D1만 사용; 결정 후 R2 또는 배치 쓰기 추가
- P3-5 Audit Dashboard: Control Plane
GET /audit?tenant_id=...&since=...&limit=100로 audit_logs 조회 가능. 대시보드 UI는 client-web 또는 별도 앱에서 이 API 호출·필터·export 구현. - P3-9 SEV1 검증: trace_id 기준 1초 이내 조회 시나리오·테스트
§5.9 첫 Hard Purge 전 점검
첫 30일 경과 Purge 전: §5.5 완료 기준, §5.8 순서, purge_jobs 전이, (선택) 테스트 테넌트로 1건 검증.