Thing Groups

モノのグループによって複数のモノをカテゴライズして管理することができます。

ここでは、個々のデバイスの証明書に対して IoT ポリシーをアタッチするかわりに、グループに対してポリシーをアタッチして権限を設定する方法を学びます。グループに対してアタッチするポリシーでは、変数を利用して各デバイスが以下のトピックに配信できるようにします。

telemetry/building/NAME/${iot:ClientId}

モノのグループのポリシーを作成、グループに対してポリシーをアタッチ、新しくモノを作成し、モノをグループに追加します。

Cloud9 のターミナルで以下のコマンドを実行します。

# ホームディレクトリへ移動します
cd

# 環境変数を確認します
echo $NAME

# モノのグループを作成します($NAME というビルに属するデバイスのグループ)
THING_GROUP_NAME=building-$NAME
aws iot create-thing-group \
  --thing-group-name $THING_GROUP_NAME > /tmp/create_group_response

# レスポンスからグループのARNを環境変数に設定します
GROUP_ARN=$(jq -r ".thingGroupArn" /tmp/create_group_response)

# ポリシーに利用するために、AWSアカウントのIDを取得します
ACCOUNT_ID=$(aws sts get-caller-identity | jq -r '.Account')

# IoT ポリシーを作成します
POLICY_NAME="SmartBuilding_${NAME}_Policy"
aws iot create-policy --policy-name $POLICY_NAME \
--policy-document "{\
\"Version\": \"2012-10-17\",\
\"Statement\": [{\
    \"Effect\": \"Allow\",
    \"Action\": [\"iot:Connect\"],\
    \"Resource\": [\
        \"arn:aws:iot:$AWS_REGION:$ACCOUNT_ID:client/\${iot:ClientId}\"\
    ]\
},\
{\
    \"Effect\": \"Allow\",\
    \"Action\": [\"iot:Publish\"],\
    \"Resource\": [\
        \"arn:aws:iot:$AWS_REGION:$ACCOUNT_ID:topic/telemetry/building/$NAME/\${iot:ClientId}\"\
    ]\
  }]\
}"

# モノのグループにポリシーをアタッチします
aws iot attach-policy \
  --target $GROUP_ARN \
  --policy-name $POLICY_NAME

# ポリシーがグループにアタッチされたことを確認します
aws iot list-attached-policies --target $GROUP_ARN

新しくモノを作成します。なお、このモノの証明書にはポリシーをアタッチしないようにしてください。

mkdir group
cd group
THING_NAME=group-member-$NAME

# モノを作成します
aws iot create-thing --thing-name $THING_NAME

# 鍵と証明書を生成します
aws iot create-keys-and-certificate --set-as-active \
  --public-key-outfile $THING_NAME.public.key \
  --private-key-outfile $THING_NAME.private.key \
  --certificate-pem-outfile $THING_NAME.certificate.pem > /tmp/create_cert_and_keys_response
CERTIFICATE_ARN=$(jq -r ".certificateArn" /tmp/create_cert_and_keys_response)
CERTIFICATE_ID=$(jq -r ".certificateId" /tmp/create_cert_and_keys_response)

# 証明書をモノに紐付けます
aws iot attach-thing-principal --thing-name $THING_NAME \
  --principal $CERTIFICATE_ARN

作成したモノをグループに追加します。

aws iot add-thing-to-thing-group \
  --thing-name $THING_NAME \
  --thing-group-name $THING_GROUP_NAME

# グループに属するモノの一覧を確認します
aws iot list-things-in-thing-group \
  --thing-group-name $THING_GROUP_NAME

AWS IoT Core のコンソールに移動し、以下のトピックに Subscribe しておきます(NAME の部分を置き換えてください)。

telemetry/building/NAME/#

ポリシーで許可したトピックに対してメッセージを発行し、メッセージが届くことを確認します。

mosquitto_pub --cafile ~/root.ca.bundle.pem \
  --cert $THING_NAME.certificate.pem \
  --key $THING_NAME.private.key -h $IOT_ENDPOINT -p 8883 \
  -q 1 -t telemetry/building/$NAME/$THING_NAME -i $THING_NAME --tls-version tlsv1.2 \
  -m "{\"group\": \"test\", \"date\": \"$(date)\"}" -d

許可していないトピックに対してはメッセージが届かないことを確認します。

mosquitto_pub --cafile ~/root.ca.bundle.pem \
  --cert $THING_NAME.certificate.pem \
  --key $THING_NAME.private.key -h $IOT_ENDPOINT -p 8883 \
  -q 1 -t telemetry/building/$NAME/${THING_NAME}_foo -i $THING_NAME --tls-version tlsv1.2 \
  -m "{\"group\": \"test\", \"date\": \"$(date)\"}" -d

mosquitto_pub コマンドの実行結果からも、許可していないトピックに対してはエラーが返ってくることが確認できます。