この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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
が見当たらなくなりました。