AWS IoTのリソース管理サービスRegistryを触ってみた #reinvent
AWS IoT Registry とは
AWS IoT には Registry というコンポーネントがあり、IoT サービスで利用するデバイスに紐づく
- デバイス名
- クライアントID
- X.509証明書
- 属性
などの情報を一元管理できます。
Registry のユースケース
デバイスが MQTT で AWS IoT の Device Gateway にメッセージ送信する際には
- クライアントID
- X.509 証明書
が必要です。
デバイスの利用開始時には、デバイスのこれら情報を必ず Registry に登録する運用にしておくと、Device Gateway のログのクライアントID情報から、メッセージを送信しているデバイスを特定出来ます。
サービスが終了後、属性情報で抽出したデバイスに対して、証明書を無効化してメッセージ送信出来ないようにする、といったことも考えられます。
Registry の機能制限
属性について
属性は3つまでしか設定出来ません。
データ保持期間
7 年間全くアクセス・更新されなかったデバイスデータは削除されます。
Registry 情報と Device Gateway の紐付け
Registry はあくまでもデバイス管理を楽にするための補助ツールです。
AWS IoT Device Gateway への MQTT メッセージ送信に関し、Registry の登録情報とは異なるクライアントIDや証明書でデータ送信できますし、そもそも Registry にデバイスを登録しなくてもデータ送信できます。
デバイスの登録
初期状態ではデバイスが一台も存在しません。
$ aws iot list-things { "things": [] }
my_mbp という名前のデバイスを登録します。 "device" = "laptop" という属性も合わせて登録します。
API は iot create-thing
です。
$ cat attribute-payload-laptop.json { "attributes": { "device" : "laptop" } } $ aws iot create-thing --thing-name my_mbp --attribute-payload file://attribute-payload-laptop.json { "thingArn": "arn:aws:iot:us-west-2:12345:thing/my_mbp", "thingName": "my_mbp" }
edison1 という名前のデバイスを登録します。 "device" = "edison" という属性も合わせて登録します。
$ cat attribute-payload-edison.json { "attributes": { "device" : "edison" } } $ aws iot create-thing --thing-name edison1 --attribute-payload file://attribute-payload-edison.json { "thingArn": "arn:aws:iot:us-west-2:12345:thing/edison1", "thingName": "edison1" }
同じ thing-name
での重複登録はできません。
$ aws iot create-thing --thing-name my_mbp A client error (ResourceAlreadyExistsException) occurred when calling the CreateThing operation: Thing my_mbp already exists in your account with different tags
登録済みデバイス一覧を確認してみましょう。
$ aws iot list-things { "things": [ { "attributes": { "device": "edison" }, "thingName": "edison1" }, { "attributes": { "device": "laptop" }, "thingName": "my_mbp" } ] }
デバイスの更新
デバイス名 "edison1" のデバイスに対して "env" = "dev" という属性も設定します。
API は iot update-thing
です。
$ cat attribute-payload2.json { "attributes": { "device" : "edison", "env" : "dev" } } $ aws iot update-thing --thing-name edison1 --attribute-payload file://attribute-payload2.json
API iot describe-thing
でデバイスの詳細を確認します。
$ aws iot describe-thing --thing-name my_mbp { "attributes": { "device": "edison", "env": "dev" }, "thingName": "edison1", "defaultClientId": "edison1" }
$ aws iot list-things { "things": [ { "attributes": { "device": "edison", "env": "dev" }, "thingName": "edison1" }, { "attributes": { "device": "laptop" }, "thingName": "my_mbp" } ] }
デバイスにX.509証明書の紐付け
デバイスとX.509証明書は多対多の関係にあります。
登録済み証明書を API list-certificates
で確認します。
$ aws iot list-certificates { "certificates": [ { "certificateArn": "arn:aws:iot:us-west-2:12345:cert/b468DUMMY", "status": "ACTIVE", "creationDate": 1444339991.424, "certificateId": "b468DUMMY" } ] }
この出力結果からわかるように、証明書は certificateArn が割り当てられているた め、権限周りはこの ARN を利用します。
API attach-thing-principal
でデバイスに証明書をひも付けます。
API list-thing-principals
でデバイスに紐づく証明書一覧を確認します。
$ aws iot attach-thing-principal \ --thing-name my_mbp \ --principal arn:aws:iot:us-west-2:12345:cert/b468DUMMY $ aws iot list-thing-principals --thing-name my_mbp { "principals": [ "arn:aws:iot:us-west-2:12345:cert/b468DUMMY" ] }
デバイスから証明書のひも付けを解除するには API detach-thing-principal
を使います。
$ aws iot detach-thing-principal --thing-name my_mbp --principal arn:aws:iot:us-west-2:12345:cert/b468DUMMY
デバイス一覧の絞り込み
一覧表示するデバイスをデバイス属性(attributes
)で抽出するには一覧表示 API(list-things
) に
キー(--attribute-name)
バリュー(
--attribute-value)
を引数で渡します。
"device" = "edison" の属性を持ったデバイスを抽出するには次のようにします。
$ aws iot list-things --attribute-name device --attribute-value edison { "things": [ { "attributes": { "device": "edison", "env": "dev" }, "thingName": "edison1" } ] }
属性を複数指定すると、属性の AND 条件にマッチしたデバイスが抽出されます。
$ aws iot list-things \ --attribute-name device --attribute-value edison \ --attribute-name env --attribute-value dev { "things": [ { "attributes": { "device": "edison", "env": "dev" }, "thingName": "edison1" } ] }
デバイスの削除
API iot delete-thing
でデバイスを削除できます。
$ aws iot delete-thing --thing-name edison1 $ aws iot list-things { "things": [ { "attributes": { "device": "laptop" }, "thingName": "my_mbp" } ] }
デバイス一覧に削除したデバイス edison1
が見当たらなくなりました。