Skip to content

architecture cloud storage

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

아키텍처 — 클라우드 스토리지

AWS cloud 저장소는 foundation이 소유하는 S3 bucket과 DynamoDB table을 기준으로 구성된다. S3는 원본/장기 이력/보고서 저장소이고, DynamoDB는 Dashboard와 alert pipeline을 위한 hot read model이다.


Foundation 소유 리소스

리소스 이름 생성 위치 역할
S3 bucket aegis-bucket-data infra/foundation/s3.tf raw, processed, image_snapshot, reports 저장
DynamoDB table AEGIS-DynamoDB-FactoryStatus infra/foundation/dynamodb.tf LATEST, HISTORY, GRAPH, CLOUD, ALERT read model

data-pipeline, reporting, dashboard는 foundation 리소스를 참조한다. bucket/table 소유권은 foundation에 남는다.


S3 Prefix

Prefix 실제 key 형식 hh partition 생성 주체 용도
raw/ raw/{factory_id}/{source_type}/yyyy=YYYY/mm=MM/dd=DD/{message_id}.json 없음 IoT Rule MQTT payload 원본 보존
processed/{factory_id}/factory_state/ processed/{factory_id}/factory_state/yyyy=YYYY/mm=MM/dd=DD/hh=HH/{message_id}.json 있음 DataProcessor normalized sensor/AI 상태
processed/{factory_id}/risk_score/ processed/{factory_id}/risk_score/yyyy=YYYY/mm=MM/dd=DD/hh=HH/{message_id}.json 있음 DataProcessor Risk 계산 결과
processed/{factory_id}/infra_state/ processed/{factory_id}/infra_state/yyyy=YYYY/mm=MM/dd=DD/hh=HH/{message_id}.json 있음 DataProcessor infra/pipeline 상태
processed/{factory_id}/image_snapshot/ processed/{factory_id}/image_snapshot/yyyy=YYYY/mm=MM/dd=DD/hh=HH/{message_id}.json 있음 DataProcessor image snapshot metadata
processed/{factory_id}/state_snapshot/ processed/{factory_id}/state_snapshot/yyyy=YYYY/mm=MM/dd=DD/hh=HH/{updated_at}.json 있음 DataProcessor, refresh LATEST snapshot 장기 사본
processed/cloud_infra/fast/ processed/cloud_infra/fast/yyyy=YYYY/mm=MM/dd=DD/hh=HH/{updated_at}.json 있음 CloudInfraFastCollector cloud fast snapshot
processed/cloud_infra/slow/ processed/cloud_infra/slow/yyyy=YYYY/mm=MM/dd=DD/hh=HH/{updated_at}.json 있음 CloudInfraSlowCollector cloud slow snapshot
processed_agg/ processed_agg/{factory_id}/metrics_5m/yyyy=YYYY/mm=MM/dd=DD/hh=HH/mm=MM.json 있음 GraphAggregator5m 5분 graph aggregate 장기 사본
image_snapshot/ image_snapshot/factory_id={factory_id}/yyyy=YYYY/mm=MM/dd=DD/hh=HH/{filename} 있음 snapshot-uploader image binary 원본
reports/daily/ reports/daily/yyyy=YYYY/mm=MM/dd=DD/{factory_id_or_cloud-infra}/{artifact} 없음, 날짜 뒤 target Daily report pipeline 일일 보고서와 중간 집계

raw/ metadata는 factory_state, infra_state, image_snapshot 모두 hh partition을 쓰지 않는다. DataProcessor가 만드는 processed/ 계열은 모두 hh partition을 쓴다.

각 prefix의 실제 read 경로는 다음과 같다.

Prefix 누가 읽는가 언제 읽는가
raw/ 운영자, 재처리 스크립트 장애 원인 분석, DataProcessor 재실행 시
processed/{factory_id}/state_snapshot/ RiskAlertDispatcher S3 ObjectCreated 이벤트 발생 즉시
processed/cloud_infra/{fast,slow}/ RiskAlertDispatcher, Daily Report ObjectCreated 즉시, 매일 00:30 KST
processed/{factory_id}/{dataset}/ Daily Report Lambdas 매일 KST 기준 전날 시간별 집계
processed_agg/ 운영자, 향후 확장 Dashboard는 DynamoDB GRAPH#5M을 우선 읽음
image_snapshot/ Dashboard API 사용자가 Factory Detail에서 이미지 조회 시
reports/daily/ Dashboard Reports API 사용자가 Reports 탭 접근 시

Dashboard 일반 조회(fleet/factory/cloud infra 상태)는 S3를 직접 읽지 않고 DynamoDB read model을 사용한다. S3는 TTL 이후 장기 보존, 감사, 보고서 생성, 이미지 조회처럼 DynamoDB로 해결할 수 없는 경우에 한해 읽힌다.


S3 Lifecycle

Foundation Terraform 기준 lifecycle은 prefix별 storage class 전환이다. DynamoDB TTL과 혼동하면 안 된다.

Prefix Lifecycle
raw/ 90일 후 GLACIER_IR 전환
processed/ 365일 후 STANDARD_IA 전환
latest/ (legacy/non-contract) 과거 lifecycle 흔적. 현재 Dashboard current-state 경로로 사용하지 않음
전체 bucket incomplete multipart upload 7일 후 abort
noncurrent versions raw/processed rule에서 90일 후 만료
processed_agg/, image_snapshot/, reports/ 현재 별도 lifecycle rule 없음

S3 object는 장기 보존/감사/보고서 근거다. Dashboard current state의 1차 조회 대상은 DynamoDB다.


DynamoDB Table

항목
Table AEGIS-DynamoDB-FactoryStatus
Region ap-south-1
Partition key pk string
Sort key sk string
Billing PAY_PER_REQUEST
TTL attribute ttl
PITR enabled
Stream NEW_AND_OLD_IMAGES

DynamoDB Key Family

PK SK TTL 생성 주체 조회 주체 용도
FACTORY#{factory_id} LATEST 없음 DataProcessor, DataProcessorRefresh1m Dashboard API/Web, cloud infra collector factory별 현재 상태
FACTORY#{factory_id} HISTORY#STATE#{updated_at} 목표 2시간(마지막 문서화된 운영값 48시간) DataProcessor, DataProcessorRefresh1m Dashboard 1h history, GraphAggregator5m raw-resolution 단기 상태 이력
FACTORY#{factory_id} GRAPH#5M#{bucket_start} 48시간 GraphAggregator5m Dashboard 6h/12h/24h chart 5분 집계 read model
CLOUD#infra LATEST 없음 CloudInfraFastCollector, CloudInfraSlowCollector Cloud infra Dashboard/API cloud infra 현재 상태
CLOUD#infra HISTORY#FAST#{updated_at} 6시간 CloudInfraFastCollector Cloud infra Dashboard/API 1분 fast cloud infra 이력
CLOUD#infra HISTORY#SLOW#{updated_at} 24시간 CloudInfraSlowCollector Cloud infra Dashboard/API 5분 slow cloud infra 이력
ALERT#{scope} {severity}#{reason}#{status} 7일 RiskAlertDispatcher RiskAlertDispatcher Slack cooldown/dedupe
ALERT#{scope} OBSERVATION#{severity}#{reason}#{status} 7일 RiskAlertDispatcher RiskAlertDispatcher 연속 관측 확인

TTL 값은 infra/data-pipeline/variables.tf와 각 Lambda 환경변수 주입을 기준으로 한다.

dynamodb_history_ttl_hours = 2
graph_bucket_ttl_hours = 48
cloud_infra_fast_history_ttl_hours = 6
cloud_infra_slow_history_ttl_hours = 24
risk_alert_state_ttl_seconds = 604800

주요 Item 내용

FACTORY LATEST

pk = FACTORY#{factory_id}
sk = LATEST

주요 필드:

  • factory_state
  • infra_state
  • risk
  • pipeline_status
  • latest_image_snapshot
  • last_factory_state_at
  • last_infra_state_at
  • last_image_snapshot_at
  • updated_at

LATEST에는 TTL이 없다. 메시지 수신 또는 refresh 스케줄이 같은 item을 부분 갱신한다.

HISTORY#STATE

LATEST snapshot에 ttl을 추가한 단기 이력이다. 같은 snapshot은 S3 processed/{factory_id}/state_snapshot/에도 저장하지만 S3 object에는 DynamoDB TTL 필드인 ttl을 넣지 않는다.

GRAPH#5M

GraphAggregator5m이 직전 완료된 5분 window의 HISTORY#STATE를 읽어 sensor, risk, AI, infra 통계를 저장한다. Dashboard의 긴 window 조회는 이 key family를 사용한다.

CLOUD#infra

pk = CLOUD#infra
sk = LATEST

FastCollector가 fast, fast_updated_at, overall_status를 갱신하고 SlowCollector가 slow, slow_updated_at, overall_status를 갱신한다. Dashboard는 AWS service API를 직접 반복 조회하지 않고 이 item을 읽는다.

ALERT#

ALERT# item은 Slack 발송 장기 이력이 아니다. stale snapshot 중복 처리, cooldown, cloud warning 연속 관측 확인을 위한 상태 저장소다. 7일 TTL 이후 자동 삭제된다.


Alert Trigger Source

RiskAlertDispatcher는 모든 processed object를 보지 않는다. Terraform 변수 기준으로 다음 prefix만 S3 ObjectCreated trigger 대상이다.

processed/factory-a/state_snapshot/
processed/factory-b/state_snapshot/
processed/factory-c/state_snapshot/
processed/cloud_infra/fast/
processed/cloud_infra/slow/

Daily Reports

보고서 pipeline은 S3 processed/processed/cloud_infra/를 입력으로 읽고, 다음 위치에 산출물을 쓴다.

reports/daily/yyyy=YYYY/mm=MM/dd=DD/{factory_id}/
reports/daily/yyyy=YYYY/mm=MM/dd=DD/cloud-infra/

주요 artifact:

  • intermediate/hourly/hh=HH.json
  • factory-daily-summary.json
  • cloud-infra-daily-summary.json
  • report-context.json
  • report.md
  • generation-metadata.json

Dashboard Reports API는 같은 report.md 경로를 읽는다.


관련 문서

Aegis-Pi Wiki

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

시작하기

요구사항

핵심 개념

아키텍처

컴포넌트 (Edge → Cloud → Dashboard)

Dashboard & 운영

시나리오 · 사례 · 참조

Clone this wiki locally