AWS IoTのリソース管理サービスRegistryを触ってみた #reinvent

2015.10.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS IoT Registry とは

AWS IoT には Registry  というコンポーネントがあり、IoT サービスで利用するデバイスに紐づく

  • デバイス名
  • クライアントID
  • X.509証明書
  • 属性

などの情報を一元管理できます。

AWS-IoT-HowITWorks-Registry

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 が見当たらなくなりました。

参考