クラウド・プラットフォーム

AWS IoT Core

AWSのIoT接続・管理サービス。

概要

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 TLS8883標準のデバイス通信
MQTT over WebSocket443ファイアウォール越え
HTTPS443軽量デバイスの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. メッセージ集約: デバイス側で複数のセンサー値を1つのJSONにまとめて送信
  2. 接続時間の最適化: 常時接続が不要なデバイスはHTTP RESTで単発送信
  3. Rules Engineの最適化: 不要なルールを削除し、フィルタリングを厳密に

他技術との比較

項目AWS IoT CoreAzure IoT HubGoogle Cloud IoTEclipse Mosquitto(OSS)
マネージド度フルマネージドフルマネージドフルマネージドセルフホスト
最大デバイス数数十億(理論値)数億数億構成次第
MQTT 5.0対応あり部分対応なしあり
エッジ連携GreengrassIoT EdgeEdge TPUなし(別途構成)
ML統合SageMakerAzure MLVertex AIなし
Device Shadowありあり(デバイスツイン)ありなし
AWS連携ネイティブ限定的限定的なし

AWS IoT CoreはIoTプラットフォームの代表的な実装であり、デバイスシャドウ機能によりプロビジョニング済みデバイスのオフライン状態管理を実現します。エッジコンピューティングとの連携にはAWS Greengrassを、フリート管理にはAWS IoT Device Managementを組み合わせることで、エンタープライズ規模のIoTシステムを構築できます。

関連用語

参考リンク