-
Notifications
You must be signed in to change notification settings - Fork 0
architecture cloud storage
AWS cloud 저장소는 foundation이 소유하는 S3 bucket과 DynamoDB table을 기준으로 구성된다. S3는 원본/장기 이력/보고서 저장소이고, DynamoDB는 Dashboard와 alert pipeline을 위한 hot read model이다.
| 리소스 | 이름 | 생성 위치 | 역할 |
|---|---|---|---|
| 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에 남는다.
| 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로 해결할 수 없는 경우에 한해 읽힌다.
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다.
| 항목 | 값 |
|---|---|
| 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 |
| 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
pk = FACTORY#{factory_id}
sk = LATEST
주요 필드:
factory_stateinfra_stateriskpipeline_statuslatest_image_snapshotlast_factory_state_atlast_infra_state_atlast_image_snapshot_atupdated_at
LATEST에는 TTL이 없다. 메시지 수신 또는 refresh 스케줄이 같은 item을 부분 갱신한다.
LATEST snapshot에 ttl을 추가한 단기 이력이다. 같은 snapshot은 S3 processed/{factory_id}/state_snapshot/에도 저장하지만 S3 object에는 DynamoDB TTL 필드인 ttl을 넣지 않는다.
GraphAggregator5m이 직전 완료된 5분 window의 HISTORY#STATE를 읽어 sensor, risk, AI, infra 통계를 저장한다. Dashboard의 긴 window 조회는 이 key family를 사용한다.
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# item은 Slack 발송 장기 이력이 아니다. stale snapshot 중복 처리, cooldown, cloud warning 연속 관측 확인을 위한 상태 저장소다. 7일 TTL 이후 자동 삭제된다.
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/
보고서 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.jsonfactory-daily-summary.jsoncloud-infra-daily-summary.jsonreport-context.jsonreport.mdgeneration-metadata.json
Dashboard Reports API는 같은 report.md 경로를 읽는다.
- 시스템 아키텍처
- 제어 & 데이터 플레인
- 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 채팅 어시스턴트