概要
AWS IoT Coreは、Amazon Web Services(AWS)が提供するフルマネージドなIoTクラウドサービスです。数十億台規模のデバイスとクラウドを安全に接続し、デバイスから送信されるメッセージを受信・処理・ルーティングする機能を提供します。サーバーの管理やスケーリングはAWSが行うため、開発者はアプリケーションロジックの開発に専念できます。
AWS IoT Coreの主要コンポーネントは以下の通りです。
- Device Gateway: MQTTおよびHTTPプロトコルでデバイスからの接続を受け付ける
- Message Broker: パブリッシュ/サブスクライブモデルでメッセージを仲介する
- Rules Engine: SQLライクな構文でメッセージをフィルタリング・変換し、各AWSサービスへルーティングする
- Device Shadow: デバイスの最新状態をJSON形式でクラウドに保持する
- Device Defender: デバイスのセキュリティ状態を監査・モニタリングする
- Device Registry: 接続デバイスのメタデータ(属性、グループなど)を管理する
2023年時点でAWS IoT Coreは月間数兆件を超えるメッセージを処理する実績を持ち、世界中の製造業、自動車、ヘルスケア、スマートホームなど多様な分野で採用されています。
歴史・背景
AWSは2015年10月のAWS re:Inventカンファレンスで「AWS IoT」を発表しました。当時は基本的なMQTTブローカー機能とDevice Shadowが主な機能でしたが、その後急速に機能が拡充されてきました。
2016年には「AWS Greengrass」が登場し、Lambda関数をエッジデバイス上で実行できるようになりました。2018年頃からはDevice Defender(セキュリティ監査)、Device Registry強化、Bulk Provisioning(大量デバイスの一括登録)などエンタープライズ向け機能が充実しました。
2021年以降はAWS IoT FleetWise(車載データ向け)、AWS IoT TwinMaker(デジタルツイン構築)など、特定業界・ユースケース向けの専門サービスが追加され、単なるメッセージングプラットフォームから総合的なIoTソリューション基盤へと進化しています。
技術仕様
対応プロトコルとエンドポイント
| プロトコル | ポート | 用途 |
|---|---|---|
| MQTT over TLS | 8883 | 標準のデバイス通信 |
| MQTT over WebSocket | 443 | ファイアウォール越え |
| HTTPS | 443 | 軽量デバイスのHTTP通信 |
| MQTT 3.1.1 | サポート | 標準MQTTバージョン |
| MQTT 5.0 | サポート | 拡張機能(ユーザープロパティ等) |
サービス制限(デフォルト)
| 項目 | 制限値 |
|---|---|
| 同時接続数 | アカウントあたり500,000(申請で拡張可) |
| メッセージサイズ | 最大128 KB |
| トピック長 | 最大256バイト |
| トピック階層 | 最大7レベル |
| Device Shadow サイズ | 最大8 KB |
| Rules Engine同時実行 | 20,000ルール/秒 |
料金体系(東京リージョン、2024年現在)
| 項目 | 料金 |
|---|---|
| 接続 | $0.042/100万分 |
| メッセージング | $1.00/100万メッセージ(最初の10億) |
| Device Shadow操作 | $1.25/100万操作 |
| Rules Engine | $0.15/100万ルール実行 |
| 無料枠 | 毎月250,000メッセージ(12ヶ月間) |
動作原理
認証とセキュリティ
AWS IoT Coreはすべての通信でTLSを必須とし、以下の認証方式をサポートします。
認証方式:
1. X.509証明書(推奨)
- デバイスごとにAWSが発行した証明書を使用
- 証明書にIoTポリシーをアタッチして認可を制御
2. IAM認証
- AWS IAMユーザー/ロールでの認証(主にサーバー側)
- SigV4署名を使用
3. カスタム認証
- Lambda関数による独自認証ロジック
- 既存の認証基盤との統合に有効
MQTTトピック設計とRules Engine
-- Rules Engine: SQLで条件を記述してルーティング
-- 例: 温度が30度を超えたらSNSでアラート
SELECT temperature, device_id, timestamp
FROM 'factory/+/telemetry'
WHERE temperature > 30
このルールにより、条件に合致したメッセージをAmazon SNS、DynamoDB、S3、Lambda、Kinesis Streamなど20以上のAWSサービスへ自動的に転送できます。
Device Shadow の動作
// Device Shadow の構造
{
"state": {
"reported": {
"temperature": 25.3,
"led": "off",
"firmware_version": "1.2.0"
},
"desired": {
"led": "on"
}
},
"metadata": {...},
"version": 42,
"timestamp": 1700000000
}
desired(クラウドからの指示)とreported(デバイスからの報告)の差分(delta)がデバイスに通知され、デバイスはそれに基づいて動作を変更します。
用途・ユースケース
組み込みデバイスからのデータ送信
ESP32やSTM32などのマイコンからAWS IoT Coreへ接続する実装例:
#include "aws_iot_mqtt_client_interface.h"
#include "aws_iot_config.h"
IoT_Client_Init_Params mqttInitParams = iotClientInitParamsDefault;
mqttInitParams.enableAutoReconnect = true;
mqttInitParams.pHostURL = AWS_IOT_MQTT_HOST;
mqttInitParams.port = AWS_IOT_MQTT_PORT;
mqttInitParams.pRootCALocation = ROOT_CA_PATH;
mqttInitParams.pDeviceCertLocation = DEVICE_CERT_PATH;
mqttInitParams.pDevicePrivateKeyLocation = DEVICE_KEY_PATH;
mqttInitParams.mqttCommandTimeout_ms = 20000;
mqttInitParams.tlsHandshakeTimeout_ms = 5000;
AWS_IoT_Client client;
aws_iot_mqtt_init(&client, &mqttInitParams);
IoT_Client_Connect_Params connectParams = iotClientConnectParamsDefault;
connectParams.keepAliveIntervalInSec = 10;
connectParams.pClientID = "my-device-001";
connectParams.clientIDLen = strlen("my-device-001");
aws_iot_mqtt_connect(&client, &connectParams);
// テレメトリデータを送信
char payload[256];
snprintf(payload, sizeof(payload),
"{\"temperature\":%.1f,\"humidity\":%.1f}",
temperature, humidity);
IoT_Publish_Message_Params pubParams;
pubParams.qos = QOS1;
pubParams.payload = (void *)payload;
pubParams.payloadLen = strlen(payload);
aws_iot_mqtt_publish(&client, "sensors/device-001/data", strlen("sensors/device-001/data"), &pubParams);
OTA(Over The Air)ファームウェア更新
AWS IoT OTAアップデートサービスを使用すると、数千台のデバイスに安全にファームウェアをデプロイできます。差分アップデートや署名検証もサポートしています。
AWS Greengrassとのエッジ連携
AWS Greengrassを使用すると、Lambda関数やML推論をエッジデバイス上で実行し、クラウドに送るデータ量を削減できます。
# Greengrass上で動作するLambda関数(エッジ処理)
import greengrasssdk
import json
client = greengrasssdk.client('iot-data')
def lambda_handler(event, context):
# エッジで異常検知
if event['temperature'] > 80:
# 異常時のみクラウドへ通知(通信量削減)
client.publish(
topic='alerts/critical',
payload=json.dumps({
'alert': 'overheat',
'temperature': event['temperature']
})
)
# 正常データはローカルでのみ処理
log_locally(event)
実装・開発のポイント
トピック設計のベストプラクティス
MQTTトピックは階層構造で設計し、後でRules Engineのフィルタリングがしやすいように設計します。
推奨トピック構造:
{customer}/{location}/{device_type}/{device_id}/{message_type}
例:
acme-corp/tokyo-factory/sensor/temp-001/telemetry → センサーデータ
acme-corp/tokyo-factory/sensor/temp-001/shadow/update/delta → Shadow差分
acme-corp/tokyo-factory/sensor/temp-001/ota/jobs → OTAジョブ
証明書管理と大量プロビジョニング
大量のデバイスを登録する場合は「Just-in-Time Provisioning(JITP)」または「Fleet Provisioning」を使用します。
// Fleet Provisioning テンプレート
{
"Parameters": {
"ThingName": {"Type": "String"},
"SerialNumber": {"Type": "String"}
},
"Resources": {
"thing": {
"Type": "AWS::IoT::Thing",
"Properties": {
"ThingName": {"Ref": "ThingName"},
"AttributePayload": {
"serial_number": {"Ref": "SerialNumber"}
}
}
},
"certificate": {
"Type": "AWS::IoT::Certificate",
"Properties": {"CertificateId": {"Ref": "AWS::IoT::Certificate::Id"}}
},
"policy": {
"Type": "AWS::IoT::Policy",
"Properties": {"PolicyName": "DevicePolicy"}
}
}
}
コスト削減のポイント
- メッセージ集約: デバイス側で複数のセンサー値を1つのJSONにまとめて送信
- 接続時間の最適化: 常時接続が不要なデバイスはHTTP RESTで単発送信
- Rules Engineの最適化: 不要なルールを削除し、フィルタリングを厳密に
他技術との比較
| 項目 | AWS IoT Core | Azure IoT Hub | Google Cloud IoT | Eclipse Mosquitto(OSS) |
|---|---|---|---|---|
| マネージド度 | フルマネージド | フルマネージド | フルマネージド | セルフホスト |
| 最大デバイス数 | 数十億(理論値) | 数億 | 数億 | 構成次第 |
| MQTT 5.0対応 | あり | 部分対応 | なし | あり |
| エッジ連携 | Greengrass | IoT Edge | Edge TPU | なし(別途構成) |
| ML統合 | SageMaker | Azure ML | Vertex AI | なし |
| Device Shadow | あり | あり(デバイスツイン) | あり | なし |
| AWS連携 | ネイティブ | 限定的 | 限定的 | なし |
AWS IoT CoreはIoTプラットフォームの代表的な実装であり、デバイスシャドウ機能によりプロビジョニング済みデバイスのオフライン状態管理を実現します。エッジコンピューティングとの連携にはAWS Greengrassを、フリート管理にはAWS IoT Device Managementを組み合わせることで、エンタープライズ規模のIoTシステムを構築できます。