目次
AWS IoT Core 完全ガイド v2.0
初心者から実務者向けの包括的解説
AWS IoT Core は、数十億台のデバイスを AWS クラウドに安全に接続・管理するための完全マネージドメッセージブローカーです。MQTT・HTTPS・WebSocket・LoRaWAN プロトコルでデバイスからのテレメトリデータを受信し、IoT ルールエンジンで AWS のあらゆるサービス(Lambda・DynamoDB・Kinesis・S3 等)にデータを自動ルーティングします。デバイス証明書による相互 TLS 認証、デバイスシャドウによる状態管理、Fleet Provisioning による自動登録など、エンタープライズグレードの IoT ソリューション構築に必要な全機能を提供します。
目次
- 概要
- IoT Core が解決する課題
- 主な特徴
- アーキテクチャ
- コアコンポーネント
- 主要ユースケース
- プロトコル詳細と接続方法
- 設定・操作の具体例
- 類似サービス比較表
- ベストプラクティス
- トラブルシューティング
- 2025-2026 年の最新動向
- 学習リソース・参考文献
- 実装例・チェックリスト
- まとめ
概要
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 モデル
接続フロー:
- Device: CONNECT パケット送信(証明書 + トピック)
- IoT Core: 証明書検証 → ポリシー確認
- Device: CONNACK(接続確認)
- 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)
シナリオ:
- 定期的なセンサ送信(サーバー側で定期実行)
- ファイアウォール規則が MQTT ブロック
- 既存 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 年の最新動向
新機能・改善
-
Fleet Provisioning での Private CA 完全サポート
- AWS Certificate Manager Private CA で発行した証明書を直接使用可能
- レジストレーション テンプレートの拡張機能
-
IoT Jobs の高度なスケジューリング
- 時間帯別・デバイス属性別のロールアウト
- 段階的展開(canary デプロイ)のネイティブ対応
-
Device Shadow の性能向上
- 大規模デバイス(数百万台)での shadow 同期レイテンシ削減
- 差分クエリ API の追加
-
LoRaWAN の展開拡大
- 新リージョンでの IoT Core for LoRaWAN 提供
- 複数ゲートウェイの冗長性向上
-
AI/ML 統合の深化
- SageMaker との直接連携で異常検知モデルのリアルタイム推論
- Anomaly Detection as-a-Service の preview
-
セキュリティ強化
- Zero Trust モデルの推奨
- デバイスポスチャ検証(device compliance checking)
-
エッジコンピュート の拡張
- 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 公式ドキュメント
- AWS IoT Core Developer Guide
- Device Provisioning Service
- IoT Rules Engine
- IoT Jobs
- IoT Device SDKs
- IoT Core for LoRaWAN
- Security Best Practices
- Pricing
AWS ブログ・チュートリアル
- AWS IoT Official Blog
- IoT Core Fleet Provisioning at Scale
- Device Security with Private CA
- OTA Update Best Practices
オープンソース・サンプルコード
- AWS IoT Core for Python SDK
- AWS IoT Core for JavaScript/Node.js
- AWS IoT Core for Java
- Fleet Provisioning Embedded SDK
- AWS IoT Samples Repository
ベンダー・エコシステム
実装例・チェックリスト
実装チェックリスト
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 クラウドに安全・確実に接続するマネージドメッセージングサービスです。
核心的な価値
- スケーラビリティ: 自動スケーリング、グローバルインフラで無限の接続対応
- セキュリティ: X.509 相互 TLS、IoT ポリシー、Private CA で階層的な認証・認可
- 開発効率: Device Shadow・ルールエンジン・Fleet Provisioning で複雑な IoT ロジックを簡素化
- 運用効率: マネージドサービスで インフラ管理ゼロ。OTA Jobs で大規模デバイス更新を一元管理
- AWS エコシステム統合: Lambda・DynamoDB・Kinesis・S3・SageMaker など 200+ サービスと連携
適用判断
IoT Core を選ぶべき場合:
- AWS エコシステムに深く統合したい
- 大規模デバイス(数十万~数十億)の管理が必要
- デバイス状態管理(shadow)・OTA 更新が重要
- マネージドサービスの運用効率を優先
他の選択肢を検討すべき場合:
- MQTT ブローカー機能のみが必要(自社ホスティング で cost 削減)
- 既存 MQTT インフラとの互換性重視(HiveMQ・EMQX)
- Azure・GCP スタックの統合優先(Azure IoT Hub・Pub/Sub)
次のステップ
- 小規模 PoC: 単一デバイスで MQTT 接続テスト
- セキュリティ検証: 証明書・ポリシー・IAM ロール実装
- スケーリング計画: メッセージレート・コスト推定
- AWS IoT Core コンソール でハンズオン開始
最終更新:2026-04-27
バージョン:v2.0