AWS IoT Device ManagementのBulk Provisioningを使ってデバイスを一括登録してみた #reinvent

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

まいどおおきに、大阪の市田です。
re:Invent2017で発表された「AWS IoT Device Management」は、その名の通りデバイスを管理するためのサービスです。今回はその機能の1つである「Bulk Provisioning」を試してみました。

Bulk Provisioningとは

「Bulk Provisioning」はテンプレートを用いて複数のthingsを一括で登録することができる機能で、デバイス毎に異なる証明書やグループ、属性情報などを一括してプロビジョニングすることができます。
尚、リリース当初から既に東京リージョンでも利用可能です。

仕組みとしては、実際に設定する登録するデータを記載したパラメータファイルとデバイス毎に登録する情報のテンプレートを用意します。そして、テンプレートに沿ってパラメータファイルから登録するデータを読み取り、thingを登録するという流れになります。

テンプレートの作成

今回は公式ドキュメントにあるスニペットを参考にテンプレートを作成しました。CloudFormationのテンプレートと類似した構成になっているので分かりやすいと思います。

AWS Documentation - AWS IoT Provisioning Template

{
  "Parameters" : {
     "ThingName" : {
       "Type" : "String"
     },
     "SerialNumber" : {
       "Type" : "String"
     },
     "Location" : {
       "Type" : "String",
       "Default" : "TOKYO"
     },
     "CSR" : {
       "Type" : "String"
     }
  },

  "Resources" : {

    "thing" : {
      "Type" : "AWS::IoT::Thing",
      "Properties" : {
        "ThingName" : {"Ref" : "ThingName"},
        "AttributePayload" : { "version" : "v1", "serialNumber" :  {"Ref" : "SerialNumber"}},
        "ThingGroups" : ["COMMON", {"Ref" : "Location"}]
      }
    },

    "certificate" : {
      "Type" : "AWS::IoT::Certificate",
      "Properties" : {
        "CertificateSigningRequest": {"Ref" : "CSR"},
        "Status" : "ACTIVE"
      }
    },

    "policy" : {
      "Type" : "AWS::IoT::Policy",
      "Properties" : {
        "PolicyName": "MyPolicy"
      }
    }
  }
}

作成したテンプレートに関する簡単な説明としては次の通りです。

項目 意味
ThingName モノの名前です。
SerialNumber 属性情報として、デバイスのシリアルナンバーというありがちな項目を与えています。
Location Group設定(ThingGroups)として「デバイスの設置場所(都道府県)」を想定した項目です。
CSR 証明書のCSRです。このCSRを元にデバイスの証明書が作成されます。

もう少し補足すると、

  • LocationDefaultは文字通りデフォルト値の指定です。パラメータファイルにLocationの情報が存在しない場合に適用されます。
  • AWS IoTポリシーの指定はMyPolicyとして事前に作成したものを指定しています。
  • ThingGroupsの指定には、COMMONとパラメータファイルから読み取った値の2つを指定するようにしてみました。
    • Groupsは「TOKYO」「OSAKA」「COMMON」という3つのグループを事前に作成しています。

詳細については、下記の公式ドキュメントも合わせて参照頂ければと思います。

Device Provisioning - AWS IoT

データファイルの作成

次にパラメータファイルを用意します。下記のように、1デバイスにつき1行で記載する必要があるので、CSRの改行については\nで表記しておきます。

{"ThingName": "foo", "SerialNumber": "123", "Location": "OSAKA", "CSR": "-----BEGIN CERTIFICATE REQUEST-----\nMIIC0DCCAbgCAQAwgYoxCzAJBgN (中略) XAdpezKuy\r17vvQw==\n-----END CERTIFICATE REQUEST-----"}
{"ThingName": "bar", "SerialNumber": "456", "Location": "TOKYO", "CSR": "-----BEGIN CERTIFICATE REQUEST-----\nMIICqTCCAZECAQAwZDELMAkGA1UE (中略) alFwSRElh51cg==\n-----END CERTIFICATE REQUEST-----"}
{"ThingName": "baz", "SerialNumber": "789", "CSR": "-----BEGIN CERTIFICATE REQUEST-----\nMIICqTCCAZ (中略) lFwSRElh51cg==\n-----END CERTIFICATE REQUEST-----"}

3つ目のthingであるbazLocationを定義していないので、テンプレートで固定値のCOMMONとDefault値のTOKYOが入る想定です。

このファイルは改行で区切られたJSONファイルとして作成して、適当なS3バケットに保存して下さい。テンプレートはAWS IoT側で指定します。

事前準備

S3へデータファイルの保存

事前準備として、作成したパラメータファイルをS3に保存しておきましょう。今回は「my-iot-bulk-data」というバケットにbulk-parammeter.jsonという名前で先程の内容のファイルを保存しました。

02-parameter-json

IAM Roleの作成

Bulk Provisioningの為に必要な権限を持ったIAM Roleを作成しておきます。必要な権限があれば既存のものでもOKです。

今回は下記のように「AWSIoTThingsRegistration」「AmazonS3ReadOnlyAccess」の2つをAttachしたIotBulkProvisionigというRoleを作成しました。

03-bluk-provioning-role

また、「Trust relationships」は下記の通りとします。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "iot.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

bulk provisioningの実行

準備が整いましたので、マネジメントコンソールから作成してみたいと思います。AWS IoTの画面から「Register a thing」をクリックして開始します。

04-register-thing

複数個の登録を行うので「Create many things」をクリックします。

05-many-things

次の画面ではテンプレートを入力します。先程記載したテンプレートを貼り付けて次に進みましょう。

06-template

最後にS3にあるパラメータファイルと利用するIAM Roleを指定します。該当バケットから対象のオブジェクトを選択する形で指定します。
IAM Roleは事前に作成したものを指定して下さい。

07-specify

「Start bulk registration」をクリックして正常にプロビジョニングが始まると、図のような緑色の通知が表示されます。テンプレート等に誤りがあると赤色のメッセージが表示されます。

08-start-provisioning

その下の数字が付いてるアイコンをクリックするとActivityを確認することができます。

09-activity

ログもここからダウンロード可能なので、もし失敗していればこのログから詳細な原因を確認することができます。

10-log

作成が完了したらこのように、3つのthingが登録されていることが分かります。今回は2秒で作成が完了しました。

11-foobarbaz

きちんと登録できているか「bar」のthingを見てみます。属性情報にserialNumberが登録されていますね。

12-thing

証明書もattachされています。詳細を確認するため証明書をクリックしてみます。

13-cert

CSRで指定した情報が入っていることが確認できました。

14-cert-active

Policyも指定していたMyPolicyが適用されています。

15-policy

最後にGroupsを確認してみましょう。指定とおり「COMMON」と「TOKYO」の2つが登録されています。

16-groups

Locationを記載しなかった「baz」は下記のようになっています。記載がなければDefaultの値が入るので、固定で指定されている「COMMON」とDefaultの「TOKYO」が入っていますね。

17-baz-group

コマンドラインでbulk provisioningしてみる

start-thing-registration-taskというAWS CLIで実行することも可能です。テンプレートはbulk-regist-template.jsonというファイルです。このファイルをxargsで処理させています。

$ cat ./bulk-regist-template.json | xargs -0 aws iot start-thing-registration-task \
--profile default \
--input-file-bucket my-iot-bulk-data \
--input-file-key bulk-parameter.json \
--role-arn arn:aws:iam::xxxxxxxxxxxx:role/service-role/IotBulkProvisionig \
--template-body

start-thing-registration-task — AWS CLI 1.14.14 Command Reference

コマンドを実行するとbulk provisioningがスタートするので、そのタスクIDが返ります。もしプロビジョニングを止めたければ、このタスクIDを指定して止める形になります。

{
    "taskId": "67a880e4-eb3d-xxxx-xxxx-xxxxxxxxxxxx"
}

止める時はstop-thing-registration-taskコマンドを使います。

stop-thing-registration-task — AWS CLI 1.14.14 Command Reference

最後に

Bulk Provisioningにより簡単に複数のthingを登録することができるようになりました。他の機能についても今後試してご紹介していきたいと思います。

以上です。