Amazon Web Services ブログ

AWS IoT Device Managementのフリートインデックスを使っての大量のモノの状態を識別する

本ブログにおいて、新しいAWS IoT Device ManagementのFleet indexingの新しい機能を紹介します。これの記事の内容ではAWS LambdaおよびAmazon CloudWatchを組み合わせてフリートの監視を自動化できます。

IoTデバイスを管理する場合、フリートの状態を監視するのは難しい場合があります。 複雑さは多くの要因によるものです:デバイスの数、監視する動的状態の数、およびフリート状態変更のための通知メカニズムの数。 AWS IoT Device Managementは、リモートで接続されたデバイスを大規模にオンボード化、整理、監視、管理することを可能にするサービスです。

 

AWS IoT Device Management内では、フリートインデックスを使用すると、フリート内のすべてのデバイスのレジストリ、デバイスシャドウ、および接続状態をインデックス化し、これらの属性の任意の組み合わせに基づいてデバイスを検索できます。 フリートインデックスを使用して、どのデバイスが特定のバージョンのファームウェアを実行しているかを照会したり、どのデバイスがAWS IoTサービスに接続されているかを照会したりできます。

このブログ記事は4つのステップにわけて解説します。

  • フリートインデックスを有効にします。
  • Lambda関数のAWS Identity and Access Management(IAM)ロールとアクセス許可を定義します。
  • Lambda関数を定義して構成します。
  • フリート管理ダッシュボードを構築し、CloudWatchを使用してアラームを設定します。

本ブログではAWSマネージメントコンソールで作業していきます。この作業はAWS Command Line Interface(AWS CLI)でも実行できます。

フリートインデックスの有効化

マネージメントコンソールのAWS IoTコンソールにある Settings からインデックスの有効化ができます。モノの接続状態を確かめるためにconnectivity indexを有効化します。アグリゲーションクエリでconnectivityのフィールドを利用します。

 

アグリゲーションでカウントクエリの利用

AWS Lambdaのコードを書く前に、AWS IoT Device Management コンソールにある、 ThingsからSearch Thingsからクエリのテストを実行します。以下がテストになります。(Searchの種別をSearchからStaticsに変更します。)

クエリ文字は変更することができます。queryのサンプルはこちらを参照してください。

Lambdaが使うIAM Roleの定義

Lambda関数がCloudWatch metricsにpublishするために必要な権限の設定を行います。また、インデックスリソースを操作するためにiot::GetStatistics を付与します。

これらの権限は、Lambda関数に関するデバッグするためにCloudWatchにログを発行するための標準のLambda権限に追加されています。また、クエリを実行するには、GetStatistics権限が必要です。 この権限の定義には2つのステップがあります。最初にポリシーを作成し、次にロールを作成して最初のステップのポリシーをそのロールに添付することができます。

ポリシーを作成する

CloudWatch logsへログやメトリクスを送るため、また、GetStatistics実行の権限が必要となるので、コンソールからIAMを選択し、Polices, Create Policyを選択します。

IoTFleetMetricPublishPolicyという名前のポリシーを作成します。 次のJSONドキュメントを使用してポリシーを定義できます。 ACCOUNT_IDを実際のアカウントIDに置き換えます。

{
    "Version": "2012-10-17",
       "Statement": [
            {
                "Effect": "Allow",
                "Action": "cloudwatch:PutMetricData",
                "Resource": "*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "iot:GetStatistics"
                ],
                "Resource": "arn:aws:iot:*:ACCOUNT_ID:*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "logs:CreateLogGroup",
                    "logs:CreateLogStream",
                    "logs:PutLogEvents"
                ],
                "Resource": "arn:aws:logs:*:*:*"
            }
    ]
}

ロールの作成

この手順では、IoTFleetMetricPublishRoleという名前の新しいroleが作成され、前の手順で作成されたIoTFleetMetricPublishPolicyがそのroleに添付されます。 RoleCreate Roleの順に選択して、作成します。

このroleを利用するサービスとしてAWS Lmabdaを選択します

IoTFleetMetricPublishPolicyをアタッチします

任意のタグを追加します

レビューで確認を行い、作成します

 

Lambda関数の定義と設定

この手順で、Lambda関数名を IoTFleetMetricPublisherとして作成します。この関数は5分ごとにインデックスに対してクエリを行い接続台数を取得してCloudWatchへ送信を行います。

Lambda関数の作成

この手順で5分毎に実行するLambda関数の作成を行います。Lambdaのコンソールから Functions, Create Functionを選択します。

LambdaをIoTFleetMetricPublisherとして作成

CloudWatchのイベントトリガに5分毎として設定

Lambda関数の定義

Lambda関数を作成するためのプログラミング言語としてNode.jsを選択します(他の選択肢はJavaとPythonです)。 Lambda関数は接続されているデバイスの数を見つけるためにフリートインデックスを呼び出します。 呼び出しの結果は、ネームスペースIoTFleetManagementの下でConnectedDevicesという名前のCloudWatchメトリックスとして公開されます。 Node.jsのコードを以下に示します。

// Configuring the AWS SDK
var AWS = require('aws-sdk');
// Configuring the AWS Region
AWS.config.update({ region: 'us-east-1' });
exports.handler = (event, context, callback) => {
  // Create a CloudWatch service object
  var cw = new AWS.CloudWatch({ apiVersion: '2010-08-01' });
  // Create an AWS IoT service object
  var iot = new AWS.Iot({ apiVersion: '2015-05-28' });
  var queryParams = {
    queryString: 'connectivity.connected:true'
  };
  iot.getStatistics(queryParams, function(err, data) {
    if (err) console.log(err, err.stack); // an error occurred
    else {
      console.log(data); // successful response
      // Create parameters JSON for putMetricData
      var params = {
        MetricData: [{
          MetricName: 'ConnectedDevices',
          Dimensions: [],
          Unit: 'None',
          Value: data.statistics.count
        }, ],
        Namespace: 'IoTFleetManagement'
      };

      cw.putMetricData(params, function(err, data) {
        if (err) {
          console.log("Error", err);
        }
        else {
          console.log("Success", JSON.stringify(data));
        }
      });
    }
  });
};

 

この手順ではCode entry typeで、Edit Code inlineを選択し、Node.js 8.10を選択します。上記をコードをエディタウィンドウにコピーアンドペーストします。

Lambda関数をsaveします。

最新のAWS SDKをLambda Layerとして登録

Lambdaランタイムで利用可能なAWS SDKのデフォルトバージョンは最新ではありません。 このステップでは、Lambda Layerを定義し、Lambda LayerをLambda関数に関連付けます。 まず、最新のAWS SDKを含むzipファイルを作成する必要があります。 コマンドラインで次のコマンドを実行してzipファイルを作成します。

mkdir nodejs
cd nodejs
npm init
npm install --save aws-sdk
cd ..
zip -r nodejs.zip nodejs/

zipファイルを作成した後、Lambda Layerに定義します。 Lambda, Layers, Create layerを選択します。awsSDKLambdaLayerという名前のLayerとします。前の手順のnodejs.zipを選択しuploadを行います。

最後の手順としてIoTFleetMetricPublisherLambdaにawsSDKLambdaLayerを新しいLayerとして登録します。

 

CloudWatchでフリート管理のダッシュボード作成とアラームの設定

これまでの手順でLambdaが自動的に5分毎のメトリックをCloudWatchへ送信します。この手順ではダッシュボードの作成とアラーム載せってをしていきます。

ダッシュボードの作成

CloudWatchのコンソールから Dashboards, Create Dashboardで作成できます。ダッシュボード作成のワークフローでは、ダッシュボードの名前を選択し、ダッシュボードに表示するメトリックを選択します。

Connected Devices Metricのアラームの作成

CloudWatchコンソールからAlarms, Create Alarm を選択することで作成できます。このステップでは、15分のウィンドウ内の2つのデータポイントで、接続されているデバイス数のメトリックが5を下回るとトリガーされるConnectedDevicesAlarmという名前のアラームを作成します。

ラップアップ

このブログ記事では、IoTフリート管理ダッシュボードの作成方法について説明しました。 追加のクエリやその他のメトリックを指定するようにLambda関数を修正することができます。 あなたが作ることができる測定基準のいくつかの例は「タイプX」とファームウェア「バージョンY」に接続されているすべてのデバイスを見つけること、90%以上のバッテリー使用量に接続されるすべてのデバイスを見つけること、またはshadow.reportedに、温度が ≧50℃を超える持つすべてのデバイスを見つけることを含みます。

Thing Group インデックスに対してクエリを使用することもできます。

AWS IoT Device Managementは、接続されたデバイスのオンボード化、整理、監視、およびリモート管理を大規模に行うために提供するものが他にもたくさんあります。

 

関連情報

AWS IoT Device Management
https://aws.amazon.com/iot-device-management

AWS IoT Device Management Features
https://aws.amazon.com/iot-device-management/features/

AWS CloudWatch
https://aws.amazon.com/cloudwatch/

AWS Lambda
https://aws.amazon.com/lambda/

AWS IAM Roles
https://aws.amazon.com/iam/

 

原文はこちら

翻訳はSA 小梁川が担当しました