IoT Coreのリソース登録をJSONの一括テンプレートで543台分登録できるか検証

サービス概要

AWS IoT Coreは、IoTデバイスAWSクラウドに接続するサービスです。

目的・やりたいこと

IoT Coreのリソース登録をJSONの一括テンプレートで543台分のデバイス登録ができるか試す。

対象者

IoT初心者〜中級者

対象となる技術

条件(導入にあたって前提事項)

・必要最低限のロールやポリシーがあらかじめ付与されているものとします。

参考URL

作業の流れ

事前作業

Cloud9開発環境を立ち上げ、ダミーのIoT仮想デバイスとして動作するプログラムのセットアップを行います。

  1. Cloud9の作成画面 (ここをクリック)を開く
  2. 以下のようにして環境作成

     

  3. 作成後、Cloud9 IDEを開きます。

     

  4. 以下のコマンドをターミナルで実行し、AWS IoT Device SDK Python v2 をインストール

pip3 install --user awsiotsdk

5.フォルダの作成と移動

mkdir -p ~/environment/dummy_client/certs/
cd ~/environment/dummy_client/

6.ダミーデバイスとなるソースコードをダウンロード

wget https://awsj-iot-handson.s3-ap-northeast-1.amazonaws.com/aws-iot-core-workshop/dummy_client/device_main.py -O device_main.py

7.AWS IoT Coreのコンソール画面 を開く
8.左のサイドメニューの下の方にある[設定]を選択
9.表示されたデバイスデータエンドポイントの[エンドポイント]の値をメモしておく

10.左のサイドメニューから セキュリティ > ポリシー をクリックし、画面中央の[ポリシーの作成]を押します。

11.以下のように設定して[作成]

12.左のサイドメニューより すべてのデバイス > モノ をクリックし、[モノを作成]
13.[多数のモノを作成]で[次へ]

14.ここで、以下のような行を543行分用意したパラメータファイルを作成しておく必要があります。

{ "ThingName" : "Hoge", "SerialNumber": "123", "Location":"Tokyo", "CertificateId":"2c0daf692c937080b3f90fd84e559e1a4f9c0ca653834c53ebad03346492170f"}
{ "ThingName" : "Fuga", "SerialNumber": "456", "Location":"Osaka", "CertificateId":"c71587c094819f9b8993e4da182736dcba2a3bdf9fe10b7b841a8174f8f74795"}
{ "ThingName" : "Boke", "SerialNumber": "789", "Location":"Nagoya", "CertificateId":"c71587c094819f9b8993e4da182736dcba2a3bdf9fe10b7b841a8174f8f74795"}

15.Excelでこのような行をドラッグして543行分作成しておきます。

16.これを「iot.json」として保存し、適当にS3にアップロードします。

検証手順

1.先ほどの「多くの AWS IoT モノを作成」画面に戻り、[登録タスクの詳細]で以下を設定します。
・S3 URL:16.でアップロードしたjsonファイルを指定
・IAMロール:モノの登録ができる権限と、S3が読める権限を与えたロール

2.[プロビジョニングテンプレート]には、一括登録のテンプレート例と、[AWS IoT] 複数のモノを一括で登録してみたに貼られているものを以下のように組み合わせて貼り付け、[登録を開始]

{
    "Parameters" : {
        "ThingName" : {
            "Type" : "String"
        },
        "SerialNumber" : {
            "Type" : "String"
        },
        "Location" : {
            "Type" : "String",
            "Default" : "WA"
        },
        "CertificateId" : {
            "Type" : "String"    
        }
    },
    "Resources" : {
        "thing" : {
            "Type" : "AWS::IoT::Thing",
            "Properties" : {
                "ThingName" : {"Ref" : "ThingName"},
                "AttributePayload" : { "version" : "v1", "serialNumber" :  {"Ref" : "SerialNumber"}}
            }
        },
        "certificate" : {
            "Type" : "AWS::IoT::Certificate",
            "Properties" : {
                "CertificateId": {"Ref" : "CertificateId"}
            }
        },
        "policy" : {
            "Type" : "AWS::IoT::Policy",
            "Properties" : {
                "PolicyDocument" : "{ \"Version\": \"2012-10-17\", \"Statement\": [{ \"Effect\": \"Allow\", \"Action\":[\"iot:Publish\"], \"Resource\": [\"arn:aws:iot:us-east-1:123456789012:topic/foo/bar\"] }] }"
            }
        }
    }   
}
  • ところがここでエラー


どうもAWS IoT ルールに必要なアクセスを付与するによると、信頼ポリシーに

"Service": "iot.amazonaws.com"

を追加する必要があるらしい。
なので自分は信頼ポリシーを次のように編集しました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "lambda.amazonaws.com","iot.amazonaws.com"
                    ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
  • 気を取り直して再チャレンジするも、またもや失敗

今度は登録を開始し始めてからのエラーなので、左メニューの[一括登録]のところにこのように失敗が出ます。


選択した状態で右上の[アクション] > 失敗ログ > ログ1の表示 で失敗ログがダウンロードされます。
今回は以下のようにエラーが記載されていました。

{"errorMessage":"com.amazonaws.services.iot.model.ResourceRegistrationFailureException: CertificateId 2c0daf692c937080b3f90fd84e559e1a4f9c0ca653834c53ebad03346492170f does not exist (Service: AWSIot; Status Code: 400; Error Code: ResourceRegistrationFailureException; Request ID: 8f0ad4c1-c6ae-4109-a8ba-901db89eb563; Proxy: null)","lineNumber":1,"offset":151,"response":null}

間抜けな話なんですが、適当に記載して登録した証明書ID「2c0daf692c937080b3f90fd84e559e1a4f9c0ca653834c53ebad03346492170f」が存在しないとのこと
ちゃんとここにある証明書IDを書かないといけません。

 

  • 三度目の正直で今度こそ登録成功

543台分あって2分かかりました。

所要時間

2時間