AWS IoT

AWS Lambda와 AWS DynamoDB를 활용한 데이터 저장 및 분석

임베디드 친구 2025. 4. 1. 10:25
728x90
반응형

AWS Lambda와 AWS DynamoDB를 활용한 데이터 저장 및 분석

1. 개요

AWS IoT 서비스를 활용하면 IoT 디바이스에서 수집한 데이터를 효율적으로 관리할 수 있습니다. 특히, AWS Lambda와 AWS DynamoDB를 활용하면 데이터를 서버 없이 실시간으로 처리하고 저장할 수 있습니다. 본 포스팅에서는 AWS IoT Core를 통해 수집된 온도 데이터를 AWS Lambda를 이용해 처리하고, DynamoDB에 저장한 후 이를 분석하는 방법을 설명합니다.

2. AWS IoT 시스템 아키텍처

아래는 IoT 디바이스에서 데이터를 수집하고 이를 분석하는 전체 아키텍처입니다.

  1. ESP32 IoT 디바이스: 온도 센서를 통해 주기적으로 데이터를 측정하고 MQTT 프로토콜을 이용해 AWS IoT Core로 전송합니다.
  2. AWS IoT Core: MQTT 메시지를 받아 AWS Lambda로 전달합니다.
  3. AWS Lambda: 데이터를 분석하고 AWS DynamoDB에 저장하는 역할을 합니다.
  4. AWS DynamoDB: 수집된 데이터를 저장하고 분석을 위해 활용합니다.

3. ESP32 IoT 디바이스 설정

ESP32는 AWS IoT Core로 데이터를 전송하는 역할을 합니다. 이를 위해 ESP-IDF 및 AWS IoT Device SDK for Embedded C를 활용합니다.

3.1 ESP32 MQTT 연결 코드

ESP32에서 MQTT를 사용하여 온도 데이터를 AWS IoT Core로 전송하는 코드입니다.

#include <stdio.h>
#include "esp_log.h"
#include "nvs_flash.h"
#include "mqtt_client.h"

static const char *TAG = "MQTT_EXAMPLE";

static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) {
    ESP_LOGI(TAG, "MQTT event received");
}

void app_main(void) {
    esp_log_level_set("*", ESP_LOG_INFO);
    nvs_flash_init();

    esp_mqtt_client_config_t mqtt_cfg = {
        .uri = "mqtts://YOUR_AWS_IOT_ENDPOINT",
        .cert_pem = "YOUR_AWS_ROOT_CA_CERT",
        .client_cert_pem = "YOUR_AWS_DEVICE_CERT",
        .client_key_pem = "YOUR_AWS_DEVICE_PRIVATE_KEY"
    };

    esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg);
    esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL);
    esp_mqtt_client_start(client);

    while (1) {
        float temperature = 25.0 + (rand() % 10); // 가상의 온도 데이터 생성
        char payload[50];
        snprintf(payload, sizeof(payload), "{\"temperature\": %.2f}", temperature);
        esp_mqtt_client_publish(client, "iot/temp", payload, 0, 1, 0);
        vTaskDelay(5000 / portTICK_PERIOD_MS);
    }
}

이 코드에서는 ESP32가 주기적으로 온도를 측정하여 AWS IoT Core로 MQTT 메시지를 전송하는 방식으로 동작합니다.


4. AWS Lambda를 활용한 데이터 처리

AWS IoT Core에서 MQTT 메시지를 구독한 후 AWS Lambda 함수를 호출하여 데이터를 DynamoDB에 저장할 수 있도록 설정해야 합니다.

4.1 AWS Lambda 함수 작성

다음은 AWS Lambda에서 MQTT 데이터를 받아 AWS DynamoDB에 저장하는 Python 코드입니다.

import json
import boto3
from datetime import datetime

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('IoT_Temperature_Data')

def lambda_handler(event, context):
    for record in event['Records']:
        payload = json.loads(record['body'])
        temperature = payload.get('temperature')

        if temperature is None:
            return {
                'statusCode': 400,
                'body': json.dumps('Invalid Data')
            }

        item = {
            'device_id': 'ESP32',
            'timestamp': datetime.utcnow().isoformat(),
            'temperature': temperature
        }

        table.put_item(Item=item)

    return {
        'statusCode': 200,
        'body': json.dumps('Data stored successfully')
    }

이 함수는 AWS IoT Core의 Rule Engine을 통해 MQTT 메시지를 수신하고, 이를 AWS DynamoDB에 저장하는 역할을 합니다.


  1. AWS DynamoDB 테이블 생성
    AWS DynamoDB에 데이터를 저장하기 위해 먼저 테이블을 생성해야 합니다.

5.1 DynamoDB 테이블 생성

  1. AWS 콘솔에서 DynamoDB 서비스로 이동합니다.
  2. 새 테이블 생성(Create Table) 을 선택합니다.
  3. 테이블 이름(Table Name): IoT_Temperature_Data
  4. 파티션 키(Partition Key): device_id (String)
  5. 정렬 키(Sort Key): timestamp (String)

이렇게 설정하면 특정 디바이스의 데이터를 시간순으로 저장할 수 있습니다.


6. DynamoDB에서 데이터 조회 및 분석

저장된 데이터를 조회하고 분석하는 방법을 설명하겠습니다.

6.1 저장된 데이터 조회

Python을 이용하여 DynamoDB에서 저장된 데이터를 조회할 수 있습니다.

import boto3

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('IoT_Temperature_Data')

response = table.scan()
for item in response['Items']:
    print(item)

이 코드를 실행하면 저장된 온도 데이터를 확인할 수 있습니다.

6.2 온도 이상 감지

Lambda를 활용하여 온도가 임계값(예: 30°C 이상) 을 초과할 경우 알림을 보내도록 설정할 수도 있습니다.

def lambda_handler(event, context):
    for record in event['Records']:
        payload = json.loads(record['body'])
        temperature = payload.get('temperature')

        if temperature > 30:
            print("Warning: High Temperature Detected!", temperature)

    return {
        'statusCode': 200,
        'body': json.dumps('Monitoring Complete')
    }

이렇게 하면 온도가 30°C를 초과하는 경우 경고 메시지를 출력할 수 있습니다.


7. 결론

본 포스팅에서는 AWS Lambda와 AWS DynamoDB를 활용하여 IoT 데이터를 저장하고 분석하는 방법을 설명하였습니다. 정리하면 다음과 같습니다.

  1. ESP32 디바이스에서 온도를 측정하고 MQTT를 통해 AWS IoT Core로 전송함.
  2. AWS IoT Core에서 수집된 데이터를 AWS Lambda로 전달함.
  3. AWS Lambda에서 데이터를 분석하고 AWS DynamoDB에 저장함.
  4. DynamoDB에서 저장된 데이터를 조회하고 분석할 수 있음.
  5. 특정 온도 이상이 감지되면 경고를 보낼 수 있음.

이러한 구조를 활용하면 IoT 데이터를 실시간으로 처리하고 분석하는 강력한 시스템을 구축할 수 있습니다.

반응형