DevOps/AWS

[AWS] IAM 기반 Python으로 IoT Core MQTT 사용

깜태 2022. 3. 4. 11:33
728x90

최근에 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

 

디바이스 통신 프로토콜 - AWS IoT Core

디바이스 통신 프로토콜 AWS IoT Core는 메시지를 게시하고 구독하기 위해 MQTT 및 MQTT over WebSocket Secure(WSS) 프로토콜을 사용하는 디바이스 및 클라이언트와, 메시지를 게시하기 위해 HTTPS 프로토콜을

docs.aws.amazon.com

 

나는 IAM에서 Accesskey, SecretAccessKey를 받았으므로 SigV4를 사용하기로 했다.

SigV4는 아마존에서 자체적으로 만든 인증방법으로 인증을 얻는 과정은 아래의 링크에 표시되어 있는데,

쉽게 설명하면 메타데이터를 Hash-256 알고리즘으로 암호화시키는 작업이다.

 

https://docs.aws.amazon.com/ko_kr/ko_kr/general/latest/gr/sigv4_signing.html

 

서명AWS서명 버전 4를 사용하여 요청 처리 - AWS 일반 참조

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

 

파이썬으로 과정을 구현한 자세한 예시는 아래의 링크에서 볼 수 있다.

https://docs.aws.amazon.com/ko_kr/ko_kr/general/latest/gr/sigv4-signed-request-examples.html

 

서명 버전 4 서명 프로세스의 예 (Python) - AWS 일반 참조

중 하나를 사용하는 경우AWSSDK(SDK for C++, SDK for Go, SDK for Java,AWS SDK for JavaScript,AWS SDK for .NET, SDK for PHP, Python용 SDK (Boto3) 또는 Ruby용 SDK) 에 대해 서명키를 생성하고 인증 정보를 요청에 추가하는 단

docs.aws.amazon.com

 

 

막상 코드를 보면 엄청 어렵지는 않은 느낌이지만, 검색하다 보니

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

 

GitHub - aws/aws-iot-device-sdk-python-v2: Next generation AWS IoT Client SDK for Python using the AWS Common Runtime

Next generation AWS IoT Client SDK for Python using the AWS Common Runtime - GitHub - aws/aws-iot-device-sdk-python-v2: Next generation AWS IoT Client SDK for Python using the AWS Common Runtime

github.com

 

그럼 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

728x90