AWS IoT のモニタリング (CloudWatch メトリクス )
接続成功数
※ マネジメントコンソールのスクリーン ショットは、2021/03現在、
「新しいコンソールエクスペリエンス」
からオプトインできる画面をベースに紹 介しています
AWS IoT Core への接続が成功しているかを確認する ( クラウド側 )
CloudWatch ログ
fields @timestamp, @message
| sort @timestamp desc
| filter eventType = "Connect"
{"timestamp": "2021-02-22 09:07:15.137",
"logLevel": "INFO",
"traceId": "33b7fe1a-ae31-1869-44a6-0ca9c143f549",
"accountId": ”123456789012",
"status": "Success",
"eventType": "Connect",
"protocol": "MQTT",
"clientId": "test-client",
“principalId”: “証明書ID",
"sourceIp": ”123.45.67.89",
"sourcePort": 12345 }
{"timestamp": "2021-02-22 09:07:34.987",
"logLevel": "ERROR",
"traceId": "59625791-fc22-3e20-010e-c05f96f71121",
"accountId": " 123456789012",
"status": "Failure",
"eventType": "Connect",
"protocol": "MQTT",
"clientId": "test-client",
"principalId": “証明書ID",
"sourceIp": " 123.45.67.89",
"sourcePort": 12345,
"reason": "AUTHORIZATION_FAILURE",
"details": "Authorization Failure"
}
例 : 成功時 例 : 失敗時
ロググループ
: AWSIotLogsV2
へのクエリ例ポリシーの iot:Connect を確認
AWS IoT Core に接続できない
問題の切り分け箇所
• デバイス側
• AWS IoT Device SDK の ログ
• クラウド側
• AWS IoT のモニタリング
• CloudWatch ログ
確認するポイント
• デバイス側
• ネットワークは問題ないか?
• Device SDK の設定は適切か?
• 証明書は問題ないか?
• クラウド側
• 証明書は有効か?
• 証明書の有効期限は切れていな いか?
• 証明書にポリシーがアタッチさ れているか?
• ポリシーは適切か?
接続失敗時の確認ポイント ( デバイス側 )
ネットワークは問題ないか?
• 有線 / 無線 LAN は繋がっているか?
• 名前解決はできているか?
社内ネットワークなどの制限されたネットワーク環境でよくある問題
• 8883 ( もしくは 443 、 MQTT の場合 ) ポートへの通信が許可されている か?
• MQTT プロトコルが許可されているか?
• プロキシ設定は必要か?
デバイス側のエラーの種類も異なります
awscrt.exceptions.AwsCrtError:
AWS_IO_DNS_INVALID_NAME: Host name was invalid
for dns resolution.
参考 : AWS IoT Device SDK の Proxy サポート状況 (2021/03 現在 )
• HTTP Proxy
とはHTTP CONNECT
メソッドによるHTTP tunnel
をサポートしているプロキシを指しています。• Python SDK v1
ではPySocks
ライブラリ によるプロキシ接続のサンプルを提供しており、サンプルには掲載がないです がPySocks
の機能としてHTTP
のBasic
認証、SOCKS5
の認証をサポートしています。• MQTT over WebSocket
を利用する場合はSigV4
による認証となります。• AWS IoT Greengrass
はv1.7
以降でHTTP Proxy
をサポートしています。Device SDK
バージョンv1
バージョンv2
Python
プロトコル: MQTT, MQTT over WebSocket
プロキシ: SOCKS5, HTTP
プロトコル
: MQTT over WebSocket
プロキシ: HTTP
Node.js -
プロトコル: MQTT over WebSocket
プロキシ
: HTTP
Java -
プロトコル: MQTT over WebSocket
プロキシ: HTTP
C++ -
プロトコル: MQTT over WebSocket
プロキシ: HTTP
Embedded C
v3.0.1:
サンプルを提供プロトコル
: MQTT
、プロキシ: HTTP
https://github.com/aws-samples/aws-iot-device-sdk-embedded-c-http-proxy-support
v4 (202103.00):
-接続失敗時の確認ポイント ( デバイス側 )
Device SDK の設定は適切か?
例 : AWS IoT Device SDK Python v2
mqtt_connection = mqtt_connection_builder.mtls_from_path(
endpoint=”xxx-ats.iot.your-region.amazonaws.com", client_id="test-client",
cert_filepath=”xxx-certificate.pem.crt", pri_key_filepath=”xxx-private.pem.key", ca_filepath="AmazonRootCA1.pem",
… )
エンドポイント
URL
に誤りはないか 証明書を登録したリージョンかポリシーで許可したクライアント
ID
(
もしくはモノの名前)
になっているか?証明書・秘密鍵のパスやファイル名は正しいか?
間違っている場合は
FileNotFoundError
になりますFileNotFoundError: [Errno 2] No such file or
directory: ‘xxx-certificate.pem.crt'
接続失敗時の確認ポイント ( デバイス側 )
証明書は問題ないか? ( 独自 CA 利用時など )
• 証明書に問題がある場合など、 TLS のレイヤーで接続に失敗している場 合、 CloudWatch にエラーが記録されない
• OpenSSL コマンドでエンドポイントへの接続をテスト
https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/diagnosing-connectivity-issues.html#troubleshooting-authentication
openssl s_client -connect xxx-ats.iot.aws-region.amazonaws.com:8443
-CAfile AmazonRootCA1.pem -cert certificate.pem -key privateKey.pem
接続失敗時の確認ポイント ( クラウド側 )
証明書は 有効 か? •
マネジメントコンソールから作成 した場合、デフォルトでは無効証明書の
ID (363f08f46….
のような 長い文字列)
の確認方法•
証明書をダウンロードしたときの ファイル名を確認(
証明書のID
の 先頭と一致)
無効になっている場合は
接続失敗時の確認ポイント ( クラウド側 )
証明書の 有効期限 は切れていないか?
( 独自 CA の場合 )
• AWS IoT Core
で発行した証明書の場 合は、2049
年12
月末(UTC)
まで有効• AWS IoT Device Defender
の監査を利 用することで、CA
証明書やクライア ント証明書の有効期限切れをチェッ ク可能接続失敗時の確認ポイント ( クラウド側 )
証明書に ポリシーがアタッチ されているか? •
モノのグループに対してポリシーをアタッチしている場合は、
証明書とモノの紐付け、モノと グループの紐付け、グループと ポリシーの紐付けを確認
ポリシーがアタッチされてい ない場合は、アクションから
「ポリシーのアタッチ」
接続失敗時の確認ポイント ( クラウド側 )
ポリシーに適切な接続の権限が与えられているか?
https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/connect-policy.html
{
"Version": "2012-10-17",
"Statement": [ {
"Effect": "Allow",
"Action": [ "iot:Connect" ],
"Resource": [ "arn:aws:iot:us-east-1:123456789012:client/client1” ]
},
… ] }
iot:Connect
を確認リージョン・アカウント
ID
は正しいか?クライアント
ID
は正しいか?(
デバイス側の設定と一致させる)
${iot:Connection.Thing.ThingName}
のようなポリシー変数を使う場合は、モノと 証明書が紐付けられていることを確認する
Publish / Subscribe できない
問題の切り分けフロー
デバイス AWS IoT Core AWS サービス
AWS IoT Core
に 接続できないデバイスからの
(
への)
メッセージが届かない•
ネットワークの確認•
証明書・ポリシーの確認• Device SDK
の設定の確認Yes No
メッセージの
QoS1
での送信・受信(
デバイス側)
テスト画面でのPub/Sub
・ログ(
クラウド側)
•
トピック・ポリシーの確認• Device SDK
の設定の確認Yes
ルールがうまく動かない
No
•
ルール・IAM
ロールの確認• AWS SDK
の設定の確認Yes
OK
No
切り分け時の確認箇所 問題修正時の確認箇所
Publish / Subscribe できない
問題の切り分け箇所
• クラウド側
• AWS IoT のテスト画面
• AWS IoT のモニタリング
• CloudWatch ログ
• デバイス側
• AWS IoT Device SDK の ログ
確認するポイント
• クラウド側
• ポリシーは適切か
• デバイス側
• Device SDK の実装は適切か
• 番外編
• Basic Ingest を利用する場合
• Boto3 を利用する場合
デバイスとのメッセージングを確認する ( クラウド側 )
AWS IoT のテスト画面
デバイスからのメッセージを確認 デバイスへメッセージを送信
デバイスがメッセージを送る トピックにサブスクライブ
トピックにメッセージが届け ば表示される
デバイスがサブスクライブし ているトピック
QoS 1
を選択して確実に配信デバイスとのメッセージングを確認する ( クラウド側 )
AWS IoT のモニタリング (CloudWatch メトリクス )
Inbound:
デバイスからIoT Core
へのメッセージ数Outbound: IoT Core
からデバイスへのメッセージ数※ マネジメントコンソールのテスト画面を利用している場合は、デバイスだけでなく、
テスト画面で
Publish / Subscribe
したメッセージの件数も含まれますクラウドへのメッセージを確認する ( デバイス側 )
AWS IoT Device SDK のログを確認する
例 : AWS IoT Device SDK Python v2 (awsiotsdk==1.5.6)
実装例
…
connect_future = mqtt_connection.connect() connect_future.result()
…
publish_future, _ = mqtt_connection.publish(
topic=”my/topic",
payload=’{“hello”: “world”}’, qos=mqtt.QoS.AT_LEAST_ONCE, ) publish_future.result(timeout=5)
Traceback (most recent call last):
File ”publish.py", line 60, in <module>
main()
…
File ”publish.py", line 49, in run publish_future.result(timeout=5) File
"/…/lib/python3.X/concurrent/futures/_base.py
", line 441, in result raise TimeoutError()
concurrent.futures._base.TimeoutError
失敗時 ( 例外が発生 )
デバイス
AWS IoT Core
デバイスからのメッセージを確認する ( クラウド側 )
CloudWatch ログ
{"timestamp": "2021-02-22 09:07:15.137",
"logLevel": "INFO",
"traceId": "33b7fe1a-ae31-1869-44a6-0ca9c143f549",
"accountId": ”123456789012",
"status": "Success",
"eventType": ”Publish-In",
"protocol": "MQTT",
“topicName”: "トピック名",
“clientId”: “クライアントID",
“principalId”: “証明書ID",
"sourceIp": ”123.45.67.89",
"sourcePort": 12345 }
{"timestamp": "2021-02-22 09:07:34.987",
"logLevel": "ERROR",
"traceId": "59625791-fc22-3e20-010e-c05f96f71121",
"accountId": " 123456789012",
"status": "Failure",
"eventType": ”Publish-In",
"protocol": "MQTT",
“topicName”: "トピック名",
“clientId”: “クライアントID",
"principalId": “証明書ID",
"sourceIp": " 123.45.67.89",
"sourcePort": 12345,
"reason": "AUTHORIZATION_FAILURE",
"details": "Authorization Failure"
}
例 : 成功時 ( デバイスから IoT Core) 例 : 失敗時
fields @timestamp, @message
| sort @timestamp desc
| filter eventType = ”Publish-In"
ロググループ
: AWSIotLogsV2
へのクエリ例デバイス
AWS IoT Core
ポリシーの iot:Publish を確認
クラウドからのメッセージを確認する ( デバイス側 )
AWS IoT Device SDK のログを確認する
例 : AWS IoT Device SDK Python v2 (awsiotsdk==1.5.6)
実装例
…
connect_future = mqtt_connection.connect() connect_future.result()
…
subscribe_future, _ =
mqtt_connection.subscribe(
topic=”my/topic",
qos=mqtt.QoS.AT_LEAST_ONCE, callback=my_callback,
)
subscribe_future.result(timeout=5)
Traceback (most recent call last):
File ”subscribe.py", line 60, in <module>
main()
…
File ”subscribe.py", line 47, in run subscribe_future.result(timeout=5) File
"/…/lib/python3.X/concurrent/futures/_base.py
", line 441, in result raise TimeoutError()
concurrent.futures._base.TimeoutError
失敗時 ( 例外が発生 )
デバイス
AWS IoT Core
デバイスへのメッセージを確認する ( クラウド側 )
CloudWatch ログ
fields @timestamp, @message
| sort @timestamp desc
| filter eventType = ”Subscribe"
ロググループ
: AWSIotLogsV2
へのクエリ例{"timestamp": "2021-02-22 09:07:15.137",
"logLevel": "INFO",
"traceId": "33b7fe1a-ae31-1869-44a6-0ca9c143f549",
"accountId": ”123456789012",
"status": "Success",
"eventType": ”Subscribe",
"protocol": "MQTT",
“topicName”: "トピック名",
“clientId”: “クライアントID",
“principalId”: “証明書ID",
"sourceIp": ”123.45.67.89",
"sourcePort": 12345 }
{"timestamp": "2021-02-22 09:07:34.987",
"logLevel": "ERROR",
"traceId": "59625791-fc22-3e20-010e-c05f96f71121",
"accountId": " 123456789012",
"status": "Failure",
"eventType": ”Subscribe",
"protocol": "MQTT",
“topicName”: "トピック名",
“clientId”: “クライアントID",
"principalId": “証明書ID",
"sourceIp": " 123.45.67.89",
"sourcePort": 12345,
"reason": "AUTHORIZATION_FAILURE",
"details": "Authorization Failure"
}
例 : 成功時 例 : 失敗時
デバイス
AWS IoT Core
ポリシーの iot:Subscribe を確認
デバイスへのメッセージを確認する ( クラウド側 )
CloudWatch ログ
fields @timestamp, @message
| sort @timestamp desc
| filter eventType = ”Publish-Out"
ロググループ
: AWSIotLogsV2
へのクエリ例{"timestamp": "2021-02-22 09:07:15.137",
"logLevel": "INFO",
"traceId": "33b7fe1a-ae31-1869-44a6-0ca9c143f549",
"accountId": ”123456789012",
"status": "Success",
"eventType": ”Publish-Out",
"protocol": "MQTT",
“topicName”: "トピック名",
“clientId”: “クライアントID",
“principalId”: “証明書ID",
"sourceIp": ”123.45.67.89",
"sourcePort": 12345 }
{"timestamp": "2021-02-22 09:07:34.987",
"logLevel": "ERROR",
"traceId": "59625791-fc22-3e20-010e-c05f96f71121",
"accountId": " 123456789012",
"status": "Failure",
"eventType": ”Publish-Out",
"protocol": "MQTT",
“topicName”: "トピック名",
“clientId”: “クライアントID",
"principalId": “証明書ID",
"sourceIp": " 123.45.67.89",
"sourcePort": 12345,
"reason": "AUTHORIZATION_FAILURE",
"details": "Authorization Failure"
}
例 : 成功時 例 : 失敗時
デバイス