AWS IoT Device ManagementのBulk Provisioningを使ってデバイスを一括登録してみた #reinvent
まいどおおきに、大阪の市田です。 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を元にデバイスの証明書が作成されます。 |
もう少し補足すると、
Location
のDefault
は文字通りデフォルト値の指定です。パラメータファイルにLocation
の情報が存在しない場合に適用されます。- AWS IoTポリシーの指定は
MyPolicy
として事前に作成したものを指定しています。 - ThingGroupsの指定には、
COMMON
とパラメータファイルから読み取った値の2つを指定するようにしてみました。 - Groupsは「TOKYO」「OSAKA」「COMMON」という3つのグループを事前に作成しています。
詳細については、下記の公式ドキュメントも合わせて参照頂ければと思います。
データファイルの作成
次にパラメータファイルを用意します。下記のように、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であるbaz
はLocation
を定義していないので、テンプレートで固定値のCOMMON
とDefault値のTOKYO
が入る想定です。
このファイルは改行で区切られたJSONファイルとして作成して、適当なS3バケットに保存して下さい。テンプレートはAWS IoT側で指定します。
事前準備
S3へデータファイルの保存
事前準備として、作成したパラメータファイルをS3に保存しておきましょう。今回は「my-iot-bulk-data」というバケットにbulk-parammeter.json
という名前で先程の内容のファイルを保存しました。
IAM Roleの作成
Bulk Provisioningの為に必要な権限を持ったIAM Roleを作成しておきます。必要な権限があれば既存のものでもOKです。
今回は下記のように「AWSIoTThingsRegistration」と「AmazonS3ReadOnlyAccess」の2つをAttachしたIotBulkProvisionig
という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」をクリックして開始します。
複数個の登録を行うので「Create many things」をクリックします。
次の画面ではテンプレートを入力します。先程記載したテンプレートを貼り付けて次に進みましょう。
最後にS3にあるパラメータファイルと利用するIAM Roleを指定します。該当バケットから対象のオブジェクトを選択する形で指定します。 IAM Roleは事前に作成したものを指定して下さい。
「Start bulk registration」をクリックして正常にプロビジョニングが始まると、図のような緑色の通知が表示されます。テンプレート等に誤りがあると赤色のメッセージが表示されます。
その下の数字が付いてるアイコンをクリックするとActivityを確認することができます。
ログもここからダウンロード可能なので、もし失敗していればこのログから詳細な原因を確認することができます。
作成が完了したらこのように、3つのthingが登録されていることが分かります。今回は2秒で作成が完了しました。
きちんと登録できているか「bar」のthingを見てみます。属性情報にserialNumberが登録されていますね。
証明書もattachされています。詳細を確認するため証明書をクリックしてみます。
CSRで指定した情報が入っていることが確認できました。
Policyも指定していたMyPolicy
が適用されています。
最後にGroupsを確認してみましょう。指定とおり「COMMON」と「TOKYO」の2つが登録されています。
Locationを記載しなかった「baz」は下記のようになっています。記載がなければDefaultの値が入るので、固定で指定されている「COMMON」とDefaultの「TOKYO」が入っていますね。
コマンドラインで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を登録することができるようになりました。他の機能についても今後試してご紹介していきたいと思います。
以上です。