[AWS IoT] CloudWatch Logsへの記録を有効にしてトラブルをデバッグする

トラブルも ログ有効で 恐れなし
2020.08.05

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のメッセージを#で全部モニターしたり、このようにログを確認する事が必要かと思います。

なお、ログ記録が「有効」になっていると、継続的にそれなりのログが出力されるので、特に必要がない場合は、作業終了後、「無効」に戻す事をお勧めします。 想定外に料金が上がる可能性が有ることにご注意下さい。