-
Notifications
You must be signed in to change notification settings - Fork 0
architecture dashboard vpc
Data/Dashboard 영역의 현재 구현 기준 아키텍처를 정리한다. 이 문서는
infra/data-dashboard*Terraform root와apps/dashboard-backendFastAPI 구현을 기준으로 한다.
Data/Dashboard VPC와 Control/Management VPC는 네트워크로 직접 연결하지 않는다. Dashboard Backend는 EKS Hub, ArgoCD, Spoke K3s API, Tailscale 제어망을 호출하지 않고, AWS 관리형 저장소와 Cognito/RDS 권한 모델만 사용한다.
브라우저
-> CloudFront + S3 Dashboard Web SPA
-> Cognito Hosted UI 로그인
-> ALB HTTPS
-> ECS Fargate FastAPI Backend
-> DynamoDB FactoryStatus read
-> S3 reports/processed/image_snapshot read
-> RDS PostgreSQL metadata
-> Redis Pub/Sub subscribe
이 경계의 목적은 관제 화면 침해가 제어 평면 침해로 이어지지 않게 하는 것이다. Dashboard는 준실시간 관제 시스템이고, 실시간 제어 시스템이 아니다. 제어 명령, 배포, K3s API 조작은 Control/Management 경로에서만 수행한다.
| Root | 성격 | 주요 리소스 |
|---|---|---|
infra/data-dashboard/ |
runtime, 재생성 가능 | VPC, subnet, NAT, ALB, ECS Fargate, RDS, Redis, Lambda notifier, VPC endpoint, API DNS |
infra/data-dashboard-permanent/ |
영구 자원 | Cognito, ECR, S3 Web bucket, CloudFront, CloudFront ACM, aegis-daily-report, GitHub OIDC |
infra/data-dashboard-dns/ |
영구 DNS | Route53 hosted zone |
data-dashboard/ root는 permanent root의 remote state를 읽어 Cognito, S3 Web, CloudFront, ECR, daily report table 정보를 사용한다. DNS hosted zone은 destroy/apply 주기와 분리된다.
data-dashboard root는 별도 VPC 안에 public, private-app, private-data subnet을 AZ별로 만든다.
| 계층 | 배치 | 용도 |
|---|---|---|
| Public subnet | 2개 AZ | Internet Gateway, 단일 NAT Gateway, ALB |
| Private App subnet | 2개 AZ | ECS Fargate Backend, Redis subnet group, Lambda notifier |
| Private Data subnet | 2개 AZ | RDS PostgreSQL subnet group |
NAT Gateway는 비용 절감을 위해 첫 번째 public subnet 1곳에만 배치한다. 모든 private subnet은 같은 private route table에서 이 단일 NAT를 기본 경로로 사용한다.
S3와 DynamoDB는 Gateway VPC Endpoint가 있어 ECS/Lambda의 S3/DynamoDB 접근이 NAT를 거치지 않는다. Secrets Manager, Cognito 등 다른 AWS API 호출은 NAT 경로를 사용할 수 있다.
dashboard.aegis-pi.cloud
-> Route53 alias
-> CloudFront
-> S3 Web bucket
Dashboard Web은 Vite/React 정적 SPA로 S3 Web bucket에 배포되고 CloudFront OAC로만 읽힌다. S3 bucket public access는 차단된다.
api.aegis-pi.cloud
-> Route53 alias
-> Internet-facing ALB HTTPS
-> Target Group HTTP :8000
-> ECS Fargate FastAPI task
ALB는 public subnet에 있고 ECS task는 private-app subnet에 있으며 public IP를 받지 않는다. Target Group health check는 /healthz를 사용한다.
문서상 목표 진입 경로는 CloudFront + WAF다. 다만 현재 Terraform root에서 aws_wafv2* 리소스가 확인되지 않는 경우에는 WAF를 구현 완료로 단정하지 않고 보안 강화 계획 또는 선택 구성으로 분리해 표시한다.
인증은 Cognito Hosted UI와 FastAPI 앱 레벨 JWT 검증으로 처리한다.
- 브라우저가 Cognito OIDC/PKCE 로그인으로 토큰을 받는다.
- REST API는
Authorization: Bearer <token>헤더를 보낸다. - WebSocket은 브라우저 제약 때문에
?token=<JWT>query parameter를 사용한다. - Backend는 JWKS를 캐시해 JWT 서명, 만료, audience를 검증한다.
- Cognito
sub를 RDSapp_user에 매핑하고user_factory_access로 공장별 접근을 강제한다.
RBAC 상세 모델은 별도 RBAC 문서를 source of truth로 두고, 이 문서에서는 인프라 의존성과 경계만 다룬다.
| 저장소 | 위치 | Backend 사용 |
|---|---|---|
DynamoDB AEGIS-DynamoDB-FactoryStatus
|
기존 공식 hot store |
LATEST, HISTORY#STATE#, GRAPH#5M#, CLOUD#infra read |
S3 aegis-bucket-data
|
shared data bucket |
reports/daily/ list/get, image_snapshot/ list/presigned GET, processed data read 권한 |
| RDS PostgreSQL 16 | private-data subnet, Single-AZ | 사용자, 공장, 권한, audit metadata |
| ElastiCache Redis 7.1 | private-app subnet, single node | Pub/Sub subscribe, cache 용도 |
DynamoDB aegis-daily-report
|
permanent root | 영구 report table, 현재 Backend report 조회는 S3 기반 |
Backend task는 1 vCPU / 2 GiB 기준이며 demo 운영 기준 desired/running 2개를 유지한다. Application Auto Scaling target은 min 2 / max 2로 고정되어 warm task 2개를 보장한다.
RDS는 db.t4g.micro, gp3 20GiB, multi_az=false, publicly_accessible=false다. Redis는 cache.t4g.micro, num_cache_clusters=1, TLS in-transit, AUTH token, automatic_failover_enabled=false, multi_az_enabled=false다.
| SG | Ingress | Egress/목적 |
|---|---|---|
| ALB | 인터넷 CIDR에서 80/443 | ECS task 8000 |
| ECS | ALB SG에서 8000 | DynamoDB/S3 endpoint, RDS, Redis, AWS API |
| RDS | ECS SG와 Lambda notifier SG에서 5432 | PostgreSQL metadata |
| Redis | ECS SG와 Lambda notifier SG에서 6379 | Pub/Sub/cache |
| Lambda notifier | 직접 ingress 없음 | Redis, Secrets Manager, DynamoDB Streams |
Dashboard VPC에서 Control/Management VPC로 향하는 peering, TGW, private API 경로는 현재 구조에 없다.
초기 ADR/초안의 서버리스 Dashboard API 경로는 superseded다. 현재 Dashboard API 런타임은 ALB + ECS Fargate + FastAPI다. 단, DataProcessor, notifier, snapshot presigner처럼 event-driven Lambda와 snapshot presigner HTTP API는 별도 용도로 유지된다.
유효하게 남는 Lambda 역할은 Dashboard API가 아니라 DynamoDB Streams를 Redis Pub/Sub로 전달하는 notifier다.
| 구분 | Dashboard 준실시간 관제 | Control/Management 실시간 제어 |
|---|---|---|
| 목적 | 상태 조회, 위험 추세 확인, 리포트 조회 | 배포, 복구, edge node 제어 |
| 데이터 | DynamoDB/S3/RDS/Redis read model | Kubernetes, ArgoCD, Tailscale, 운영 API |
| 지연 허용 | 초 단위 반영 지연 허용 | 명령 경로의 즉시성/정합성 중요 |
| 권한 | 관제 사용자/RBAC | 운영자/제어망 권한 |
| 실패 모드 | 화면 stale, REST fallback | 제어 실패, 배포 실패 |
Dashboard에서 상태 변경 버튼이나 자동 조치가 보이더라도 현재 Backend는 관리 plane API를 직접 호출하지 않는다. 제어성 작업은 별도 운영 경로로 분리한다.
관련 문서
- 시스템 아키텍처
- 제어 & 데이터 플레인
- Dashboard VPC 설계
- 하드웨어 배치
- Hub EKS 네임스페이스
- Tailscale Mesh VPN
- 데이터 생명주기
- 데이터 조회 모델
- 실시간 갱신 구조
- IoT 데이터 계약
- Reporting Pipeline
- 로컬 스토리지
- 클라우드 스토리지
- Edge Agent
- Edge AI 탐지
- Factory-A Log Adapter
- Dummy Sensor
- Edge IoT Publisher
- Lambda Data Processor
- Risk Normalizer
- Risk Score Engine
- Pipeline Status Aggregator
- Graph Aggregator 5m
- Cloud Infra Collector
- Daily Report Generator
- Risk Alert Dispatcher
- Image Snapshot Pipeline
- Dashboard Backend
- Dashboard Web
- AI 채팅 어시스턴트