-
Notifications
You must be signed in to change notification settings - Fork 0
component edge iot publisher
edge-iot-publisher는 local outbox의 canonical JSON 파일을 AWS IoT Core로 publish하는 공통 컴포넌트다. 수집, 집계, dummy 생성, 이미지 업로드는 담당하지 않는다.
/var/lib/aegis/outbox/{message_id}.json
-> validation
-> published_at / data_plane_instance_id 갱신
-> MQTT over TLS publish
-> AWS IoT Core
-> IoT Rule
-> S3 raw / Lambda data-processor
publisher는 outbox 파일의 factory_id와 source_type으로 topic을 만든다.
aegis/{factory_id}/{source_type}
예:
aegis/factory-a/factory_state
aegis/factory-a/infra_state
aegis/factory-a/image_snapshot
aegis/factory-b/factory_state
aegis/factory-b/infra_state
aegis/factory-c/factory_state
aegis/factory-c/infra_state
| 하지 않는 일 | 담당 컴포넌트 |
|---|---|
| InfluxDB 집계 | factory-a-log-adapter |
| K3s workload 상태 생성 |
factory-a-log-adapter, dummy generator |
| dummy profile 값 생성 | Factory B/C dummy generator |
| snapshot 이미지 presigned upload | snapshot-uploader |
| Risk Score 계산 | Lambda data-processor |
| pipeline_status 최종 판단 | Lambda data-processor |
이 경계 때문에 adapter/generator/uploader는 IoT 인증서를 몰라도 되고, publisher는 데이터 원본을 몰라도 된다.
publisher가 publish 전에 확인하는 필드:
schema_version
message_id
factory_id
node_id
environment_type
input_module_type
source_type
source_timestamp
published_at
data_plane_instance_id
payload
허용 source type:
factory_state
infra_state
image_snapshot
payload는 JSON object여야 한다. invalid JSON이나 필수 필드 누락은 publish하지 않고 outbox/quarantine/으로 이동한다.
| 상황 | 처리 |
|---|---|
| publish 성공 | 원본 .json 파일 삭제 |
| MQTT/TLS/네트워크 실패 | 파일 유지, 다음 scan에서 재시도 |
| JSON parse 실패 | quarantine 이동 |
| schema validation 실패 | quarantine 이동 |
| outbox 없음 | 빈 scan |
publish 직전에는 아래 두 값을 현재 publisher 기준으로 덮어쓴다.
| 필드 | 값 |
|---|---|
published_at |
현재 UTC ISO 8601 |
data_plane_instance_id |
AEGIS_DATA_PLANE_INSTANCE_ID, 기본 edge-iot-publisher-{hostname}
|
기본 경로:
/var/lib/aegis/outbox
scan 대상:
- outbox root의 일반 파일
- suffix가
.json - 파일명이
.로 시작하지 않음
무시 대상:
-
tmp/,quarantine/같은 하위 디렉터리 .snapshot-uploader-state.json-
.json이 아닌 파일
현재 publisher는 paho-mqtt 기반 persistent MQTT 연결을 프로세스 생명주기 동안 유지한다. 이전
short-lived 방식처럼 메시지마다 연결을 열고 닫지 않는다. outbox JSON 파일은 QoS 1 publish ack가
완료된 뒤에만 삭제하며, publish 실패·ack timeout·reconnect 실패 시 파일을 유지하고 다음 loop에서
재시도한다. SIGTERM/SIGINT를 받으면 graceful MQTT disconnect를 시도한다.
필수 환경변수:
AEGIS_IOT_ENDPOINT
AEGIS_IOT_CA_FILE
AEGIS_IOT_CERT_FILE
AEGIS_IOT_KEY_FILE
주요 선택 환경변수:
AEGIS_IOT_PORT=8883
AEGIS_IOT_CLIENT_ID=AEGIS-IoTThing-{factory_id}
AEGIS_IOT_TIMEOUT_SECONDS=10
AEGIS_PUBLISHER_BACKOFF_SECONDS=5
AEGIS_PUBLISHER_MAX_BACKOFF_SECONDS=60
MQTT client ID는 IoT Thing 이름과 같아야 AWS IoT Fleet Indexing connectivity가 공장별 연결 상태를 정확히 보여준다.
| Factory | Thing name / MQTT client ID |
|---|---|
factory-a |
AEGIS-IoTThing-factory-a |
factory-b |
AEGIS-IoTThing-factory-b |
factory-c |
AEGIS-IoTThing-factory-c |
| Factory | outbox mount | IoT Secret |
|---|---|---|
factory-a |
Longhorn PVC /var/lib/aegis/outbox
|
aws-iot-factory-a-cert |
factory-b |
worker hostPath /var/lib/aegis/outbox
|
aws-iot-factory-b-cert |
factory-c |
worker hostPath /var/lib/aegis/outbox
|
aws-iot-factory-c-cert |
Factory B/C에서는 publisher Pod가 dummy generator와 같은 worker node에 떠야 한다. hostPath는 node-local storage이기 때문이다.
관련 문서
- 시스템 아키텍처
- 제어 & 데이터 플레인
- 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 채팅 어시스턴트