疑難排解您的授權方 - AWS IoT Core

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

疑難排解您的授權方

本主題逐步解說可能會在自訂身分驗證工作流程中產生問題的常見問題,以及解決這些問題的步驟。若要最有效地疑難排解問題,請啟用 CloudWatch 記錄檔, AWS IoT Core 並將記錄層級設定為 DEBUG。您可以在 AWS IoT Core 主控台中啟用 CloudWatch 記錄檔 (https://console.aws.amazon.com/iot/)。如需針對 AWS IoT Core啟用和設定記錄的詳細資訊,請參閱 設定 AWS IoT 記錄

注意

如果您長時間將記錄檔層級保留在 DEBUG, CloudWatch 可能會儲存大量的記錄資料。這可能會增加您的 CloudWatch 費用。請考慮使用資源型記錄,以增加特定物件群組中僅限裝置的詳細資訊。如需資源型記錄的詳細資訊,請參閱 設定 AWS IoT 記錄。此外,當您完成疑難排解時,請將日誌層級降低到較不詳細的層級。

開始疑難排解之前,請檢閱 了解自訂身分驗證工作流程,以取得自訂身分驗證程序的高階檢視。這協助您了解可在哪裡尋找問題的來源。

本主題討論下列兩個可供您調查的領域。

  • 與您授權方 Lambda 函數相關的問題。

  • 與您裝置相關的問題。

檢查您的授權方 Lambda 函數中的問題

執行下列步驟,以確定您裝置的連線嘗試正在叫用 Lambda 函數。

  1. 確認哪個 Lambda 函數與您的授權方相關聯。

    您可以通過調用 DescribeAuthorizerAPI 或在 AWS IoT Core 控制台的「安全」部分中單擊所需的授權者來執行此操作。

  2. 檢查 Lambda 函數的叫用指標。執行下列步驟來執行此動作。

    1. 打開 AWS Lambda 控制台(https://console.aws.amazon.com/lambda/),然後選擇與您的授權者相關聯的功能。

    2. 選擇 Monitor (監控) 標籤,並檢視與您問題相關之時間範圍的指標。

  3. 如果沒有看到叫用,請確認是否 AWS IoT Core 具有叫用 Lambda 函數的權限。如果您看到叫用,請跳到下一個步驟。執行下列步驟來驗證您的 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 日誌洞察查詢在短時間內掃描日誌以檢查是否有故障。下列範例查詢會依時間戳記排序事件並尋找失敗。

      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 WebSockets) 或伺服器名稱指示 TLS 延伸模組 (HTTP、MQTT 超過 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 連線的裝置也須傳遞應用程式層通訊協定交涉 (ALPN) TLS 延伸 (其值為 mqtt)。

  • 自訂身分驗證目前僅適用於連接埠 443。

可能的應用程式層問題:

  • 如果已啟用簽署 (在您的授權方中,signingDisabled 欄位是 false),請尋找下列簽章問題。

    • 確定您是在 x-amz-customauthorizer-signature 標頭或在查詢字串參數中傳遞字符簽章。

    • 確定服務不是簽署字符以外的值。

    • 確定您在標頭或查詢參數中傳遞字符,而此標頭或查詢參數是您在授權方的 token-key-name 欄位中所指定的。

  • 確定您在 x-amz-customauthorizer-name 標頭或查詢字串參數中傳遞的授權方名稱是有效的,或者您已為您的帳戶定義預設授權方。