AWS IoT Device Shadow(デバイスシャドウ)は、AWS IoTの機能の一つで、IoTデバイスの状態を保存し、デバイスがオフラインの場合でもその状態を取得および制御できるようにするサービスです。デバイスシャドウは、デバイスの「仮想表現」または「デジタルツイン」として機能し、デバイスの現在の状態と望ましい状態を保存します。これにより、アプリケーションはデバイスの接続状態に関係なく、デバイスと通信できるようになります。
デバイスシャドウは、以下の主要なコンポーネントで構成されています:
シャドウドキュメントは、デバイスの状態を表すJSONドキュメントです。シャドウドキュメントには、以下のセクションが含まれています:
{
"state": {
"desired": {
"temperature": 25,
"mode": "auto",
"fanSpeed": 2
},
"reported": {
"temperature": 22,
"mode": "auto",
"fanSpeed": 1,
"connectionStatus": "online"
},
"delta": {
"temperature": 25,
"fanSpeed": 2
}
},
"metadata": {
"desired": {
"temperature": {
"timestamp": 1627824000
},
"mode": {
"timestamp": 1627824000
},
"fanSpeed": {
"timestamp": 1627824000
}
},
"reported": {
"temperature": {
"timestamp": 1627823900
},
"mode": {
"timestamp": 1627823900
},
"fanSpeed": {
"timestamp": 1627823900
},
"connectionStatus": {
"timestamp": 1627823900
}
}
},
"version": 10,
"timestamp": 1627824000
}
AWS IoT Device Shadowは、MQTTトピックを使用してデバイスとアプリケーション間の通信を行います。以下は、シャドウ操作に使用される主要なMQTTトピックです:
トピック | 説明 |
---|---|
$aws/things/thingName/shadow/update | シャドウの状態を更新するためのトピック |
$aws/things/thingName/shadow/update/accepted | シャドウの更新が受け入れられたときに発行されるトピック |
$aws/things/thingName/shadow/update/rejected | シャドウの更新が拒否されたときに発行されるトピック |
$aws/things/thingName/shadow/get | シャドウの状態を取得するためのトピック |
$aws/things/thingName/shadow/get/accepted | シャドウの取得リクエストが受け入れられたときに発行されるトピック |
$aws/things/thingName/shadow/get/rejected | シャドウの取得リクエストが拒否されたときに発行されるトピック |
$aws/things/thingName/shadow/delete | シャドウを削除するためのトピック |
$aws/things/thingName/shadow/delete/accepted | シャドウの削除が受け入れられたときに発行されるトピック |
$aws/things/thingName/shadow/delete/rejected | シャドウの削除が拒否されたときに発行されるトピック |
名前付きシャドウの場合は、トピックパターンが $aws/things/thingName/shadow/name/shadowName/...
となります。
デバイスシャドウの一般的な操作フローは以下の通りです:
アプリケーション AWS IoT デバイス | | | |--- shadow/update -------->| | | (desired: {temp: 25}) | | | |--- shadow/update/delta ->| | | (delta: {temp: 25}) | | | | | | |--- デバイスが温度を調整 --- | | | | |<-- shadow/update ------| | | (reported: {temp: 25}) | | | | |<-- shadow/update/accepted-| | | (state: { | | | desired: {temp: 25}, | | | reported: {temp: 25}, | | | delta: {} | | | }) | |
AWS IoT Device Shadowは、AWS Management Console、AWS CLI、SDKs、またはMQTT/HTTPSプロトコルを使用して利用できます。
aws iot-data get-thing-shadow \
--thing-name MyThing \
--output text > shadow.json
aws iot-data update-thing-shadow \
--thing-name MyThing \
--payload '{"state":{"desired":{"temperature":25,"mode":"auto"}}}' \
--output text > response.json
aws iot-data get-thing-shadow \
--thing-name MyThing \
--shadow-name MyShadow \
--output text > named-shadow.json
// トピック: $aws/things/MyThing/shadow/update
// ペイロード:
{
"state": {
"reported": {
"temperature": 22,
"humidity": 45,
"connectionStatus": "online"
}
}
}
// トピック: $aws/things/MyThing/shadow/update
// ペイロード:
{
"state": {
"desired": {
"temperature": 25,
"mode": "auto"
}
}
}
// トピック: $aws/things/MyThing/shadow/get
// ペイロード: (空)
const awsIot = require('aws-iot-device-sdk-v2');
const iotshadow = awsIot.iotshadow;
// シャドウクライアントの作成
const shadowClient = new iotshadow.IotShadowClient(connection);
// シャドウの更新
const updateShadow = async () => {
const request = {
thingName: 'MyThing',
state: {
reported: {
temperature: 22,
humidity: 45,
connectionStatus: 'online'
}
}
};
try {
await shadowClient.updateShadow(request);
console.log('Successfully updated shadow');
} catch (error) {
console.log('Failed to update shadow', error);
}
};
// シャドウの取得
const getShadow = async () => {
const request = {
thingName: 'MyThing'
};
try {
const response = await shadowClient.getShadow(request);
console.log('Shadow document:', response.state);
} catch (error) {
console.log('Failed to get shadow', error);
}
};
// deltaの購読
const subscribeToDelta = () => {
const request = {
thingName: 'MyThing'
};
shadowClient.subscribeToShadowDeltaUpdatedEvents(
request,
mqtt.QoS.AtLeastOnce,
(error, response) => {
if (error) {
console.log('Error subscribing to delta', error);
return;
}
console.log('Received delta:', response.state);
// デバイスの状態を更新する処理
}
);
};
AWS IoT Device Shadowは、以下のようなユースケースに適しています:
スマートホームシステムでは、ユーザーがモバイルアプリを使用して家電製品を制御します。デバイスシャドウを使用することで、ユーザーはデバイスがオフラインの場合でも設定を変更でき、デバイスがオンラインに戻ったときに自動的に新しい設定が適用されます。
工場の機械や設備は、デバイスシャドウを使用して現在の動作状態を報告し、オペレーターはリモートから設定を変更できます。機械がネットワークから一時的に切断された場合でも、オペレーターは設定を変更でき、機械が再接続したときに新しい設定が適用されます。
車両や機器のフリートは、デバイスシャドウを使用して位置、状態、設定などの情報を報告します。フリート管理者は、デバイスシャドウを通じてフリート全体の状態を監視し、必要に応じて設定を変更できます。
AWS IoT Device Shadowを効果的に使用するためのベストプラクティス:
AWS IoT Device Shadowを使用する際の主な制限事項:
AWS IoT Device Shadowは、他のAWSサービスと統合して、より強力なIoTソリューションを構築できます:
サービス | 統合の利点 |
---|---|
AWS IoT Core | デバイス接続、メッセージングの基盤 |
AWS IoT Rules Engine | シャドウの更新に基づいてアクションをトリガー |
AWS Lambda | シャドウの更新に応じてカスタムロジックを実行 |
Amazon DynamoDB | シャドウの履歴を保存して分析 |
Amazon S3 | シャドウデータの長期保存 |
Amazon CloudWatch | シャドウの操作を監視 |
AWS IoT Analytics | シャドウデータの分析 |
AWS IoT Events | シャドウの状態に基づいてイベントを検出 |
AWS IoT SiteWise | 産業用デバイスのデータ収集と分析 |
// AWS IoT Ruleの定義
{
"sql": "SELECT * FROM '$aws/things/+/shadow/update/accepted' WHERE state.reported.temperature > 30",
"actions": [
{
"sns": {
"targetArn": "arn:aws:sns:us-west-2:123456789012:high-temperature-alert",
"roleArn": "arn:aws:iam::123456789012:role/aws-iot-rules-role",
"messageFormat": "JSON"
}
}
]
}
AWS IoT Device Shadowは、IoTデバイスの状態を保存し、デバイスがオフラインの場合でもその状態を取得および制御できるようにするサービスです。デバイスシャドウは、デバイスの「仮想表現」または「デジタルツイン」として機能し、デバイスの現在の状態と望ましい状態を保存します。
AWS IoT Device Shadowの主な利点は以下の通りです:
AWS IoT Device Shadowを効果的に活用するには、シャドウドキュメントのサイズを最小限に抑える、バージョン競合を適切に処理する、エラー処理を実装する、デルタ処理を実装する、名前付きシャドウを活用する、セキュリティポリシーを適用するなどのベストプラクティスを実践することが重要です。また、AWS IoT Rules Engine、AWS Lambda、Amazon DynamoDBなどの他のAWSサービスと統合することで、より強力なIoTソリューションを構築できます。