https://www.youtube.com/watch?v=2abxd41tDlI https://www.youtube.com/watch?v=u0mMgTEPrQo https://www.youtube.com/watch?v=HTm2nORrkSw

https://docs.aws.amazon.com/ko_kr/iot/latest/developerguide/what-is-aws-iot.html
MQTT, HTTP 를 통해 Thing 과의 통신 지원,
AWS 에선 Thing 에서 게이트웨이와 쉽게 연결하기 위해 Device SDK 라이브러리를 사용한다.
Device SDK 를 사용하면 인증서 및 암호화까지 모두 지원하기에 AWS 에서 사용 필수
풀 매니지드 서비스로 Thing 이 늘어난다고 별도의 확장관리를 할 필요가 없다.
특정 토픽, 특정 기기에 대해서(Resource) 아래 Action 들을 수행할 수 있도록 IAM Policy 구성이 가능하다.
iot:Publish: MQTT publish
iot:Subscribe: MQTT subscribe
iot:UpdateThingShadow: 쉐도우 수정
iot:GetThingShadow: 쉐도우 조회
iot:DeleteThingShadow: 쉐도우 삭제
Thing 에서는 인증서를 사용하기때문에 아래처럼 정책변수 ${iot:ClientId} 를 사용하면 좋다.
{
"Effect": "Allow",
"Action": "*",
"Resource": "arn:aws:iot:us-east-1:....:client/${iot:ClientId}",
}
하나의 Thing 등록하려면 AWS IoT Core 에 Thing 에 해당하는 Metadata 를 등록해두어야 한다.
Thing(Metadata), Certificate(인증서), Policies(정책)

aws cli 로 표시하면 아래 1 ~ 5 과정과 같다.
# 1. Thing 생성
$ aws iot create-thing --thing-name single-device --attribute-payload {
"attribute": {
"model_number": "M5711"
}
}
# 2. Certificate 생성
$ aws iot create-keys-and-certificate
# 출력된 인증서 Arn CERTIFICATE_ARN 변수에 삽입
# 3. Policy 생성
$ aws iot create-policy --policy-name all-pubsub --policy-document {
"Version": "2012-10-17,
"Statement": [{
"Effect": "Allow",
"Action": "iot:Publish",
"Resource": "arn:aws:iot:us-east-1:my-topic"
}, {
"Effect": "Allow",
"Action": "iot:Subscribe",
"Resource": "arn:aws:iot:us-east-1:my-topic"
}]
}
# 4. Policy - Certificate 서로 attach
$ aws iot attatch-policy --policy-name all-pubsub --target $CERTIFICATE_ARN
# 5. Thing - Certificate 서로 attach
$ aws iot attatch-thing-principal --thing-name single-device --principal $CERTIFICATE_ARN
X.509 인증서를 사용해 IoT Gateway 와 인증된 연결을 구성,
하나의 인증서당 하나의 Thing, 혹은 Group, 혹은 수만대에 적용하여 인증하는 방식
Websocket 으로 연결하여 AWS SigV4 방식을 사용해 인증된 연결을 구성하고 메세지를 전달하는 방식
위 2가지 방식이 AWS 에서 제공하는 인증서를 활용한 인증방식이다.
사용자 지정 인증 방식은 자체적인 인증 솔루션을 사용하여 IoT Gateway 와 인증된 연결을 구성하는 방식이다,
아래 그림처럼 Key/Token 방식으로 람다함수와 같이 사용하여 외부 EC2(Instance) 나 서버에 전달하여 인증받는 방식이다.

AWS IoT의 루트CA 혹은 사설인증기관의 루트CA 에 등록된 인증서를 사용하여
등록된 루트CA 인증서를 사용해 대량의 Device 인증서 생산 및 Device 에 적용하는 방식이다.
대량의 Device 인증서 를 일괄로 AWS IoT CA 에 등록(배치 플릿 프로비저닝) 할 수 있다.
위의 과정이 기기가 수만대 이상 늘어나면 사람이 일일이 적용하는것은 불가능하기에
aws cli 을 이용해 쉘 프로그래밍을 작성해야 했는데
이를 좀더 쉽게 적용할 수 있도록 만들어진 기능이 배치 플릿 프로비저닝
배치 플릿 프로비저닝 은 위에서 설명한 aws cli 1~5 단계 기능을 모두 합쳐서 배치형식으로 대량 동작시키는것
json 문서형식으로 위 단계를 정리하는데 배치 플릿 프로비저닝 템플릿 이라 한다.
{
"Resources" : {
"thing" : {
"Type" : "AWS::IoT::Thing",
"Properties" : {
"ThingName" : {"Ref" : "ThingName"},
"AttributePayload" : { "version" : "v1", "serialNumber" : {"Ref" : "SerialNumber"}},
"ThingTypeName" : "lightBulb-versionA",
"ThingGroups" : ["v1-lightbulbs", {"Ref" : "Location"}]
},
"OverrideSettings" : {
"AttributePayload" : "MERGE",
"ThingTypeName" : "REPLACE",
"ThingGroups" : "DO_NOTHING"
}
},
"certificate" : {
"Type" : "AWS::IoT::Certificate",
"Properties" : {
"CertificateSigningRequest": {"Ref" : "CSR"},
"Status" : "ACTIVE"
}
},
"policy" : {
"Type" : "AWS::IoT::Policy",
"Properties" : {
"PolicyDocument" : "{ \"Version\": \"2012-10-17\", \"Statement\": [{ \"Effect\": \"Allow\", \"Action\":[\"iot:Publish\"], \"Resource\": [\"arn:aws:iot:us-east-1:123456789012:topic/foo/bar\"] }] }"
}
}
}
}
위처럼 메타데이터 [Thing(Metadata), Certificate(인증서), Policies(정책)] 를 한번에 등록하고 서로 Attach 해준다.
가변데이터 설정만 잘 해주면 쉽게 대량으로 Thing 에 대한 메타데이터 설정이 가능하다.
특정 토픽에 대해 메세지를 필터링, 변환, Lambda 실행, DB에 저장 등을 진행할 수 있고
토픽을 변경하거나 하나의 메세지에서 여러가지 이벤트를 만들어 내는 등을 IoT Rule Engine 으로 정의 가능하다.
단순하게 MQTT 메세지의 페이로드를 그대로 백앤드 어플리케이션에 전달할 수 있지만
아래와 같이 Rule Query Statement 를 적용해 clientId 를 같이 넘겨준다던지, 특정 데이터를 변조해서 보낸다던지 가능하다.
SELECT clientid() as ClientID, topic() as Topic, * FROM 'topic/#'
clientid() 외에도 get_thing_shadow(thingName, roleARN) 함수를 사용해디바이스 Shadow 문서 자체를 가져올 수 있다.
또한 AWS Iot 에서 브로커와의 연결/해제, 토픽 구독/취소 이벤트에 대해 모두 MQTT 메세지로 받아볼 수 있다.
기기가 AWS Iot Core 에 연결되어 발생시킬수 있는 Event 종류는 아래 3가지
Job EventThing TypeThing Group과거에는 해당 이벤트에서 로그가 발생하면 CloudWatch 에서 따로 이벤트 MQTT 를 발행하는 구조였는데
지금은 해당 이벤트에 대한 Topic 만 구독하고 있으면 된다.
디바이스 Shadow, 디바이스 Registry 문서들을 활용해서 Thing 을 그룹화 하여 정책설정 및 관리가 가능하다.
기존에는 생성된 인증서를 기반은로 IoT 정책을 생성하고 그룹화 하였지만 계층화별로 그룹화 하기 어려운면이 있었다.
이제는 그룹을 생성하고 계층화하기 편하도록 그룹화 정의문서로 디바이스 Shadow 와 디바이스 Registry 를 사용하여 IoT 정책을 선정할 수 있다.
또한 빠른 검색기능을 위해 fleet indexing 기능을 제공한다.
fleet indexing 처리를 하려면 아래 명령어를 실행
$ aws iot update-indexing-configuration --thing-indexing-configuration thingindexingMode=REGISTRY_AND_SHADOW
REGISTRY_AND_SHADOW외에도REGSITRY,OFF파라미터를 적용해디바이스 Registry만 설정하거나 기능을 제거할 수 있다.
불안정한 인터넷 상태에 따라 메세지 순서가 변경되거나 기기 네트워크가 끊겨 전달되지 않을 수 있다.
보통 IoT 상태를 관리할때 Control 시그널을 통해 상태를 변경하는데 인터넷 연결이 불안정해 Thing의 상태가 변경되었는지 확신할 수 없을 경우가 있다.
이때 사용하는것이 디바이스 Shadow이다.
기기 상태를 동기화할 수 있는 중간자 역할을 한다.
Desired : 사용자가 원하는 상태
Reported : 현재 Thing의 상태
Delta : Desired 와 Reported 가 서로 다른 상태
다비이스 쉐도우는 아래와 같은 Document 형태이다.
{
"state": {
"desired": {
"lights": { "color": "RED" },
"engine": "ON"
},
"reported": {
"lights": { "color": "GREEN" },
"engine": "ON"
},
"delta": {
"lights": { "color": "RED" },
}
},
"version": 1
}
쉐도우 문서에는 항상 version 이 존재하며 수정될때마다 증가한다.
문서 수정시 version 을 명시하지 않아도 되지만 명시할경우 버전에 맞춰 업데이트되도록 ordering 가능하다.
delta 에 대한 토픽을 구독함으로써 Desired 와 Reported 가 서로 다른 상태임을 확인 가능하고 Thing 컨트롤을 수월하게 진행 가능
$aws/things/{thing-name}/shadow/update
{
"state": {
"desired": {...}
}
}
위와 같은 토픽과 쉐도우 문서 를 전송하면 된다.
아래와 같은 쉐도우와 관련된 대표적인 토픽이 존재한다.
UPDATE: $aws/things/{thing-name}/shadow/update
GET: $aws/things/{thing-name}/shadow/get
DELETE: $aws/things/{thing-name}/shadow/delete - 쉐도우 Document 초기화
DELTA: $aws/things/{thing-name}/shadow/delta - Subscription 용
DOCUMENTS: $aws/things/{thing-name}/shadow/update/documents -
디바이스 Shadow가 가변적인 정보를 표기한다면
디바이스 Registry 는 불변하는 속성들을 관리하는 문서이다.
디바이스 Registry 의 종류로 아래 3가지가 존재한다.
ThingThing TypeThing GroupThing, Thing Type 은 자체 Attribute 를 가지며
위에서 fleet indexing 기능을 설정했다면 aws iot search-index 기능과 디바이스 Registry, 디바이스 Shadow 를 사용해 특정 사물을 검색할 수 있다.
디바이스 Registry - 전체목록 검색
$ aws iot search-index --index-name "AWS-Things" --query-string "thingName:*"
디바이스 Shadow - 특정 속성 검색
Thing 중 thingTypeName 이 HDL500 이고 shadow.reported 의 status 가 uninitialized 인것만 검색
$ aws iot search-index --index-name "AWS-Things" --query-string "thingTypeName:HDL500 AND shadow.reported.status:uninitialized"
수만대의 MQTT 로그들을 검색 및 디버깅 하는것은 쉽지 않기에 AWS IoT 에서 로깅 검색식 또한 제공한다.
Global 로그 - 모든 로그가 아닌 Error 에 해당하는 로그만 출력 Things Group 로그 - 특정 속성을 사용해 해당 Group 만 출력되는 상세한 로그 출력
Cloud Watch 를 통해 IoT 로그들을 관리할 수 있다.
수천대의 센서정보가 모두 인터넷연결되는 것은 불가능하기 때문에 게이트웨이 역할을 하는 노드를 지정하고 해당 노드에서 Local Broker, Local Lambda, Local Device Shaow 와 같은 기능을 제공한다.
반드시 Aws IoT 서비스와 연결될 필요 없기 때문에 가격적으로, 네트워크적으로 이득이 발생한다.
노드에게 배포될 Greengrass 를 작성하고 노드에서 각각 알아서 동작할 수 있도록 한다.
대부분 대형 밴더사에서 제공하는 MPU 에서 돌아가는 Realtime OS
로컬의 Greengrass 와 연동하여 주로 리프노드에 해당하는 저전력PC 에서 FreeRTOS 를 사용한다.
개발장치 특정 타입, 특정 대상, 특정 지역에 대한 업데이트 기능을 OTA 로 제공한다.
AWSA 에서는 업데이트 기능을 Job 이라는 문서형식으로 관리하고
아래 4가지 기능을 제공한다.

Thing 이 Job 이 등록되면 대응하도록 토픽 subscribeJob을 생성하고 이미지를 S3 에 저장한다.Job Event 가 발생함으로써 Job 을 검색하는 함수 호출AWS Iot 로부터 Job 에 대한 상세정보 검색S3 로부터 이미지 다운로드Job 은 종류는 크게 2개로 나뉜다.
Continuous
한번 생성되면 삭제되지 않는다. 기기가 추가될 때 마다 지속적으로 Job Event 를 발행한다.
Snapshot
한번 특정 기기들을 대상으로 업데이트를 진행한다.