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

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

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

このトピックでは、カスタム認証ワークフローで問題を引き起こす可能性のある一般的な問題と、それらを解決するための手順について説明します。問題を最も効果的にトラブルシューティングするには、DEBUG CloudWatch AWS IoT Core のログを有効にし、ログレベルを 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 関数を確認します。

    そのためには、DescribeAuthorizerAPI を呼び出すか、 AWS IoT Core コンソールの「セキュア」セクションで目的のオーソライザーをクリックします。

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

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

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

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

    1. コンソールで関数の [権限] タブを選択します。 AWS Lambda

    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 関数に対する権限をプリンシパルに付与します。表示されない場合は、AddPermissionAPI を使用して追加する必要があります。次の例では、 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 返されるデータと、関数をトリガーするイベントをログに記録します。これらのログを使用して、関数が作成するポリシーを検査できます。

  6. 呼び出しにエラーがないにもかかわらず、デバイスが接続できない (またはメッセージを発行、サブスクライブ、受信できない) 場合は、別の原因として、Lambda 関数がタイムアウト制限を超えている可能性があります。カスタムオーソライザーの Lambda 関数のタイムアウト制限は 5 秒です。 CloudWatch 関数の所要時間はログまたはメトリックスで確認できます。

デバイスの問題の調査

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

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

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

    • aws iot describe-endpoint --endpoint-type iot:Data-ATS

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

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

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

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

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

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

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

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

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