目次

AWS IoT Core 完全ガイド v2.0

初心者から実務者向けの包括的解説

AWS IoT Core は、数十億台のデバイスを AWS クラウドに安全に接続・管理するための完全マネージドメッセージブローカーです。MQTT・HTTPS・WebSocket・LoRaWAN プロトコルでデバイスからのテレメトリデータを受信し、IoT ルールエンジンで AWS のあらゆるサービス(Lambda・DynamoDB・Kinesis・S3 等)にデータを自動ルーティングします。デバイス証明書による相互 TLS 認証、デバイスシャドウによる状態管理、Fleet Provisioning による自動登録など、エンタープライズグレードの IoT ソリューション構築に必要な全機能を提供します。


目次

  1. 概要
  2. IoT Core が解決する課題
  3. 主な特徴
  4. アーキテクチャ
  5. コアコンポーネント
  6. 主要ユースケース
  7. プロトコル詳細と接続方法
  8. 設定・操作の具体例
  9. 類似サービス比較表
  10. ベストプラクティス
  11. トラブルシューティング
  12. 2025-2026 年の最新動向
  13. 学習リソース・参考文献
  14. 実装例・チェックリスト
  15. まとめ

概要

AWS IoT Core とは

AWS IoT Core は、マネージドメッセージングサービスとして機能し、クラウドとの双方向通信を実現します。MQTT ブローカーとしての基本機能に加え、以下を統合提供しています:

  • メッセージ仲介: デバイスからのメッセージを受信・配信
  • ステートマシン(デバイスシャドウ): デバイスのオフライン時の状態管理
  • ルール処理エンジン: メッセージフィルタリング・変換・ルーティング
  • デバイス管理: 証明書・ポリシー・グループ管理
  • セキュリティ: 相互 TLS・X.509 証明書・IAM ポリシー
  • 大規模プロビジョニング: Fleet Provisioning による自動登録

ユースケースの広がり

  • スマートホーム・スマートシティ: 数百万台のセンサ・アクチュエータ管理
  • 産業 IoT(IIoT): 工場機器の遠隔監視・制御・予知保全
  • コネクテッド自動車: GPS・センサデータのリアルタイム配信
  • 農業 IoT: 土壌センサ・気象データ・かんがい制御
  • ヘルスケア: ウェアラブル・医療機器の遠隔監視
  • 物流・トラッキング: 車両・荷物の GPS 位置情報管理

IoT Core が解決する課題

課題 従来の方法 IoT Core での解決
大規模デバイス接続管理 自前 MQTT ブローカー(Mosquitto・EMQ X)を EC2 で運用。スケール困難・高可用性設計が複雑 マネージドサービスで数十億接続対応。リージョン・AZ 分散で高可用性確保
デバイスセキュリティ SSH 鍵・API キー管理が煩雑。階層的アクセス制御が困難 X.509 証明書による相互 TLS + IAM ポリシーで最小権限実装
オフライン時の状態管理 デバイスが切断されたら最新状態が失われる。再接続時の同期が困難 デバイスシャドウで期待状態(desired)と報告状態(reported)を別管理。デルタで自動同期
メッセージルーティング Lambda・DynamoDB・S3 連携に複数のパイプラインが必要 SQL ベースのルールエンジンで一元管理。トピック単位でフィルタリング・変換・転送
デバイス登録プロセス 手動登録が必要。製造時の証明書埋め込みが煩雑 Fleet Provisioning(JITP)で初回接続時に自動登録。プロビジョニングテンプレートで一括管理
リアルタイム通知 ポーリングが必要。API レート制限で遅延が発生 MQTT subscriptions で即座に通知。低レイテンシ・高スループット

主な特徴

✅ 完全マネージド

  • インフラストラクチャ管理ゼロ
  • サーバー保守・パッチ管理・スケーリングを AWS が自動処理
  • ゼロダウンタイム無停止アップデート

✅ エンタープライズグレードセキュリティ

  • X.509 証明書による相互 TLS 認証(mTLS)
  • デバイスレベルの IAM ポリシー
  • AWS KMS による暗号化
  • Private Certificate Authority(CA)対応

✅ デバイスシャドウ

  • オフライン時の状態をクラウドに保持
  • 期待状態と報告状態の差分(delta)で効率的な同期
  • デバイス再起動後の自動復帰

✅ SQL ベースのルールエンジン

  • メッセージを MQTT トピックで受信
  • SQL 構文で選択・フィルタリング・変換
  • Lambda・DynamoDB・S3・Kinesis・SNS・SQS へ自動転送

✅ Fleet Provisioning(JITP/JITR)

  • デバイス初回接続時の自動登録
  • 製造段階での登録簡素化
  • 大規模デバイスフリートの一括管理

✅ マルチプロトコル対応

  • MQTT(ポート 8883/非 TLS 1883): リアルタイム双方向通信に最適
  • HTTPS(ポート 443): ファイアウォール制限環境での利用
  • MQTT over WebSocket(WSS): ブラウザベースのアプリケーション
  • LoRaWAN: 低電力・長距離通信デバイス

✅ AWS 統合

  • 200+ AWS サービスと連携
  • イベントドリブンアーキテクチャ実装が容易
  • Multi-account / Multi-region 対応

アーキテクチャ

全体構成図

graph TB
    subgraph Devices["IoT デバイス層"]
        D1["センサー<br/>(温度・湿度・GPS)"]
        D2["アクチュエータ<br/>(モーター・ロック・弁)"]
        D3["ゲートウェイ<br/>(エッジコンピュート)"]
    end
    
    subgraph Protocols["通信プロトコル"]
        MQTT["MQTT<br/>ポート 8883<br/>mTLS"]
        HTTPS["HTTPS<br/>ポート 443"]
        WSS["WebSocket Secure<br/>WSS"]
    end
    
    subgraph IotCore["AWS IoT Core(マネージドメッセージブローカー)"]
        MB["Message Broker<br/>MQTT 仲介"]
        DS["Device Shadow<br/>状態管理"]
        RuleEngine["Rules Engine<br/>SQL ベース"]
    end
    
    subgraph Auth["認証・認可"]
        Cert["X.509 証明書<br/>相互 TLS"]
        IAM["IAM ポリシー<br/>リソースベース"]
        CA["Private CA<br/>チェーン"]
    end
    
    subgraph Routing["ルーティング先"]
        Lambda["Lambda<br/>カスタム処理"]
        DDB["DynamoDB<br/>デバイス状態"]
        S3["S3<br/>ログアーカイブ"]
        Kinesis["Kinesis<br/>ストリーム処理"]
        SNS["SNS<br/>通知"]
        SQS["SQS<br/>非同期処理"]
    end
    
    subgraph Mgmt["管理・運用"]
        Fleet["Fleet Provisioning<br/>JITP/JITR"]
        Jobs["Jobs<br/>OTA/リモートコマンド"]
        Indexing["Device Indexing<br/>検索"]
    end
    
    D1 --> MQTT
    D2 --> HTTPS
    D3 --> WSS
    
    MQTT --> MB
    HTTPS --> MB
    WSS --> MB
    
    MB --> DS
    DS --> RuleEngine
    
    Cert --> MB
    IAM --> MB
    CA --> Cert
    
    RuleEngine --> Lambda
    RuleEngine --> DDB
    RuleEngine --> S3
    RuleEngine --> Kinesis
    RuleEngine --> SNS
    RuleEngine --> SQS
    
    Fleet --> MB
    Jobs --> D1
    Indexing --> Mgmt

メッセージフロー

sequenceDiagram
    participant Device as IoT Device
    participant Broker as IoT Core<br/>Message Broker
    participant Shadow as Device Shadow
    participant Rules as Rules Engine
    participant Lambda as Lambda Function
    participant DDB as DynamoDB
    
    Device->>Broker: MQTT Publish<br/>factory/m1/sensors<br/>{ temp: 82 }
    
    Broker->>Shadow: Update reported state
    Shadow->>Broker: Shadow updated
    
    Broker->>Rules: Message matches rule?
    Rules->>Rules: WHERE temp > 80
    
    Rules->>Lambda: Invoke Lambda
    Lambda->>DDB: Write alert record
    DDB->>Lambda: Acknowledged
    Lambda->>Rules: Success
    
    Rules->>Device: Trigger action<br/>via Topic

コアコンポーネント

1. Thing オブジェクト

デバイスを表すクラウド側のエンティティ。各デバイスに対応する 1 つの Thing を作成。

Thing: sensor-device-001
├── Attributes
│   ├── location: "factory-01"
│   ├── type: "temperature-sensor"
│   └── firmware-version: "1.2.3"
├── Certificates(複数可能)
│   └── cert-id-xyz.pem
├── Policies
│   └── sensor-001-policy
└── Shadow(期待状態 + 報告状態)

2. Certificate(デバイス証明書)

デバイスを認証する X.509 証明書。ルート CA + 中間 CA + デバイス証明書のチェーン構成。

種類:

  • AWS 管理 CA: AWS が発行・管理(標準)
  • Private CA: ユーザーが AWS Certificate Manager Private CA で管理(カスタマイズ性高い)
  • Third-party CA: 外部 CA で発行(既存証明書の統合)

3. Policy(IoT ポリシー)

デバイスの行動を制御する JSON ポリシー。IAM ポリシーと異なり、トピックベースのきめ細かい制御が可能。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iot:Connect",
      "Resource": "arn:aws:iot:ap-northeast-1:123456789012:client/${iot:Connection.Thing.ThingName}"
    },
    {
      "Effect": "Allow",
      "Action": ["iot:Publish"],
      "Resource": [
        "arn:aws:iot:ap-northeast-1:123456789012:topicfilter/factory/${iot:Connection.Thing.ThingName}/sensors",
        "arn:aws:iot:ap-northeast-1:123456789012:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/shadow/update"
      ]
    },
    {
      "Effect": "Allow",
      "Action": ["iot:Subscribe"],
      "Resource": [
        "arn:aws:iot:ap-northeast-1:123456789012:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/shadow/update/delta"
      ]
    }
  ]
}

4. Device Shadow(デバイスシャドウ)

デバイスの仮想表現。3 つの状態を管理:

  • desired: クラウドからデバイスへ送信する期待状態
  • reported: デバイスから送信される実際の状態
  • delta: desired と reported の差分(デバイスがまだ同期していない部分)
{
  "state": {
    "desired": {
      "brightness": 80,
      "color": "warm",
      "mode": "auto"
    },
    "reported": {
      "brightness": 50,
      "color": "white",
      "mode": "manual",
      "battery": 85
    },
    "delta": {
      "brightness": 80,
      "color": "warm",
      "mode": "auto"
    }
  },
  "metadata": {
    "desired": { "timestamp": 1672531200 },
    "reported": { "timestamp": 1672531180 },
    "delta": { "timestamp": 1672531200 }
  },
  "version": 42,
  "timestamp": 1672531200
}

5. Rules Engine(ルールエンジン)

メッセージをフィルタリング・変換・ルーティング。SQL 構文でデータを選別し、複数のアクションを実行。

ルール構成:

  • トリガー: MQTT トピックパターン(factory/+/sensors
  • 条件: SQL WHERE 句(WHERE temperature > 80
  • アクション: ターゲットサービス(Lambda・DynamoDB・SNS 等)

6. Fleet Provisioning(フリートプロビジョニング)

デバイスの初回接続時に自動登録。2 つのモード:

  • JITP(Just-In-Time Provisioning): CA 証明書を IoT Core に事前登録。初回接続時に自動生成・登録
  • JITR(Just-In-Time Registration): デバイスが CSR(Certificate Signing Request)を送信。AWS が署名して証明書を返却

7. Jobs(IoT Jobs)

デバイスの OTA(Over-The-Air)更新やリモートコマンド実行を管理。

{
  "jobId": "ota-firmware-v2-1-0",
  "jobArn": "arn:aws:iot:ap-northeast-1:123456789012:job/ota-firmware-v2-1-0",
  "targets": [
    "arn:aws:iot:ap-northeast-1:123456789012:thing/device-001",
    "arn:aws:iot:ap-northeast-1:123456789012:thinggroup/factory-sensors"
  ],
  "document": {
    "operation": "firmware-update",
    "url": "https://s3.amazonaws.com/my-bucket/firmware-v2.1.0.bin",
    "checksum": "abc123def456"
  }
}

主要ユースケース

1. スマートホーム・ビルディング

複数のスマートデバイス(照明・温度計・ロック・カメラ)から家の状態をリアルタイム監視・制御。

データフロー:

  • センサー → IoT Core MQTT → Rules Engine → DynamoDB(状態保存) → Lambda(アラート判定)
  • クラウド → Lambda → IoT Core Rules → Device Shadow Delta → デバイス(制御コマンド)

2. 産業 IoT(IIoT)・工場監視

工場内の機械・ロボット・PLCから稼働状況・温度・電流等を収集。予知保全・品質管理に活用。

要件:

  • 大量デバイス(数千~数万台)の接続
  • リアルタイムデータ処理
  • OTA 更新(IoT Jobs)
  • エッジでの前処理(IoT Greengrass)

3. コネクテッド車両・物流トラッキング

車両の GPS・速度・燃費・エラーコードをクラウドに配信。リアルタイム管理・デジタコ記録。

実装ポイント:

  • HTTPS(ファイアウォール対応)+ MQTT(オプション)
  • Device Shadow で最新位置・ステータスをキャッシュ
  • Kinesis Data Streams → Kinesis Data Analytics(リアルタイム分析)

4. 農業 IoT(AgTech)

土壌センサ・気象ステーション・かんがいコントローラの管理。自動灌漑トリガー。

構成:

  • LoRaWAN ゲートウェイ → IoT Core
  • Rules Engine で土壌水分 < 閾値 → SNS(アラート) → Lambda(ポンプ制御)

5. ヘルスケア・ウェアラブル

心拍計・体温計・血糖値計等からのデータ収集。個人医療記録への統合。

セキュリティ要件:

  • HIPAA コンプライアンス
  • Private CA での証明書管理
  • VPC エンドポイント経由のプライベート接続

6. LoRaWAN ネットワーク

スマートメーター・環境センサなどの低電力デバイス。IoT Core for LoRaWAN で直接統合。

7. エッジデバイスの管理

IoT Greengrass で前処理・ローカル意思決定を実行。インターネット接続が不安定な環境での運用。

8. 大規模フリート管理

数百万台のデバイスの登録・更新・廃止を一元管理。

ツール:

  • Fleet Provisioning(自動登録)
  • IoT Jobs(一括 OTA)
  • Device Indexing(検索・グループ化)

9. 環境監視・スマートシティ

大気汚染度・騒音・交通流量等のセンサデータ収集・分析・可視化。

10. リモート制御・アクチュエータ

ドローン・ロボット・無人車等の遠隔操作。低レイテンシ(< 100ms)が要求される場合も多い。

11. アノマリ検知・予知保全

機械学習で異常を検知。Lambda(SageMaker)で予測・アラート。

12. 監査ログ・コンプライアンス

デバイスのすべてのメッセージを S3 にアーカイブ。CloudTrail と連携。


プロトコル詳細と接続方法

MQTT(推奨)

特性:

  • ポート: 8883(TLS) / 1883(非 TLS)
  • QoS: 0(最大 1 回)/ 1(最低 1 回)/ 2(正確に 1 回)
  • 低レイテンシ: 数十 ms
  • 双方向: Pub/Sub モデル

接続フロー:

  1. Device: CONNECT パケット送信(証明書 + トピック)
  2. IoT Core: 証明書検証 → ポリシー確認
  3. Device: CONNACK(接続確認)
  4. Device: PUBLISH または SUBSCRIBE

Python SDK 例:

from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
import json
import time

# クライアント初期化
client = AWSIoTMQTTClient("my-device-001")
client.configureEndpoint("xxxxx.iot.ap-northeast-1.amazonaws.com", 8883)
client.configureCredentials(
    "AmazonRootCA1.pem",
    "private.pem.key",
    "certificate.pem.crt"
)

# 接続
client.connect()

# メッセージ発行
payload = {"temperature": 23.5, "humidity": 65}
client.publish("factory/m1/sensors", json.dumps(payload), 1)

# メッセージ受信
def on_message_received(message):
    print(f"Topic: {message.topic}, Payload: {message.payload}")

client.subscribe("$aws/things/my-device-001/shadow/update/delta", 1, on_message_received)

time.sleep(30)
client.disconnect()

HTTPS

特性:

  • ポート: 443
  • 用途: ファイアウォール制限環境。MQTT が使えない場合の代替
  • REST API ベース: POST で Publish のみ(Subscribe 不可)
  • レイテンシ: MQTT より高め(数百 ms)

シナリオ:

  1. 定期的なセンサ送信(サーバー側で定期実行)
  2. ファイアウォール規則が MQTT ブロック
  3. 既存 HTTP API インフラとの統合

cURL 例:

# メッセージ発行(HTTPS)
curl -X POST \
  -H "Content-Type: application/json" \
  --cert certificate.pem.crt \
  --key private.pem.key \
  --cacert AmazonRootCA1.pem \
  -d '{"temperature": 23.5, "humidity": 65}' \
  "https://xxxxx.iot.ap-northeast-1.amazonaws.com/topics/factory/m1/sensors?qos=1"

WebSocket Secure(WSS)

特性:

  • ポート: 443(HTTP upgrade)
  • 用途: ブラウザベースのアプリケーション・JavaScript クライアント
  • 双方向: MQTT over WebSocket で Pub/Sub 実現
  • SigV4: AWS Signature Version 4 で認証

JavaScript SDK 例:

const iotData = require('aws-iot-device-sdk');

const device = iotData.device({
    region: 'ap-northeast-1',
    protocol: 'wss-mqtt',
    accessKey: 'YOUR_ACCESS_KEY',
    secretKey: 'YOUR_SECRET_KEY',
    clientId: 'my-device-001'
});

device.on('connect', () => {
    console.log('Connected');
    device.subscribe('$aws/things/my-device-001/shadow/update/delta');
    
    // メッセージ発行
    device.publish('factory/m1/sensors', JSON.stringify({
        temperature: 23.5,
        humidity: 65
    }));
});

device.on('message', (topic, payload) => {
    console.log(topic, payload.toString());
});

LoRaWAN

特性:

  • 範囲: 15 km 以上
  • バッテリ寿命: 数年(低電力)
  • スループット: 低(KB/s 単位)
  • 用途: 広域センサネットワーク(スマートメーター等)

設定:

  • LoRaWAN ゲートウェイを AWS IoT Core for LoRaWAN に接続
  • デバイスは LoRa 物理層で送信 → ゲートウェイ経由で AWS に統合

設定・操作の具体例

CLI: Thing・Certificate・Policy の作成

# 1. Thing を作成
aws iot create-thing --thing-name sensor-device-001

# 2. 証明書を作成(CA 管理)
aws iot create-keys-and-certificate --set-as-active \
  --certificate-pem-outfile device-cert.pem \
  --public-key-outfile public.key \
  --private-key-outfile private.key

# または既存 CA から CSR で発行
aws iot create-certificate-from-csr \
  --certificate-signing-request file://device.csr \
  --set-as-active

# 3. IoT ポリシーを作成
aws iot create-policy --policy-name SensorPolicy \
  --policy-document file://sensor-policy.json

# 4. 証明書に ポリシーを attach
aws iot attach-policy \
  --policy-name SensorPolicy \
  --target "arn:aws:iot:ap-northeast-1:123456789012:cert/certificate-id"

# 5. Thing に証明書を attach
aws iot attach-thing-principal \
  --thing-name sensor-device-001 \
  --principal "arn:aws:iot:ap-northeast-1:123456789012:cert/certificate-id"

# 6. Thing に属性を設定
aws iot update-thing --thing-name sensor-device-001 \
  --attribute-payload '{"attributes": {"location": "factory-01", "type": "temperature-sensor"}}'

SDK: Device Shadow 操作(Python)

import boto3
import json

iot_data = boto3.client('iot-data-plane', region_name='ap-northeast-1')

# 1. Shadow 更新(desired 状態セット)
def update_shadow(thing_name, desired_state):
    payload = {
        "state": {
            "desired": desired_state
        }
    }
    response = iot_data.update_thing_shadow(
        thingName=thing_name,
        payload=json.dumps(payload)
    )
    return json.loads(response['payload'].read())

# 2. Shadow 取得
def get_shadow(thing_name):
    response = iot_data.get_thing_shadow(thingName=thing_name)
    return json.loads(response['payload'].read())

# 3. Shadow delete
def delete_shadow(thing_name):
    iot_data.delete_thing_shadow(thingName=thing_name)

# 使用例
update_shadow('smart-light-001', {
    'brightness': 80,
    'color': 'warm',
    'mode': 'auto'
})

shadow = get_shadow('smart-light-001')
print(json.dumps(shadow, indent=2))

IaC: CloudFormation で IoT リソース定義

AWSTemplateFormatVersion: '2010-09-09'
Description: IoT Core Setup for Factory Sensors

Resources:
  # Thing を作成
  SensorThing:
    Type: AWS::IoT::Thing
    Properties:
      ThingName: sensor-device-001
      ThingTypeProperties:
        SearchableAttributes:
          - location
          - type
      AttributePayload:
        Attributes:
          location: factory-01
          type: temperature-sensor

  # IoT ポリシーを作成
  SensorPolicy:
    Type: AWS::IoT::Policy
    Properties:
      PolicyName: SensorPolicy
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Action:
              - iot:Connect
            Resource:
              - !Sub 'arn:aws:iot:${AWS::Region}:${AWS::AccountId}:client/${iot:Connection.Thing.ThingName}'
          - Effect: Allow
            Action:
              - iot:Publish
            Resource:
              - !Sub 'arn:aws:iot:${AWS::Region}:${AWS::AccountId}:topicfilter/factory/*'
          - Effect: Allow
            Action:
              - iot:Subscribe
            Resource:
              - !Sub 'arn:aws:iot:${AWS::Region}:${AWS::AccountId}:topicfilter/$aws/things/*/shadow/update/delta'

  # IoT ルール(温度 > 80 で SNS 通知)
  HighTemperatureRule:
    Type: AWS::IoT::TopicRule
    Properties:
      RuleName: HighTemperatureAlert
      TopicRulePayload:
        RuleDisabled: false
        Sql: |
          SELECT
            deviceId,
            temperature,
            timestamp,
            topic() as mqttTopic
          FROM 'factory/+/sensors'
          WHERE temperature > 80
        Actions:
          # SNS 通知
          - Sns:
              TargetArn: !Ref AlertSNSTopic
              RoleArn: !GetAtt IoTRuleRole.Arn
              MessageFormat: JSON
          # DynamoDB に記録
          - DynamoDBv2:
              RoleArn: !GetAtt IoTRuleRole.Arn
              PutItem:
                TableName: !Ref SensorAlertsTable

  # DynamoDB テーブル
  SensorAlertsTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: sensor-alerts
      AttributeDefinitions:
        - AttributeName: deviceId
          AttributeType: S
        - AttributeName: timestamp
          AttributeType: N
      KeySchema:
        - AttributeName: deviceId
          KeyType: HASH
        - AttributeName: timestamp
          KeyType: RANGE
      BillingMode: PAY_PER_REQUEST

  # SNS トピック
  AlertSNSTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: factory-temperature-alerts
      DisplayName: Factory Temperature Alerts

  # IoT ルール実行用 IAM ロール
  IoTRuleRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: iot.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/CloudWatchLogsFullAccess
      InlinePolicies:
        - PolicyName: IotRulePolicy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - dynamodb:PutItem
                Resource: !GetAtt SensorAlertsTable.Arn
              - Effect: Allow
                Action:
                  - sns:Publish
                Resource: !Ref AlertSNSTopic

Outputs:
  ThingName:
    Value: !Ref SensorThing
  PolicyName:
    Value: !Ref SensorPolicy
  RuleName:
    Value: HighTemperatureRule

Terraform による IaC 定義

# IoT Core Provider 設定
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

# Thing を作成
resource "aws_iot_thing" "sensor" {
  name = "sensor-device-001"

  attributes = {
    location = "factory-01"
    type     = "temperature-sensor"
  }
}

# ポリシーを作成
resource "aws_iot_policy" "sensor_policy" {
  name = "SensorPolicy"

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Action = ["iot:Connect"]
        Resource = [
          "arn:aws:iot:ap-northeast-1:123456789012:client/${iot:Connection.Thing.ThingName}"
        ]
      },
      {
        Effect = "Allow"
        Action = ["iot:Publish"]
        Resource = [
          "arn:aws:iot:ap-northeast-1:123456789012:topicfilter/factory/*"
        ]
      }
    ]
  })
}

# DynamoDB テーブル
resource "aws_dynamodb_table" "sensor_alerts" {
  name           = "sensor-alerts"
  billing_mode   = "PAY_PER_REQUEST"
  hash_key       = "deviceId"
  range_key      = "timestamp"

  attribute {
    name = "deviceId"
    type = "S"
  }

  attribute {
    name = "timestamp"
    type = "N"
  }
}

# IoT ルール
resource "aws_iot_topic_rule" "high_temperature" {
  name        = "HighTemperatureAlert"
  enabled     = true
  sql         = "SELECT deviceId, temperature, timestamp FROM 'factory/+/sensors' WHERE temperature > 80"
  sql_version = "2016-03-23"

  cloudwatch_alarm {
    alarm_name  = aws_cloudwatch_metric_alarm.temperature.alarm_name
    role_arn    = aws_iam_role.iot_rule.arn
    state_value = "ALARM"
  }

  dynamodb {
    put_item {
      table_name = aws_dynamodb_table.sensor_alerts.name
    }
    role_arn = aws_iam_role.iot_rule.arn
  }
}

# IAM ロール
resource "aws_iam_role" "iot_rule" {
  name = "IoTRuleRole"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Principal = {
          Service = "iot.amazonaws.com"
        }
        Action = "sts:AssumeRole"
      }
    ]
  })
}

# ロールポリシー
resource "aws_iam_role_policy" "iot_rule_policy" {
  name = "IotRulePolicy"
  role = aws_iam_role.iot_rule.id

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Action = ["dynamodb:PutItem"]
        Resource = [aws_dynamodb_table.sensor_alerts.arn]
      }
    ]
  })
}

MQTT 接続設定例(Node.js)

const AWSIoT = require('aws-iot-device-sdk');

const device = AWSIoT.device({
  keyPath: '/path/to/private.pem.key',
  certPath: '/path/to/certificate.pem.crt',
  caPath: '/path/to/AmazonRootCA1.pem',
  clientId: 'sensor-device-001',
  host: 'xxxxx.iot.ap-northeast-1.amazonaws.com'
});

device
  .on('connect', () => {
    console.log('Connected to IoT Core');
    device.subscribe('$aws/things/sensor-device-001/shadow/update/delta');
    
    // 定期的にセンサデータを発行
    setInterval(() => {
      const payload = {
        deviceId: 'sensor-device-001',
        temperature: 20 + Math.random() * 10,
        humidity: 40 + Math.random() * 40,
        timestamp: Date.now()
      };
      device.publish('factory/m1/sensors', JSON.stringify(payload));
    }, 5000);
  })
  .on('message', (topic, payload) => {
    console.log(`Topic: ${topic}`);
    console.log(`Payload: ${payload.toString()}`);
  })
  .on('error', (error) => {
    console.error('Error:', error);
  });

類似サービス比較表

特性 AWS IoT Core Azure IoT Hub GCP IoT Core(廃止) HiveMQ EMQX
管理方式 フルマネージド フルマネージド 廃止(Pub/Sub推奨) ハイブリッド オープンソース・商用
プロトコル MQTT/HTTPS/WSS/LoRaWAN MQTT/AMQP/HTTPS MQTT/HTTP MQTT MQTT
スケーラビリティ 数十億デバイス 数百万デバイス - 数百万デバイス スケーラブル
デバイスシャドウ ✅(Device Twins) - × ×
ルールエンジン ✅ SQL ベース ✅(C# クエリ) - × ×
Fleet Provisioning ✅ JITP/JITR ✅(DPS) -
OTA 更新 ✅(IoT Jobs) ✅(Device Updates) - × ×
プライベート CA -
LoRaWAN 対応 - × ×
AWS 統合 ✅ 200+ - × ×
エッジコンピュート ✅(IoT Greengrass) ✅(IoT Edge) -
オープンソース × × -
価格モデル 従量課金 従量課金 + 月額 - 買取 + サポート オープン / 商用

選択基準:

  • AWS IoT Core: AWS エコシステム、大規模デバイス、マネージド運用が必要
  • Azure IoT Hub: Azure スタック、オンプレ統合、ハイブリッドシナリオ
  • HiveMQ: 高性能・カスタマイズ性重視、自社ホスティング
  • EMQX: コスト重視、カスタマイズ性、エンタープライズ版利用時

ベストプラクティス

✅ 推奨事項

項目 実装方法
最小権限ポリシー デバイスは自分の Thing トピックのみ操作可能。${iot:Connection.Thing.ThingName} 変数を活用
トピック階層設計 factory/{site}/{machine}/{metric} など 3~4 段階の階層。ワイルドカード +(1 レベル)と #(複数) を活用
デバイスシャドウ活用 オフライン対応が必要な設定変更は shadow で。リアルタイム通知が不要なら shadow のみ
ルールエンジンの SQL 最適化 不要なプロパティを SELECT しない。計算は Lambda で実施
Certificate ローテーション 有効期限切れ前に新証明書へ切り替え。AWS Certificate Manager で自動更新(オプション)
Device Indexing デバイスグループ化・検索に活用。Thing Attributes で索引付け
エラーハンドリング Device Shadow の metadata.delta を監視。異常デバイスを検知
監査ログ CloudTrail で API 操作記録。IoT Core メッセージは CloudWatch Logs に送信
VPC エンドポイント プライベート接続が必要ならVPC エンドポイント経由でアクセス
Dead Letter Queue ルールエンジン失敗時の SQS DLQ でリトライ管理

❌ アンチパターン

反パターン 問題 対策
すべてのデバイスに同一ポリシー セキュリティリスク。1 デバイスの証明書流出で全デバイス制御可能 デバイスごと・グループごとに最小権限ポリシー
トピック設計が浅い ルール管理が煩雑。スケーラビリティ低下 階層構造(4~5 段階)で設計
ルールエンジンで複雑な計算 パフォーマンス低下。SQL の複雑さに制限 計算は Lambda で実施
Device Shadow を大量使用 Shadow 更新操作がコスト増加。毎秒更新は非効率 リアルタイム通知が必要な設定のみ shadow 使用
Certificate 有効期限管理を忘れる 証明書期限切れでデバイス接続不可 事前通知・ローテーション計画を立案
エラーログを CloudWatch に送らない トラブル原因特定困難 ルールエンジン実行結果を CloudWatch Logs に送信
Fleet Provisioning なしで大規模展開 登録作業が膨大。プロビジョニング テンプレートの活用が必須 JITP/JITR で自動登録

トラブルシューティング

よくある問題と解決方法

問題 原因 解決方法
デバイス接続失敗(401 Unauthorized) 証明書期限切れ・ポリシー未設定・ルート CA 不正 証明書再発行。IoT ポリシーを attach。ルート CA を AWS 提供版に変更
MQTT メッセージが受信されない Subscribe ポリシーなし・トピック不一致 IoT ポリシーに iot:Subscribe 追加。topic() 関数でルール内でトピック確認
Device Shadow Delta が更新されない desired と reported が同じ Shadow 更新時に期待値を明示的に設定。CloudWatch Logs で shadow 操作ログを確認
ルールエンジン が動作しない SQL 構文エラー・IAM ロール権限不足 CloudWatch Logs で iot ルールのエラーログを確認。IAM ロール Trust Policy に iot.amazonaws.com を追加
高いコスト(メッセージ数 = 想定以上) ルールエンジン条件が甘い・キープアライブ頻度高い WHERE 句で受信メッセージフィルタリング。MQTT キープアライブを適切に設定
デバイスが頻繁に切断される ネットワーク不安定・QoS 設定不適切 QoS=1 を推奨。自動再接続設定を確認。IoT Core エンドポイント DNS 解決を確認
Fleet Provisioning 失敗 プロビジョニングテンプレートエラー・CA 認定書未登録 テンプレートの JSON 構文チェック。CA 証明書の登録状態確認
OTA Job が一部デバイスで失敗 古いデバイス SDK・アクセス権限 IoT Device Agent / SDK を最新化。デバイス側のジョブハンドラロジック確認

CloudWatch Logs での デバッグ

# IoT ルール実行ログを確認
aws logs tail /aws/iot/rules --follow

# エラーメッセージで フィルタリング
aws logs filter-log-events \
  --log-group-name /aws/iot/rules \
  --filter-pattern "ERROR"

# デバイス接続ログ(CloudTrail)
aws cloudtrail lookup-events \
  --lookup-attributes AttributeKey=ResourceName,AttributeValue=sensor-device-001 \
  --region ap-northeast-1

2025-2026 年の最新動向

新機能・改善

  1. Fleet Provisioning での Private CA 完全サポート

    • AWS Certificate Manager Private CA で発行した証明書を直接使用可能
    • レジストレーション テンプレートの拡張機能
  2. IoT Jobs の高度なスケジューリング

    • 時間帯別・デバイス属性別のロールアウト
    • 段階的展開(canary デプロイ)のネイティブ対応
  3. Device Shadow の性能向上

    • 大規模デバイス(数百万台)での shadow 同期レイテンシ削減
    • 差分クエリ API の追加
  4. LoRaWAN の展開拡大

    • 新リージョンでの IoT Core for LoRaWAN 提供
    • 複数ゲートウェイの冗長性向上
  5. AI/ML 統合の深化

    • SageMaker との直接連携で異常検知モデルのリアルタイム推論
    • Anomaly Detection as-a-Service の preview
  6. セキュリティ強化

    • Zero Trust モデルの推奨
    • デバイスポスチャ検証(device compliance checking)
  7. エッジコンピュート の拡張

    • IoT Greengrass v3 での ML コンポーネントの簡素化
    • Docker コンテナ 標準対応の強化

採用トレンド

  • エッジ AI: オンデバイス推論 → ネットワーク遅延削減
  • 5G 統合: Ultra-reliable low-latency communication(URLLC)シナリオ向けの最適化
  • Industrial 4.0: Predictive maintenance・Quality control の標準化
  • Sustainability: IoT による電力管理・carbon accounting

学習リソース・参考文献

AWS 公式ドキュメント

  1. AWS IoT Core Developer Guide
  2. Device Provisioning Service
  3. IoT Rules Engine
  4. IoT Jobs
  5. IoT Device SDKs
  6. IoT Core for LoRaWAN
  7. Security Best Practices
  8. Pricing

AWS ブログ・チュートリアル

  1. AWS IoT Official Blog
  2. IoT Core Fleet Provisioning at Scale
  3. Device Security with Private CA
  4. OTA Update Best Practices

オープンソース・サンプルコード

  1. AWS IoT Core for Python SDK
  2. AWS IoT Core for JavaScript/Node.js
  3. AWS IoT Core for Java
  4. Fleet Provisioning Embedded SDK
  5. AWS IoT Samples Repository

ベンダー・エコシステム

  1. ESP32 AWS IoT Integration
  2. Azure IoT SDK との相互比較
  3. MQTT.org - Protocol Specification

実装例・チェックリスト

実装チェックリスト

IoT Core デプロイメント前の確認事項:

セキュリティ
  □ X.509 証明書チェーン検証完了
  □ IoT ポリシーで最小権限を設定(デバイスは自身のトピックのみ操作可能)
  □ Root CA / Intermediate CA / Device Cert の 3 層構造
  □ Private CA 使用する場合、AWS Certificate Manager Private CA 設定完了
  □ IAM ロール Trust Policy に iot.amazonaws.com を追加

デバイス設計
  □ トピック階層設計完了(factory/{site}/{machine}/{metric})
  □ QoS レベル決定(リアルタイムは QoS=1、低速センサは QoS=0)
  □ キープアライブ間隔設定(推奨:60~300 秒)
  □ デバイス再接続ロジック実装(exponential backoff)

クラウド側設定
  □ Thing、Certificate、Policy を CLI/SDK で自動生成スクリプト化
  □ Device Shadow 構造定義(desired/reported の キースキーマ)
  □ ルールエンジン SQL 構文検証(CloudWatch Logs で事前テスト)
  □ ルールアクション IAM ロール権限確認
  □ Dead Letter Queue(DLQ)設定

運用・監視
  □ CloudWatch Logs で IoT Core メッセージ・ルール実行ログ設定
  □ CloudTrail で API 操作ログ記録
  □ メトリクス:接続数・メッセージ数・ルール実行数・エラー数
  □ アラーム:接続数急増・メッセージレート低下・ルール失敗率

スケーリング・パフォーマンス
  □ メッセージレート想定値と ルール処理時間の検証
  □ Device Shadow 更新頻度上限の確認
  □ マルチリージョン構成の検討(低レイテンシ)
  □ コスト予測:月間メッセージ数 × $1 / 百万メッセージ

ディザスタリカバリ
  □ 証明書有効期限管理・自動更新計画
  □ バックアップ ルール / テンプレート定義
  □ フェイルオーバー戦略(別リージョンへの自動切替)

デプロイメント自動化スクリプト(Bash)

#!/bin/bash
set -e

# 変数定義
REGION="ap-northeast-1"
THING_NAME="sensor-device-001"
POLICY_NAME="SensorPolicy"
CERT_DIR="./certs"

# 1. 証明書ディレクトリ作成
mkdir -p $CERT_DIR

# 2. ルート CA ダウンロード
wget -O $CERT_DIR/AmazonRootCA1.pem \
  https://www.amazontrust.com/repository/AmazonRootCA1.pem

# 3. 証明書と秘密鍵を生成
aws iot create-keys-and-certificate \
  --region $REGION \
  --set-as-active \
  --certificate-pem-outfile $CERT_DIR/certificate.pem.crt \
  --public-key-outfile $CERT_DIR/public.key \
  --private-key-outfile $CERT_DIR/private.pem.key \
  > /tmp/cert-response.json

# 証明書 ARN を抽出
CERT_ARN=$(jq -r '.certificateArn' /tmp/cert-response.json)
CERT_ID=$(jq -r '.certificateId' /tmp/cert-response.json)

# 4. Thing を作成
aws iot create-thing \
  --region $REGION \
  --thing-name $THING_NAME \
  --attribute-payload '{"attributes": {"location": "factory-01"}}'

# 5. ポリシーを作成
aws iot create-policy \
  --region $REGION \
  --policy-name $POLICY_NAME \
  --policy-document file://sensor-policy.json

# 6. 証明書にポリシー attach
aws iot attach-policy \
  --region $REGION \
  --policy-name $POLICY_NAME \
  --target $CERT_ARN

# 7. Thing に証明書 attach
aws iot attach-thing-principal \
  --region $REGION \
  --thing-name $THING_NAME \
  --principal $CERT_ARN

echo "Deployment completed!"
echo "Certificate ID: $CERT_ID"
echo "Certificates saved in: $CERT_DIR"

まとめ

AWS IoT Core は、数十億台のデバイスを AWS クラウドに安全・確実に接続するマネージドメッセージングサービスです。

核心的な価値

  1. スケーラビリティ: 自動スケーリング、グローバルインフラで無限の接続対応
  2. セキュリティ: X.509 相互 TLS、IoT ポリシー、Private CA で階層的な認証・認可
  3. 開発効率: Device Shadow・ルールエンジン・Fleet Provisioning で複雑な IoT ロジックを簡素化
  4. 運用効率: マネージドサービスで インフラ管理ゼロ。OTA Jobs で大規模デバイス更新を一元管理
  5. AWS エコシステム統合: Lambda・DynamoDB・Kinesis・S3・SageMaker など 200+ サービスと連携

適用判断

IoT Core を選ぶべき場合:

  • AWS エコシステムに深く統合したい
  • 大規模デバイス(数十万~数十億)の管理が必要
  • デバイス状態管理(shadow)・OTA 更新が重要
  • マネージドサービスの運用効率を優先

他の選択肢を検討すべき場合:

  • MQTT ブローカー機能のみが必要(自社ホスティング で cost 削減)
  • 既存 MQTT インフラとの互換性重視(HiveMQ・EMQX)
  • Azure・GCP スタックの統合優先(Azure IoT Hub・Pub/Sub)

次のステップ

  1. 小規模 PoC: 単一デバイスで MQTT 接続テスト
  2. セキュリティ検証: 証明書・ポリシー・IAM ロール実装
  3. スケーリング計画: メッセージレート・コスト推定
  4. AWS IoT Core コンソール でハンズオン開始

最終更新:2026-04-27

バージョン:v2.0