オーソライザーのトラブルシューティング - AWS IoT Core

オーソライザーのトラブルシューティング

このトピックでは、カスタム認証ワークフローで問題を引き起こす可能性のある一般的な問題と、それらを解決するための手順について説明します。問題を最も効果的にトラブルシューティングするには、 AWS IoT Core の CloudWatch ログを有効にし、ログレベルを DEBUG に設定します。 AWS IoT Core コンソール (https://console.aws.amazon.com/iot/) で CloudWatch ログを有効にできます。 AWS IoT Core のログの有効化と設定の詳細については、「AWS IoT のログ記録の設定」を参照してください。

注記

ログレベルを長期間 DEBUG のままにしておくと、CloudWatch は大量のログデータを保存する可能性があります。これにより、CloudWatch の料金が増加する可能性があります。リソースベースのログ記録を使用して、特定のモノのグループ内のデバイスのみの詳細度を高めることを検討してください。リソースベースのログ記録の詳細については、AWS IoT のログ記録の設定 を参照してください。また、トラブルシューティングが完了したら、ログレベルの詳細度を引き下げます。

トラブルシューティングを開始する前に、カスタム認証ワークフローについて でカスタム認証プロセスの概要を確認してください。これは、問題の原因を見つけるのにどこを確認すればよいかを理解するのに役立ちます。

このトピックでは、調査する次の 2 つの領域について説明します。

  • オーソライザーの Lambda 関数に関連する問題。

  • デバイスに関連する問題。

オーソライザーの Lambda 関数に問題がないか確認する

次の手順を実行して、デバイスの接続試行が Lambda 関数を呼び出していることを確認します。

  1. オーソライザーに関連付けられている Lambda 関数を確認します。

    これを行うには、DescribeAuthorizer API を呼び出すか、 AWS IoT Core コンソールの [Secure] (安全性) セクションで目的のオーソライザーをクリックします。

  2. Lambda 関数の呼び出しメトリクスを確認します。これを行うには、次の手順を実行します。

    1. AWS Lambda コンソール (https://console.aws.amazon.com/lambda/) を開き、オーソライザーに関連付けられている関数を選択します。

    2. [Monitor] (監視) タブを選択し、問題に関連する時間枠のメトリクスを表示します。

  3. 呼び出しが表示されない場合は、 AWS IoT Core に Lambda 関数を呼び出すためのアクセス許可があることを確認します。呼び出しが表示された場合は、次の手順に進みます。次の手順を実行して、Lambda 関数に必要なアクセス許可があることを確認します。

    1. AWS Lambda コンソールで関数の [Permissions] (アクセス許可) タブを選択します。

    2. ページの下部にある [Resource-based Policy] (リソースベースのポリシー) セクションを見つけます。Lambda 関数に必要なアクセス許可がある場合、ポリシーは次の例のようになります。

      { "Version": "2012-10-17", "Id": "default", "Statement": [ { "Sid": "Id123", "Effect": "Allow", "Principal": { "Service": "iot.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-1:111111111111:function:FunctionName", "Condition": { "ArnLike": { "AWS:SourceArn": "arn:aws:iot:us-east-1:111111111111:authorizer/AuthorizerName" }, "StringEquals": { "AWS:SourceAccount": "111111111111" } } } ] }
    3. このポリシーは、関数に対する InvokeFunction アクセス許可を AWS IoT Core プリンシパルに付与します。表示されない場合は、AddPermission API を使用して追加する必要があります。次の例では、AWS CLI を使用してこの操作を行う方法を示しています。

      aws lambda add-permission --function-name FunctionName --principal iot.amazonaws.com --source-arn AuthorizerARn --statement-id Id-123 --action "lambda:InvokeFunction"
  4. 呼び出しが表示された場合は、エラーがないことを確認します。エラーは、Lambda 関数が AWS IoT Core から送信される接続イベントを適切に処理していないことを示唆している可能性があります。

    Lambda 関数でのイベントの処理については、Lambda 関数の定義 を参照してください。AWS Lambda コンソール (https://console.aws.amazon.com/lambda/) のテスト機能を使用して、関数のテスト値をハードコーディングし、関数がイベントを正しく処理していることを確認できます。

  5. エラーのない呼び出しが表示されても、デバイスが接続 (またはメッセージを発行、サブスクライブ、および受信) できない場合、問題は、Lambda 関数が返すポリシーが、デバイスが実行しようとしているアクションのためのアクセス許可を付与しないことである可能性があります。関数が返すポリシーに問題があるかどうかを判断するには、次の手順を実行します。

    1. Amazon CloudWatch Logs Insights クエリを使用して、短期間にログをスキャンし、エラーがないか確認します。次のクエリ例では、イベントをタイムスタンプでソートし、エラーを探します。

      display clientId, eventType, status, @timestamp | sort @timestamp desc | filter status = "Failure"
    2. Lambda 関数を更新して、 AWS IoT Core に返されるデータと、関数をトリガーするイベントをログに記録します。これらのログを使用して、関数が作成するポリシーを検査できます。

デバイスの問題の調査

Lambda 関数の呼び出しに問題がない場合や、関数が返すポリシーに問題がない場合は、デバイスの接続試行に問題がないか確認してください。不正な形式の接続リクエストにより、 AWS IoT Core がオーソライザーをトリガーしない可能性があります。接続の問題は、TLS レイヤーとアプリケーションレイヤーの両方で発生する可能性があります。

考えられる TLS レイヤーの問題:

  • お客様は、すべてのカスタム認証リクエストで、ホスト名ヘッダー (HTTP、MQTT over WebSockets) または Server Name Indication TLS 拡張 (HTTP、MQTT over WebSockets、MQTT) を渡す必要があります。どちらの場合も、渡される値は、アカウントの AWS IoT Core データエンドポイントの 1 つと一致する必要があります。これらは、次の CLI コマンドを実行したときに返されるエンドポイントです。

    • aws iot describe-endpoint —endpoint type iot:data-ats

    • aws iot describe-endpoint —endpoint type (レガシー VeriSign エンドポイント)

  • MQTT 接続にカスタム認証を使用するデバイスは、mqtt の値の Application Layer Protocol Negotiation (ALPN) TLS 拡張も渡す必要があります。

  • カスタム認証は現在、ポート 443 でのみ使用できます。

考えられるアプリケーション層の問題:

  • 署名が有効になっている場合 (オーソライザーで signingDisabled フィールドが false の場合)、次の署名の問題がないかを確認します。

    • x-amz-customauthorizer-signatureヘッダーまたはクエリ文字列パラメータのいずれかでトークン署名を渡していることを確認してください。

    • サービスがトークン以外の値に署名していないことを確認してください。

    • オーソライザーの token-key-name フィールドで指定したヘッダーまたはクエリパラメータでトークンを渡すようにしてください。

  • x-amz-customauthorizer-nameヘッダーまたはクエリ文字列パラメータで渡すオーソライザー名が有効であること、またはアカウント用にデフォルトのオーソライザーが定義されていることを確認してください。