Skip to content

component edge iot publisher

JJong-03 edited this page Jun 17, 2026 · 3 revisions

컴포넌트 - 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_idsource_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는 데이터 원본을 몰라도 된다.


Validation

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 처리

상황 처리
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}

Outbox Scan 기준

기본 경로:

/var/lib/aegis/outbox

scan 대상:

  • outbox root의 일반 파일
  • suffix가 .json
  • 파일명이 .로 시작하지 않음

무시 대상:

  • tmp/, quarantine/ 같은 하위 디렉터리
  • .snapshot-uploader-state.json
  • .json이 아닌 파일

AWS IoT Core 연결

현재 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이기 때문이다.


관련 문서

Aegis-Pi Wiki

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

시작하기

요구사항

핵심 개념

아키텍처

컴포넌트 (Edge → Cloud → Dashboard)

Dashboard & 운영

시나리오 · 사례 · 참조

Clone this wiki locally