Arduino × AWSサーバーレスで作るIoT温度モニタリングシステム（仮）【第1回】

# AWSでクラウド側の受け口を作ってみるかぁ

## はじめに

2024年の年末、ふと **「仕事とはまったく違う分野のシステム開発に挑戦してみたい」** という気持ちが湧いてきました。

普段は業務向けのソフトウェア開発に携わっていますが、  
ここ最近、「手を動かしてリアルなデバイスとつなぐような開発」にどこか惹かれていたんです。

ちょうど年末年始（2024年12月末〜2025年1月上旬）でまとまった時間が取れそうだったこともあり、  
これを機に **「センサー × モバイルアプリ × クラウド連携」** という、  
いわゆる **IoTっぽいことをゼロからやってみよう！** と動き出しました。

---

Bluetoothを使ったスマホアプリの開発経験はあったので、  
「じゃあデータ送信はAndroidアプリでやればいいかも」と思いつき、  
さらにArduinoを使えばセンサー類のプロトタイピングも手軽にできる。

気づけば、  
「**Arduino → Android → AWS (API Gateway → Lambda → DynamoDB)**」という構成が頭の中で浮かんでいました。

---

このプロジェクトでは、そんな“ちょっとした思いつき”から始まった  
**個人による実験的なIoTシステムの構築記録**を、段階的にまとめていきます。

まずは第一歩として、**クラウド側の受け口を作ってデータを送信できるかどうかを確認してみる**ところからスタートです！

:::note info
この記事は「Arduino × AWSサーバーレスで作るIoT温度モニタリングシステム」シリーズの一部です。シリーズの全体リンクは記事の末尾にまとめてあります！
:::

---

## 全体構成（今回の範囲）

```
Mac (cURL) → API Gateway → Lambda（Python）→ DynamoDB
```

まだArduinoやセンサーは使っていないけど、  
**AWS上でクラウド側の受け口（API）とデータベースの登録までは完成！**

---

## Lambda関数（Python）

Lambda関数は以下のような形にしました。


```python
import json
import boto3
import os
from datetime import datetime
from decimal import Decimal

# DynamoDBクライアントを初期化（環境変数からテーブル名を取得）
TABLE_NAME = os.environ.get('DYNAMODB_TABLE_NAME', '********')  # ★ 環境変数に設定すること
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table(TABLE_NAME)

def lambda_handler(event, context):
    try:
        # リクエストボディをパース
        data = json.loads(event['body'])

        # 必須項目: temperature, timestamp
        if 'temperature' not in data or 'timestamp' not in data:
            return {
                'statusCode': 400,
                'body': json.dumps({'error': 'Missing required fields'})
            }

        temperature = Decimal(str(data['temperature']))
        timestamp = data['timestamp']

        # オプション項目: humidity（省略可）
        humidity = Decimal(str(data['humidity'])) if 'humidity' in data else None

        # 登録データの構築
        item = {
            'id': str(datetime.now().timestamp()),  # 一意のID
            'temperature': temperature,
            'timestamp': timestamp
        }

        if humidity is not None:
            item['humidity'] = humidity

        # データをDynamoDBに保存
        table.put_item(Item=item)

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

    except Exception:
        # エラー詳細は公開しない
        return {
            'statusCode': 500,
            'body': json.dumps({'error': 'Internal server error'})
        }
```

---

## POSTの内容

`curl`で以下のようなJSONをAPI Gatewayに送信しています：

```json
{
  "temperature": 20.3,
  "timestamp": "2024-12-28T23:27:00Z"
}
```

---

## 結果スクショ 📸

### ✅ DynamoDBにデータ登録できた！

**データがしっかり登録されている様子：**

![curl_screenshot](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21269/3271b01e-d9e5-4ac3-81fa-90429d925d5b.jpeg)

---

### ✅ curlでのPOST送信も成功！

**Macのターミナルから送信したときの様子：**

![dynamodb_screenshot](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21269/0e30a19e-6fa8-4568-b3be-b2b6f26c9db0.jpeg)
---

## ここまでの感想と次の一手

やってみた感想としては、**AWSのサーバーレス構成は想像以上にスムーズ！**

今後は、以下のように発展させていく予定です：

- Arduinoで温度データを取得（DHT11 or DHT22）
- HC-06モジュールでBluetooth送信
- Androidアプリで受信し、そのままAWS APIにPOST！

---

## おわりに

今回はまだ「クラウド側だけ」だけど、  
**ちゃんとデータが保存されると一気にモチベ爆上がり⤴️**

次回は、**Arduinoとセンサーのリアルな動き**を交えて、もっとIoTっぽくしていきます！

---

## シリーズ記事一覧

- 【第1回】[AWSでクラウド側の受け口を作ってみる](https://qiita.com/takataka5845/items/b7d129a738b7365cc602) （このページ）
- 【第2回】[光センサーでArduinoからMacにシリアル通信](https://qiita.com/takataka5845/items/ea7999588c7c9957acd7) 
- 【第3回】[DHT22で温湿度を取得してシリアル送信](https://qiita.com/takataka5845/items/3aff19c560c1457829a5) 
- 【第4回】[Bluetooth通信でセンサーデータをAndroidに送信](https://qiita.com/takataka5845/items/53f2d29991f7b1023949) 
- 【第5回】[自作アプリでBluetooth接続＆温湿度データ受信](https://qiita.com/takataka5845/items/dc4753bc410dd0daa0d4)
- 【第6回】[クラウド連携でDynamoDBへのPOST＆完結編](https://qiita.com/takataka5845/items/28ba83ef0087b16525b6)

> ※今後の更新もお楽しみに！

---

つづく…（[第2回](https://qiita.com/takataka5845/items/ea7999588c7c9957acd7)へ）🔧📡🌐