Skip to content

architecture dashboard vpc

JJong-03 edited this page Jun 18, 2026 · 6 revisions

Dashboard VPC 설계

Data/Dashboard 영역의 현재 구현 기준 아키텍처를 정리한다. 이 문서는 infra/data-dashboard* Terraform root와 apps/dashboard-backend FastAPI 구현을 기준으로 한다.


핵심 결정

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 경로에서만 수행한다.


Terraform Root 분리

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 경로를 사용할 수 있다.


사용자 접근 경로

Web SPA

dashboard.aegis-pi.cloud
  -> Route53 alias
  -> CloudFront
  -> S3 Web bucket

Dashboard Web은 Vite/React 정적 SPA로 S3 Web bucket에 배포되고 CloudFront OAC로만 읽힌다. S3 bucket public access는 차단된다.

Backend API

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를 사용한다.

WAF 상태

문서상 목표 진입 경로는 CloudFront + WAF다. 다만 현재 Terraform root에서 aws_wafv2* 리소스가 확인되지 않는 경우에는 WAF를 구현 완료로 단정하지 않고 보안 강화 계획 또는 선택 구성으로 분리해 표시한다.


인증과 권한

인증은 Cognito Hosted UI와 FastAPI 앱 레벨 JWT 검증으로 처리한다.

  1. 브라우저가 Cognito OIDC/PKCE 로그인으로 토큰을 받는다.
  2. REST API는 Authorization: Bearer <token> 헤더를 보낸다.
  3. WebSocket은 브라우저 제약 때문에 ?token=<JWT> query parameter를 사용한다.
  4. Backend는 JWKS를 캐시해 JWT 서명, 만료, audience를 검증한다.
  5. Cognito sub를 RDS app_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다.


Security Group 기준

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 경로는 현재 구조에 없다.


초기 서버리스 Dashboard 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를 직접 호출하지 않는다. 제어성 작업은 별도 운영 경로로 분리한다.


관련 문서

Aegis-Pi Wiki

· 대표 문서 목록은 홈의 문서 탐색 표 참조

시작하기

요구사항

핵심 개념

아키텍처

컴포넌트 (Edge → Cloud → Dashboard)

Dashboard & 운영

시나리오 · 사례 · 참조

Clone this wiki locally