Bulk Device Provisioning

ここでは、 start-thing-registration-task という API を利用することで、複数のデバイスをまとめてプロビジョニングします。

start-thing-registration-task という API はバルクでのデバイスのプロビジョニングに利用できます。バルクでのプロビジョニングには、単一デバイスのプロビジョニングで利用する register-thing API と同様のパラメータが必要です。デバイス毎に異なるパラメータを利用するために、パラメータを記述したファイルを S3 のバケットに保存しておく必要があります。

また、AWS IoT から S3 バケットにアクセスするための IAM ロールも必要です。このロールは CloudFormation の中で既に作られています(ArnIoTProvRole の値にロールの ARN が保存されています)。

S3 バケットに保存されているパラメータのファイルには、テンプレート内のパラメータ部分を置き換える値が記載されています。このパラメータファイルは、改行区切りの JSON ファイルで、1行(1つのJSON)が1つのデバイスに対応するように記述されている必要があります。

ここでは mk-bulk.sh というスクリプトを使って、鍵やCSR、パラメータを生成します。このスクリプトは新しいディレクトリを作成し、その中に鍵やCSRを保存します。また、 bulk.json というファイルを同じディレクトリ内に作成します。ここに全てのデバイスのパラメータが記述されています。

バルクでのプロビジョニングを行うためには、デバイスを作成するリージョンと同じリージョンの S3 バケットにパラメータのファイルを配置する必要があります。今回使うバケットは CloudFormation で既に作成されていて、バケット名は S3_BUCKET という環境変数に格納されています。

テンプレートの確認

Cloud9のターミナルでホームディレクトリへ移動します。

cd

Cloud9 のホーム直下にある templateBody.json を確認しましょう。こちらが、今回デバイスを作成するためのテンプレートです。

ファイル内の Parameters に指定されている値を bulk.json のJSONでデバイス毎に記述します。

テンプレート内で利用している、ThingType, ThingGroup を事前に作成しておきます。

# 環境変数 NAME の値を確認します(設定されていない場合は設定してください)
echo $NAME

# グループを作成します
aws iot create-thing-group --thing-group-name bulky-group-$NAME
# タイプを作成します
aws iot create-thing-type --thing-type-name Device-$NAME

※ なお、本テンプレートのポリシーでは {\"Effect\": \"Allow\",\"Action\": [\"iot:*\"],\"Resource\": [\"*\"]} のように緩い権限設定を行っていますが、実際にはユースケースに応じて適切に権限を狭める必要があります。

鍵・CSR・パラメータの生成

鍵とCSR、bulk.json を作成します。

# 作成するモノの数です(ここで指定した数の2倍のモノが作成されます)、あまり多くすると作成に時間がかかるのでご注意ください
NUM_THINGS=3

mk-bulk.sh $NAME $NUM_THINGS

上記のコマンドを実行すると、 $THING_NAME-YYYY-mm-dd_H-M-S というフォルダが作成され、その中に鍵やCSR、そして bulk.json ファイルが生成されます。

生成された bulk.json を開いて、中身を確認してみましょう。ここでは2種類のデバイスが NUM_THINGS 個ずつ生成されるよう、パラメータが作成されています。

この bulk.json をS3 バケットにコピーします。

THING_NAME=bulky-$NAME
# cd bulkyと入力して以降はTabで補完して、対象のディレクトリに移動してください
cd bulky-$NAME-YYYY-mm-dd_H-M-S

aws s3 cp bulk.json s3://$S3_BUCKET/

# bulk.json がコピーされたことを確認します
aws s3 ls s3://$S3_BUCKET/

バルクでのプロビジョニング

続いて、bulk thing registration task を作成しましょう。必要な IAM ロールは既に作成されており、 $ARN_IOT_PROVISIONING_ROLE という環境変数に格納されています。

aws iot start-thing-registration-task \
  --template-body file://~/templateBody.json \
  --input-file-bucket $S3_BUCKET \
  --input-file-key bulk.json --role-arn $ARN_IOT_PROVISIONING_ROLE

上記のコマンドが成功すると Task ID が返ってきます。

{
    "taskId": "your-task-id"
}

この Task ID を利用して、以下のコマンドでタスクのエラーや結果を確認することができます。後のコマンドで利用できるよう Task ID を環境変数に格納しておきます。

TASK_ID=[YOUR_TASK_ID]

タスクの実行結果とエラーを確認します。

# 実行結果を確認
aws iot list-thing-registration-task-reports \
  --report-type RESULTS --task-id $TASK_ID

# エラーを確認
aws iot list-thing-registration-task-reports \
  --report-type ERRORS --task-id $TASK_ID

RESULTS のコマンドの結果に含まれる URL をダウンロードして results.json として保存します。

wget -O results.json $(aws iot list-thing-registration-task-reports --task-id $TASK_ID --report-type RESULTS | jq -r '.resourceLinks[]')

もしエラーが発生した場合は、エラーメッセージをダウンロードします。以下のコマンドを実行して errors.json として結果を保存し、エラーの原因を探りましょう。

wget -O errors.json $(aws iot list-thing-registration-task-reports --task-id $TASK_ID --report-type ERRORS | jq -r '.resourceLinks[]')

ダウンロードした results.json 内には各デバイスの証明書が含まれています。 bulk-result.py を使って各デバイスの証明書をファイルに保存しましょう。

bulk-result.py results.json

保存された証明書を確認しましょう。

ls -l

IoT のデバイスレジストリにデバイスが作成されていることを確認しましょう。

aws iot list-things | grep bulky-$NAME

作成されたデバイスのうち 1つを使って MQTT にメッセージを発行できることを確認します。

# 作成されたデバイスから1つの名前を選びましょう
THING_NAME=bulky-$NAME-PoC-1

確認のために、事前にマネジメントコンソールから iot/ws/$THING_NAME をサブスクライブしておきましょう。以下のコマンドの出力をマネージメントコンソールのIoT Core->テスト->トピックのサブスクリプションに入力してトピックへのサブスクライブをクリックします。

echo iot/ws/$THING_NAME

image

[参考]デバイスからのMQTTメッセージを表示する方法。 https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/view-mqtt-messages.html

mosquitto_pub --cafile ~/root.ca.bundle.pem \
  --cert $THING_NAME.crt --key $THING_NAME.key \
  -h $IOT_ENDPOINT -p 8883 -q 1 -t iot/ws/$THING_NAME \
  -i $THING_NAME     --tls-version tlsv1.2 \
  -m "{\"prov\": \"bulk\", \"date\": \"$(date)\"}" -d
image