AWSに戻る

AWS IoT Device Shadow

AWS IoT Device Shadowとは

AWS IoT Device Shadow(デバイスシャドウ)は、AWS IoTの機能の一つで、IoTデバイスの状態を保存し、デバイスがオフラインの場合でもその状態を取得および制御できるようにするサービスです。デバイスシャドウは、デバイスの「仮想表現」または「デジタルツイン」として機能し、デバイスの現在の状態と望ましい状態を保存します。これにより、アプリケーションはデバイスの接続状態に関係なく、デバイスと通信できるようになります。

AWS IoT Device Shadowの主な特徴

AWS IoT Device Shadowの仕組み

デバイスシャドウは、以下の主要なコンポーネントで構成されています:

シャドウドキュメント

シャドウドキュメントは、デバイスの状態を表す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/... となります。

シャドウの操作フロー

デバイスシャドウの一般的な操作フローは以下の通りです:

  1. アプリケーションがシャドウを更新: アプリケーションが望ましい状態を設定するためにシャドウを更新します。
  2. AWS IoTがシャドウを保存: AWS IoTがシャドウの状態を保存し、バージョン番号を増やします。
  3. AWS IoTがdeltaを計算: AWS IoTがdesiredとreportedの差分を計算し、deltaセクションを作成します。
  4. デバイスがdeltaを受信: オンラインのデバイスがdeltaを受信し、状態を更新します。
  5. デバイスが新しい状態を報告: デバイスが更新された状態をreportedセクションに報告します。
  6. AWS IoTがシャドウを更新: AWS IoTがシャドウのreportedセクションを更新し、deltaを再計算します。

シャドウの操作フロー図

アプリケーション                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 IoT Device Shadowは、AWS Management Console、AWS CLI、SDKs、またはMQTT/HTTPSプロトコルを使用して利用できます。

AWS CLIを使用したシャドウの操作

シャドウの取得

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

MQTTを使用したシャドウの操作

シャドウの更新(デバイスから)

// トピック: $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
// ペイロード: (空)

AWS IoT SDKを使用したシャドウの操作

AWS IoT Device SDK for JavaScript v2を使用したシャドウの操作

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は、以下のようなユースケースに適しています:

具体的なユースケース例

スマートホーム

スマートホームシステムでは、ユーザーがモバイルアプリを使用して家電製品を制御します。デバイスシャドウを使用することで、ユーザーはデバイスがオフラインの場合でも設定を変更でき、デバイスがオンラインに戻ったときに自動的に新しい設定が適用されます。

産業用IoT

工場の機械や設備は、デバイスシャドウを使用して現在の動作状態を報告し、オペレーターはリモートから設定を変更できます。機械がネットワークから一時的に切断された場合でも、オペレーターは設定を変更でき、機械が再接続したときに新しい設定が適用されます。

フリート管理

車両や機器のフリートは、デバイスシャドウを使用して位置、状態、設定などの情報を報告します。フリート管理者は、デバイスシャドウを通じてフリート全体の状態を監視し、必要に応じて設定を変更できます。

AWS IoT Device Shadowのベストプラクティス

AWS IoT Device Shadowを効果的に使用するためのベストプラクティス:

AWS IoT Device Shadowの制限事項

AWS IoT Device Shadowを使用する際の主な制限事項:

AWS IoT Device Shadowと他のAWSサービスとの統合

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 Rules Engineとの統合例

シャドウの更新に基づいてSNS通知を送信するルール

// 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ソリューションを構築できます。