Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Conectar un ESP32 a AWS IoT Core paso a paso

2026年10月05日に「Dev.to」が公開したITニュース「Conectar un ESP32 a AWS IoT Core paso a paso」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

ESP32をAWS IoT CoreにMQTT over TLSで接続し、LEDをクラウドから制御するIoTシステムの構築法を解説。Device Shadowで状態を同期し、独自の証明書と最小限の権限ポリシーで安全に運用する。必要な設定やコード、トラブルシューティングも網羅する。

出典: Conectar un ESP32 a AWS IoT Core paso a paso | Dev.to公開日:

ITニュース解説

ESP32をAmazon Web Services (AWS) のIoTサービス「AWS IoT Core」に接続し、LEDのオンオフをクラウド経由で制御・監視する方法について解説する。このプロジェクトは、小さなマイコンボードであるESP32を使ってインターネット経由でデバイスを操作し、その状態をクラウドに報告する、実用的なIoTシステムの基礎となる。

このシステムを構築するには、まずESP32ボード(ESP32-S3やESP32-C3が推奨される)、Arduino IDE開発環境、そしてAWSアカウントが必要だ。Arduino IDEにはESP32ボードのサポートをインストールし、さらにMQTT通信用の「MQTT」ライブラリ(256dpi/arduino-mqtt)と、JSONデータ処理用の「ArduinoJson」ライブラリ(バージョン7)を追加する必要がある。

ESP32とAWS IoT Coreの接続は、MQTTという軽量なメッセージングプロトコルを、TLS (Transport Layer Security) という暗号化技術を用いて行う。これにより、通信の安全性が確保される。デバイスの認証には、ユーザー名とパスワードの代わりにX.509電子証明書を使用する。AWS IoT Core側では、「Thing」(デバイスの仮想的な表現)を作成し、そのThingと証明書に対して「ポリシー」というアクセスルールを適用する。このポリシーは「最小権限の原則」に基づき、デバイスが必要とする最低限の操作のみを許可するように設定することが極めて重要だ。例えば、特定のクライアントIDでの接続と、特定のDevice Shadow関連トピックでのメッセージ送受信のみを許可するように設定する。

「Device Shadow」は、AWS IoT Coreが各デバイスのために保持するJSON形式の仮想的な状態情報である。これは「desired(希望する状態)」と「reported(報告された状態)」の二つの部分から構成される。desiredは、クラウドアプリケーションなどからデバイスに指示したい状態(例:「LEDをオンにする」)を示す。reportedは、デバイスが実際にその指示を実行し、現在の状態を報告した結果を示す。desiredとreportedの状態が異なる場合、AWS IoT Coreは「delta」という差分メッセージを生成してデバイスに送信する。デバイスはこのdeltaを受け取ってアクションを実行し、その結果をreportedとして報告することで、クラウド上のShadowとデバイスの実際の状態を同期させる。このShadowの仕組みの大きなメリットは、デバイスが一時的にオフラインになっても、クラウド側でdesired状態を設定しておけば、デバイスがオンラインになった際に自動的に最新の状態に同期できる点だ。

具体的な設定手順として、まずAWS IoT CoreコンソールまたはAWS CLIを使って、ESP32を表すThingを「mi-esp32」のような名前で作成する。この際、デバイスを識別するためのX.509証明書、秘密鍵、そしてAWSのルート証明書を生成・ダウンロードする。これらの証明書ファイルは厳重に保管し、絶対に公開してはならない。

次に、セキュリティポリシーを作成する。多くのチュートリアルで見られる全ての権限を許可する設定はセキュリティ上非常に危険なので避けるべきだ。このガイドでは、iot:ConnectアクションでThing名と一致するクライアントIDでの接続のみを許可し、iot:Subscribe、iot:Receive、iot:PublishアクションでDevice Shadowに関連する特定のトピック(例えば、$aws/things/mi-esp32/shadow/update/deltaや$aws/things/mi-esp32/shadow/updateなど)のみを許可するポリシーを設定する。このポリシーをJSON形式で記述し、AWS IoT Coreにアップロードした後、先ほど作成した証明書とThingにアタッチする。

また、AWS IoT CoreのエンドポイントURLを取得する必要がある。これはデバイスが接続するAWSのサーバーアドレスであり、必ず「ATS」タイプのエンドポイントを使用する。

これらの認証情報(AWSのルート証明書、デバイスの証明書、デバイスの秘密鍵)と、Wi-FiのSSID、パスワード、Thingの名前、AWS IoTエンドポイントURLを、ESP32のスケッチと同じフォルダにsecrets.hというファイル名で保存する。これらの情報は、C++の生の文字列形式で定義し、プログラムから簡単にアクセスできるようにする。特に秘密鍵を含むsecrets.hファイルは、Gitなどのバージョン管理システムを使用する場合は.gitignoreに追加し、公開リポジトリにアップロードしないよう細心の注意を払う。

ESP32のプログラムコードは、Wi-Fiへの接続、AWS IoT CoreへのMQTT接続、そしてDevice Shadowのメッセージ処理を主な役割とする。WiFiClientSecureクラスでTLS接続を確立し、MQTTClientライブラリでMQTT通信を行う。setCACert、setCertificate、setPrivateKey関数を使ってsecrets.hに保存した証明書情報を設定する。onMessage関数はAWS IoT Coreからメッセージが届いたときに呼び出され、受信したJSONメッセージを解析してLEDの状態を更新する。特にtopicDeltaとtopicGetAcceptedというShadow関連トピックを購読し、それらのメッセージからdesired状態を抽出してLEDを制御する。LEDの状態が更新されたら、reportLed関数を使ってreported状態としてAWS IoT Coreに報告する。コードの中では、MQTTクライアントのバッファサイズを大きく設定すること、TLSセッションが安定するまで少し待ってから購読を開始すること、そしてデバイスが再接続した際にshadow/getトピックにパブリッシュして最新のShadow状態を確実に取得することが、安定した動作のために重要となる。

ESP32にプログラムを書き込んだ後、シリアルモニターで接続状況を確認する。その後、AWS IoT CoreコンソールからDevice Shadowの「Classic Shadow」を編集し、{"state": {"desired": {"led": "on"}}}のようなJSONペイロードを送信すると、クラウドからLEDをオンにする指示が出され、ESP32がこれを受けてLEDを点灯させ、その状態をクラウドに報告する。シリアルモニターには、deltaメッセージの受信とreported状態の更新が確認できるはずだ。

開発中に遭遇しやすい問題として、MQTTライブラリの選択が原因でpublish()が成功してもメッセージがAWSに届かないケースがある。この場合、より安定した「MQTT」ライブラリ(256dpi/arduino-mqtt)への変更が効果的だ。また、接続が確立されてすぐに切断される場合は、セキュリティポリシーの設定ミスやクライアントIDの不一致が原因であることが多い。Thing名とクライアントID、およびポリシー内のリソース記述が完全に一致しているか、必要な全てのトピックがポリシーで許可されているかを確認する。AWS CloudWatchのログを有効にすると、AUTHORIZATION_FAILUREのような具体的なエラーメッセージで原因を特定できる。Device Shadowがレポートを拒否する場合は、shadow/update/rejectedトピックを購読することで、JSONの形式エラーやバージョン不一致などの具体的な理由を知ることができる。ESP32-C3のようなメモリが少ないボードでは、TLSやJSON処理が原因でスタックオーバーフローが発生し、再起動を繰り返すことがある。この場合は、SET_LOOP_TASK_STACK_SIZE(16 * 1024);のようなコードを追加してスタックサイズを増やすことで解決できる。Device Shadowのドキュメントサイズには上限があるため、保存する設定情報はコンパクトに保つべきだ。

このプロジェクトにかかる費用は、個人利用であれば非常に少ない。AWS IoT Coreはメッセージ数や接続時間に基づいて課金されるが、ESP32が24時間稼働しても月額数円程度の費用に収まることが多い。

IoTプロジェクトにおいてセキュリティは非常に重要だ。本番運用では、デバイスごとに異なる証明書を使用し、一つが侵害されても他への影響を最小限に抑えるべきだ。また、このガイドで示したように、最小権限のポリシーを厳守し、Resource: "*"のような設定は絶対に避ける。デバイスの秘密鍵をコードリポジトリに含めないことも必須の対策である。

このシステムでは、ESP32を制御するために自前のサーバーを構築する必要はない。AWS IoT CoreがMQTTブローカーとDevice Shadowを提供し、アプリケーションやAWS Lambda関数から直接Desired状態を変更できるため、サーバー管理の手間を省ける。Device Shadowの大きな利点は、デバイスがオフラインの間も状態を保持し、再接続時に自動的に同期できることにある。これにより、メッセージが失われることなく、常に最新の状態を反映させることが可能だ。このアプローチは、ESP32の種類に関わらずほとんどのボードで機能し、必要に応じてスタックサイズの調整を行うことで、よりメモリが少ないボードでも安定動作が見込める。

1977文字

関連コンテンツ

関連IT用語