최근에 AWS IoT 를 IAM으로 접근해야 할 일이 생겼다.
검색해보니 IoT는 보통 .pem, .crt 와 같은 인증서 파일이 내장되어야만 진행되는 예시들이 너무 많아서
검색에 수많은 시간을 허비했다.
비슷한 고생을 하는 분이 있다면 수고를 덜었으면 하는 마음에 글을 쓴다.
요약
1. SDK를 설치 ( pip install awsiotsdk, awscrt )
2. https://github.com/aws/aws-iot-device-sdk-python-v2.git 에서 /samples/pubsub.py 를 참고하면 된다.
서론
먼저 알아야 할 것으로 IAM으로 접근한다는 말에는 "권한"이 주어졌을 뿐, "인증"이 추가로 진행되어야 한다.
AWS IoT에서 통신 프로토콜은 MQTT, HTTP가 있는데, 자세한 내용은 아래 링크를 참고하면 된다.
https://docs.aws.amazon.com/ko_kr/iot/latest/developerguide/protocols.html
나는 IAM에서 Accesskey, SecretAccessKey를 받았으므로 SigV4를 사용하기로 했다.
SigV4는 아마존에서 자체적으로 만든 인증방법으로 인증을 얻는 과정은 아래의 링크에 표시되어 있는데,
쉽게 설명하면 메타데이터를 Hash-256 알고리즘으로 암호화시키는 작업이다.
https://docs.aws.amazon.com/ko_kr/ko_kr/general/latest/gr/sigv4_signing.html
파이썬으로 과정을 구현한 자세한 예시는 아래의 링크에서 볼 수 있다.
https://docs.aws.amazon.com/ko_kr/ko_kr/general/latest/gr/sigv4-signed-request-examples.html
막상 코드를 보면 엄청 어렵지는 않은 느낌이지만, 검색하다 보니
AWS에서도 이런 인증작업을 구현해놓았다. (압도적 감사...!)
서론이 길었는데, 이제부터 본론을 짧고 굵게 말하겠다.
본론
검색하다보니 AWS에서는 이런 작업을 이미 완료해놓았다는 걸 알았다.
https://github.com/aws/aws-iot-device-sdk-python-v2.git
나는 SigV4 를 사용했기 때문에
깃허브 링크에서 awsiot/mqtt_connection_builder.py 를 보면 알 수 있었고,
코드 내용 중에 websockets_with_default_aws_signing 함수를 보니 자세히 알 수 있었다.
아래에 보면 return websocket 기반으로 handshake한다는 내용이고 그 함수를 보면 이렇다.
그리고 이 코드가 awsiotsdk 에서 불러와서 사용되고 있는 것을 볼 수 있었다.
https://github.com/aws/aws-iot-device-sdk-python-v2/blob/main/samples/pubsub.py
그럼 IAM으로 사용했기 때문에 crendentials_provider 를 사용하였고, credentials_provider는 어떻게 되는 것인지
다시 들어가보고, 계속 들어가다보면 _awscrt 라는 어떤 무언가가 나오는데,
C언어로부터 래핑된 것이라는 것을 알 수 있게 된다.
따라서 정확하게 SigV4 와 같은 절차가 이루어지는지 알려면 C언어까지 가봐야되서 여기서 놓기로 했다.
결론
정확하게 코드를 들여다 볼 수는 없었지만 awscrt 라이브러리를 이용하면
IAM 기반의 AccessKey, SecretAccessKey 만으로 MQTT Pub/Sub이 가능한 점을 볼 수 있었다.
게다가 이벤트리스너 형식이라 이벤트가 발생할 때마다 통신이 가능하므로 편리하게 사용할 수 있을 것 같다.
참고
https://docs.aws.amazon.com/ko_kr/iot/latest/developerguide/protocols.html
'DevOps > AWS' 카테고리의 다른 글
[API Gateway] Private VPC 로 구축 방법 (1) | 2022.11.24 |
---|---|
[Kubernetes] error: You must be logged in to the server (Unauthorized) (0) | 2022.07.25 |
[AWS] IAM(Identity and Access Management)이란? (0) | 2022.03.02 |
[AWS] Sagemaker endpoint job delete (4) | 2021.07.04 |
[AWS] Sagemaker Groundtruth 403 error (0) | 2021.05.31 |