• 検索結果がありません。

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"

}

例 : 成功時 例 : 失敗時

デバイス

AWS IoT Core

ポリシーの iot:Receive を確認

Publish / Subscribe できない

問題の切り分け箇所

• クラウド側

• AWS IoT のテスト画面

• AWS IoT のモニタリング

• CloudWatch ログ

• デバイス側

• AWS IoT Device SDK の ログ

確認するポイント

• クラウド側

• ポリシーは適切か

• デバイス側

• Device SDK の実装は適切か

• 番外編

• Basic Ingest を利用する場合

• Boto3 を利用する場合

関連したドキュメント