우아한형제들의 실외배달 로봇 딜리가 AWS IoT Core 에 붙는 구조를 3단계로 풀어낸 글이다. 관리자 개입 없는 자동 등록, 로봇 간 완전 격리, 영구 키 없는 클라우드 리소스 접근이 각각 Fleet Provisioning, IoT Policy, Credential Provider 로 대응된다.
핵심 포인트- 제로 터치 등록을 위해 공통 클레임 인증서를 미리 심고, 첫 연결 때 개별 Device Certificate 를 발급받게 했다
- Pre-Provisioning Hook 의 Lambda 로 시리얼 중복·비정상 등록을 걸러 2단계 검증을 만들었다
- Policy 에서 토픽을 자기 ClientId 하위로 묶어 로봇 A 가 로봇 B 데이터에 닿을 수 없게 했다
- CONNECT 시 인증서에 붙은 Thing 이름과 ClientId 가 일치할 때만 연결을 허용해 ClientId 도용을 막았다
- 로봇이 S3·DynamoDB·CloudWatch 에 직접 붙되 영구 키를 두지 않도록 Role Alias 로 1시간짜리 임시 자격증명을 발급한다
상세 정리- 문제 1: 수백 대 규모에서 사람이 등록을 붙잡으면 확장이 안 되지만, 자동화하면 무단 연결 위험이 생긴다
- 문제 2: 중앙은 모든 로봇 데이터를 모아야 하는데 로봇끼리는 서로를 못 봐야 하는 모순이 있다
- 문제 3: 로봇은 개별 자율주행 주체이면서 동시에 배달 군체의 일부라 경로·지도를 실시간 공유해야 한다
- 등록 방식: Provisioning by Claim 으로 출고 시 클레임 인증서를 탑재하고 첫 연결에서 교체한다
- 템플릿 동작: RobotId 와 Serial 을 받아 Thing 과 Certificate 를 만들고 Thing Group 에 자동 편입한다
- 재등록 보호: OverrideSettings 를 DO_NOTHING 으로 두어 재등록 시 기존 속성이 덮이지 않게 했다
- 클레임 정책 범위: 인증서 생성 토픽과 프로비저닝 템플릿 토픽에 대한 Connect 권한만 주어 등록 외 행위를 차단했다
- 격리 강제: Policy 조건에 AWS 가 검증하는 값을 써서 인증서와 ClientId 의 결합을 서버 측에서 확인한다
- 수집 통합: 모든 로봇의 telemetry 토픽을 와일드카드 하나로 받는 단일 IoT Rule 로 묶었다
- 비용 최적화: Rule 을 여러 백엔드 연결 대신 하나로 합치고 SQL 필터로 필요한 필드만 통과시켜 메시지 비용을 줄였다
- 백엔드 연결: SQS 로 포워딩해 백엔드가 pull 방식으로 받게 하여 트래픽 급증을 흡수한다
- 임시 자격증명 흐름: Device Certificate 로 mTLS 인증 후 credentials 엔드포인트를 호출하면 STS 가 1시간 유효 키를 준다
- 최소 권한: S3 Role 은 특정 버킷 PutObject 만, CloudWatch Role 은 로그 그룹 생성과 이벤트 기록만, DynamoDB Role 은 읽기만 갖는다
왜 읽나대수가 늘어나는 디바이스 플릿을 운영하며 등록 자동화와 테넌트 격리를 동시에 만족시켜야 하는 팀에게 IoT Core 구성의 실제 조합을 보여준다.