AWS IoT

IoT Thing(디바이스) 등록 및 인증서 발급

임베디드 친구 2025. 3. 26. 09:57
728x90
반응형

IoT Thing(디바이스) 등록 및 인증서 발급

1. 개요

AWS IoT를 활용하여 IoT 디바이스를 AWS 클라우드에 연결하려면, Thing(디바이스) 등록 및 인증서 발급 과정이 필요합니다. 이 과정에서는 AWS IoT Core에 디바이스를 Thing으로 등록하고, 인증서를 생성하여 보안 연결을 설정합니다. 이 글에서는 ESP32를 기반으로 AWS IoT Device SDK for Embedded C를 활용하여 등록하는 방법을 설명하며, AWS IoT 서버 측의 설정을 Python 코드로 구현합니다.

2. AWS IoT Thing(디바이스) 등록

AWS IoT 콘솔 또는 AWS CLI를 이용하여 디바이스를 등록할 수 있습니다. 여기서는 AWS CLI를 사용한 방법을 소개합니다.

2.1 AWS CLI를 이용한 Thing 등록

AWS CLI에서 다음 명령어를 실행하여 Thing을 생성합니다.

aws iot create-thing --thing-name MyESP32Device

성공적으로 실행되면 JSON 형식의 응답이 반환됩니다.

{
    "thingName": "MyESP32Device",
    "thingArn": "arn:aws:iot:region:account-id:thing/MyESP32Device"
}

2.2 인증서 및 키 생성

다음으로, 디바이스가 AWS IoT Core와 안전하게 통신할 수 있도록 X.509 인증서 및 키를 생성합니다.

aws iot create-keys-and-certificate --set-as-active

실행하면 아래와 같은 JSON 응답이 반환됩니다.

{
    "certificateArn": "arn:aws:iot:region:account-id:cert/certificate-id",
    "certificateId": "certificate-id",
    "certificatePem": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----\n",
    "keyPair": {
        "PublicKey": "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----\n",
        "PrivateKey": "-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----\n"
    }
}

위에서 반환된 인증서, 개인 키, 공용 키를 안전하게 저장합니다.

2.3 정책 생성 및 인증서 연결

IoT 디바이스가 AWS IoT Core와 통신하려면 적절한 권한이 필요합니다. 이를 위해 정책을 생성하고 인증서에 연결합니다.

2.3.1 정책 생성

아래 정책(JSON 파일)을 생성합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect",
                "iot:Publish",
                "iot:Subscribe",
                "iot:Receive"
            ],
            "Resource": "*"
        }
    ]
}

위 내용을 iot_policy.json 파일로 저장한 후, 다음 명령어를 실행하여 정책을 생성합니다.

aws iot create-policy --policy-name "MyIoTPolicy" --policy-document file://iot_policy.json

2.3.2 정책을 인증서에 연결

생성한 정책을 앞서 만든 인증서에 연결합니다.

aws iot attach-policy --policy-name "MyIoTPolicy" --target certificate-id

2.3.3 Thing과 인증서 연결

aws iot attach-thing-principal --thing-name "MyESP32Device" --principal "arn:aws:iot:region:account-id:cert/certificate-id"

이제 AWS IoT Core에 등록된 Thing과 인증서가 연결되었습니다.

3. ESP32에서 AWS IoT 연결 (C 코드)

ESP32는 AWS IoT Device SDK for Embedded C를 사용하여 AWS IoT Core와 연결할 수 있습니다.

3.1 프로젝트 환경 설정

ESP32 환경에서 AWS IoT SDK for Embedded C를 설치하려면 IDF 프로젝트 폴더에서 다음을 실행합니다.

git clone https://github.com/aws/aws-iot-device-sdk-embedded-C.git

3.2 MQTT 연결 코드 (ESP32)

아래는 ESP32에서 AWS IoT Core에 MQTT로 연결하는 예제 코드입니다.

#include "aws_iot_mqtt_client_interface.h"

#define AWS_IOT_MQTT_HOST "your-aws-endpoint.amazonaws.com"
#define AWS_IOT_MQTT_PORT 8883
#define CLIENT_ID "MyESP32Device"
#define TOPIC "iot/topic/temp"

void aws_iot_task(void *param) {
    AWS_IoT_Client client;
    IoT_Client_Init_Params mqttInitParams = IoT_Client_Init_Params_initializer;

    mqttInitParams.enableAutoReconnect = false;
    mqttInitParams.pHostURL = AWS_IOT_MQTT_HOST;
    mqttInitParams.port = AWS_IOT_MQTT_PORT;

    IoT_Error_t rc = aws_iot_mqtt_init(&client, &mqttInitParams);
    if (rc != SUCCESS) {
        printf("MQTT Initialization Failed!\n");
        return;
    }

    IoT_Client_Connect_Params connectParams = IoT_Client_Connect_Params_initializer;
    connectParams.clientIDLen = (uint16_t) strlen(CLIENT_ID);
    connectParams.keepAliveIntervalInSec = 10;

    rc = aws_iot_mqtt_connect(&client, &connectParams);
    if (rc != SUCCESS) {
        printf("MQTT Connection Failed!\n");
        return;
    }

    char message[] = "Hello from ESP32";
    rc = aws_iot_mqtt_publish(&client, TOPIC, strlen(TOPIC), message, strlen(message), 0, 0);
    if (rc != SUCCESS) {
        printf("Failed to publish message!\n");
    }

    aws_iot_mqtt_disconnect(&client);
}

4. AWS IoT 서버에서 데이터 처리 (Python 코드)

AWS IoT Core에서 수신된 메시지를 처리하려면 AWS IoT MQTT 라이브러리를 사용합니다.

import paho.mqtt.client as mqtt

def on_message(client, userdata, message):
    print(f"Received message: {message.payload.decode()} on topic {message.topic}")

client = mqtt.Client()
client.on_message = on_message
client.connect("your-aws-endpoint.amazonaws.com", 8883, 60)
client.subscribe("iot/topic/temp")
client.loop_forever()

5. 마무리

이번 포스팅에서는 AWS IoT Thing 등록, 인증서 발급, ESP32 연결 및 AWS IoT 서버에서 데이터 처리까지 전체적인 과정을 다루었습니다. ESP32에서 온도 데이터를 AWS IoT Core로 전송하고, 이를 서버에서 처리하는 구조를 기반으로 다양한 IoT 프로젝트를 확장할 수 있습니다.

반응형