前回、IAM Roles Anywhereの検証をしてとても良い機能だなと感じました。
そういえば、証明書を使った認証にIoT Coreがあったな🤔と思い出し、同じことができるかやってみました!試したところちょっとした違いがあり、IoT Coreでやるのもアリかもしれません。
前回、IAM Roles Anywhereの検証をしてとても良い機能だなと感じました。
そういえば、証明書を使った認証にIoT Coreがあったな🤔と思い出し、同じことができるかやってみました!試したところちょっとした違いがあり、IoT Coreでやるのもアリかもしれません。
AWSではIoT CoreをはじめDevice Mangementなど関連サービスが多数提供されています。IoT系サービスを試してみる場合、IoTという特性上クラウド側の準備の他にデバイス側も準備する必要があり、かなり手間がかかってしまいます。デバイス側の手間を削減するため、AWSがデバイス側のソフトウェアとしてAWS IoT Device Client
をOSSで公開していますので、これを使って簡単にPoCを始めることができます。
RPortとは
Self-hosted open source remote management solution for Windows & Linux. Intuitive, easy to use inventory management, remote access, script execution, VPN replacement, and much more.
Windows & Linux 用のセルフホスティング型オープンソース・リモートマネジメント・ソリューション。直感的で使いやすいインベントリ管理、リモートアクセス、スクリプトの実行、VPNの代替など、さまざまな機能を提供します。
公式サイトより
ThingsBoardはオープンソースのIoTプラットフォームです。 デバイス管理やデータ収集、処理、可視化が可能です。 オープンソースのCommunity Editionの他に商用サービスのProfessional Editionもあります。
機能はかなり豊富は印象です。リモートアクセス機能も提供されていますので紹介します。
過去にQiitaに投稿した内容のアーカイブです。
AWS IoT CoreとAzure IoT HubでIoT機器からデータをアップロードするサンプルを試しました。
No. | AWS IoT Core | Azure IoT Hub |
---|---|---|
(事前) | - | Azure CLIにエクステンションを追加する |
(事前) | - | リソース グループを作成する |
1 | - | IoT Hubを作成する |
2 | モノを作成する | デバイスを作成する |
3 | 証明書を作成する | - |
4 | ポリシーを作成する | - |
5 | 証明書にポリシーをアタッチする | - |
6 | 証明書にモノをアタッチする | - |
7 | 送信側のプログラムを作成する | 送信側のプログラムを作成する |
コマンド一発です。
aws iot create-thing --thing-name Thing001
パラメータで出力ファイル名を指定しています。
aws iot create-keys-and-certificate --certificate-pem-outfile "Cert001.cert.pem" --public-key-outfile "Cert001.public.key" --private-key-outfile "Cert001.private.key" --set-as-active
この先の手順で、実行結果に含まれる証明書のARN(certificateArn
)が必要となりますのでメモっておきましょう。(下の実行結果はAWS CLIのリファレンスの例です)
{
"certificateArn": "arn:aws:iot:us-west-2:123456789012:cert/9894ba17925e663f1d29c23af4582b8e3b7619c31f3fbd93adcb51ae54b83dc2",
"certificateId": "9894ba17925e663f1d29c23af4582b8e3b7619c31f3fbd93adcb51ae54b83dc2",
"certificatePem": "
-----BEGIN CERTIFICATE-----
MIICiTCCEXAMPLE6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMC
VVMxCzAJBgNVBAgEXAMPLEAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6
b24xFDASBgNVBAsTC0lBTSEXAMPLE2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAd
BgkqhkiG9w0BCQEWEG5vb25lQGFtYEXAMPLEb20wHhcNMTEwNDI1MjA0NTIxWhcN
MTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCEXAMPLEJBgNVBAgTAldBMRAwDgYD
VQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDAEXAMPLEsTC0lBTSBDb25z
b2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEXAMPLE25lQGFt
YXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+aEXAMPLE
EXAMPLEfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9T
rDHudUZEXAMPLELG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpE
Ibb3OhjZnzcvQAEXAMPLEWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4
nUhVVxYUntneD9+h8Mg9qEXAMPLEyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0Fkb
FFBjvSfpJIlJ00zbhNYS5f6GuoEDEXAMPLEBHjJnyp378OD8uTs7fLvjx79LjSTb
NYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE=
-----END CERTIFICATE-----\n",
"keyPair": {
"PublicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkEXAMPLEQEFAAOCAQ8AMIIBCgKCAQEAEXAMPLE1nnyJwKSMHw4h\nMMEXAMPLEuuN/dMAS3fyce8DW/4+EXAMPLEyjmoF/YVF/gHr99VEEXAMPLE5VF13\n59VK7cEXAMPLE67GK+y+jikqXOgHh/xJTwo+sGpWEXAMPLEDz18xOd2ka4tCzuWEXAMPLEahJbYkCPUBSU8opVkR7qkEXAMPLE1DR6sx2HocliOOLtu6Fkw91swQWEXAMPLE\GB3ZPrNh0PzQYvjUStZeccyNCx2EXAMPLEvp9mQOUXP6plfgxwKRX2fEXAMPLEDa\nhJLXkX3rHU2xbxJSq7D+XEXAMPLEcw+LyFhI5mgFRl88eGdsAEXAMPLElnI9EesG\nFQIDAQAB\n-----END PUBLIC KEY-----\n",
"PrivateKey": "-----BEGIN RSA PRIVATE KEY-----\nkey omittted for security reasons\n-----END RSA PRIVATE KEY-----\n"
}
}
まずポリシードキュメントを作成します。お試しなのでフルオープンですのでお気をつけください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:*"
],
"Resource": [
"*"
]
}
]
}
次にポリシーを作成します。
aws iot create-policy --policy-name Policy001 --policy-document file://policy.json
コマンド一発。証明書のARNは先の手順で取得したものです。
aws iot attach-policy --policy-name Policy001 --target "{証明書のARN}"
こちらもコマンド一発。証明書のARNは先の手順で取得したものです。
aws iot attach-thing-principal --thing-name Thing001 --principal "{証明書のARN}"
https://aws.amazon.com/jp/premiumsupport/knowledge-center/iot-core-publish-mqtt-messages-python/ にあるサンプルを使います。
pip install awsiotsdk
変数名 | 内容 |
---|---|
ENDPOINT | *1で取得できます |
CLIENT_ID | モノの名前(Thing001) |
PATH_TO_CERT | CERTのファイルパス(Cert001.cert.pem) |
PATH_TO_KEY | プライベートキーのファイルパス(Cert001.private.key) |
PATH_TO_ROOT | ここのAmazonルートCA 1をダウンロード |
*1 aws iot describe-endpoint --endpoint-type iot:Data-ATS
コマンド
20回送信したら終了します。
Connecting to xxxxxxxxxxxxxx-ats.iot.ap-northeast-1.amazonaws.com with client ID 'Thing001'...
Connected!
Begin Publish
Published: '{"message": "Hello World [1]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [2]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [3]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [4]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [5]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [6]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [7]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [8]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [9]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [11]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [12]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [13]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [14]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [15]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [16]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [17]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [18]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [19]"}' to the topic: 'test/testing'
Published: '{"message": "Hello World [20]"}' to the topic: 'test/testing'
Publish End
一部エクステンションが必要なコマンドがあるため、azure-iotエクステンションをインストールします。
az extension add --name azure-iot
IoT部分とは直接関係ありませんが、Azureの場合は必ずリソースグループが必要です。
az group create --name iot-resource-group --location japaneast
コマンド一発。お試しなのでSKUはF1
(無料)としてます。
az iot hub create --name iot-hub-00001 --resource-group iot-resource-group --partition-count 2 --sku F1
コマンド一発
az iot hub device-identity create --hub-name iot-hub-00001 --device-id Device001
https://github.com/Azure-Samples/azure-iot-samples-python/blob/master/iot-hub/Quickstarts/simulated-device/SimulatedDevice.py にあるサンプルを使います。
pip install azure-iot-device
変数名 | 内容 |
---|---|
CONNECTION_STRING | *2で取得できます |
*2 az iot hub device-identity connection-string show --hub-name iot-hub-00001 --device-id Device001
コマンド
無限に続きます
IoT Hub Quickstart #1 - Simulated device
Press Ctrl-C to exit
IoT Hub device sending periodic messages, press Ctrl-C to exit
Sending message: {"temperature": 22.73671571030419,"humidity": 65.13300283503716}
Message successfully sent
Sending message: {"temperature": 21.122891449050375,"humidity": 75.35478976197727}
Message successfully sent
Sending message: {"temperature": 30.11015190710952,"humidity": 79.1313503131281}
Message successfully sent
Sending message: {"temperature": 29.056883680577876,"humidity": 74.9253608733604}
Message successfully sent
Sending message: {"temperature": 30.35374671931261,"humidity": 73.57241118544626}
Message successfully sent
Sending message: {"temperature": 33.336413834339076,"humidity": 65.31133008367256}
Message successfully sent
Sending message: {"temperature": 34.92260215374919,"humidity": 69.53101153342156}
Message successfully sent
AWSとAzureでメッセージが届いたか確認する方法が違ったので、紹介します。
マネジメントコンソールのテストで確認できます。
CLIコマンドで確認できます。
az iot hub monitor-events --hub-name iot-hub-00001 --device-id Device001
Starting event monitor, filtering on device: Device001, use ctrl-c to stop...
{
"event": {
"origin": "Device001",
"module": "",
"interface": "",
"component": "",
"payload": "{\"temperature\": 24.86829506815134,\"humidity\": 62.82101201700818}"
}
}
{
"event": {
"origin": "Device001",
"module": "",
"interface": "",
"component": "",
"payload": "{\"temperature\": 27.671191300371653,\"humidity\": 70.30860685264159}"
}
}
{
"event": {
"origin": "Device001",
"module": "",
"interface": "",
"component": "",
"payload": "{\"temperature\": 22.581311567865644,\"humidity\": 66.70979111038993}"
}
}
Stopping event monitor...
おしまい。