[AWS IoT] CloudWatch Logsへの記録を有効にしてトラブルをデバッグする
1 はじめに
CX事業本部の平内(SIN)です。
AWS IoTでは、その動作をCloudWatch Logsでモニターすることができます。
参考:CloudWatch Logs の使用による AWS IoT のモニタリング
今回は、このログを使用して、簡単なトラブルを確認してみました。
2 ログの有効化
AWS IoTのログは、コンソールから設定 > ログ で設定できますが、デフォルトで「無効」となっています。「有効」にするためには、「編集」ボタンで設定を行います。
設定する内容は、詳細レベルとロールです。
- 詳細レベルは、以下の4種類が選択可能です。
- Roleの設定は、ロールの作成を選択すると、自動的に作成できます。
3 ログの確認
ログが有効にされていると、AWS ToIログは、CloudWatch Logsのロググループ(AWSIotLogsV2)に出力されます。
以下は、デバッグ(詳細レベルが最も高い) で記録されたログの一例です。
そして、こちらが、エラー(詳細レベルが最も低い) で記録されたログです。
4 トラブル確認
簡単なトラブルについて確認します。
(1) クライアントID
AWSIoTPythonSDKでMQTTを使用する場合、AWSIoTMQTTClientのコンストラクタでクライアントIDを設定します。
clientId = "client_id" client = AWSIoTMQTTClient(clientId) client.configureEndpoint(endPoint, port) client.configureCredentials(rootCA, privateKey, certificate) client.connect()
しかし、上記のようなコードが以下のようにエラーとなった場合の例です。
AWSIoTPythonSDK.exception.AWSIoTExceptions.connectTimeoutException
もし、原因が、ポリシーのiot:Connectのリソース指定に誤り(client_IDは、大文字小文字に誤りがあります)があったとすると、以下のようなログが残ります。
{ "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:client/client_ID" ] }
このログでは、Connectイベントが、認証エラーとなっている事が分かります。もし、EndPointや、証明書等に問題があった場合、Connectイベントまで来ないので、ポリシーの確認が必要あることが分かります。 ちなみに、EndPointや、証明書等に問題があった場合も、クライアント側では、同じように、AWSIoTExceptions.connectTimeoutExceptionエラーとなるのですが、ログは一切残りません。(証明書の認証エラーは、ここに出力されません)
(2) トピック名
続いて、publishで以下のようなエラーとなった場合の例です。
topic = "topic_1" client.publish(topic, payload, 1)
AWSIoTPythonSDK.exception.AWSIoTExceptions.publishTimeoutException
ここでも、原因が、ポリシーのiot:Publishのリソース指定に誤り(Topic_1は、大文字小文字に誤りがあります)があったとすると、以下のようなログが残ります。
{ "Effect": "Allow", "Action": [ "iot:Publish" ], "Resource": [ "arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:topic/Topic_1" ] }
このログでは、Connectは、成功しているが、Publishイベントが、認証エラーとなっている事が分かります。
(3) ルール
最後に、ルールの設定がうまくトリガーしない場合の例です。以下の設定では、topic_1というトピックが到着した際に、Lambdaを起動しています。
正常に動作すると、以下のようなログが確認できます。最初に、RuleMatchイベントがSuccessとなって、ルールが想定通りヒットしている事がわかります。
続いて、アクションに指定したLambdaが正常に呼び出されている事を、RuleExecutionイベントで確認できます。
想定したアクションが動作しない場合、上記あたりのログを確認することで、何処で止まっているのかが分かると思います。
5 最後に
今回は、AWS IoTのログを有効化して、簡単なトラブルを確認してみました。
トラブルの原因が分からない時は、MQTTのメッセージを#で全部モニターしたり、このようにログを確認する事が必要かと思います。
なお、ログ記録が「有効」になっていると、継続的にそれなりのログが出力されるので、特に必要がない場合は、作業終了後、「無効」に戻す事をお勧めします。 想定外に料金が上がる可能性が有ることにご注意下さい。