

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

# 疑難排解您的授權方
<a name="custom-auth-troubleshooting"></a>

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

**注意**  
如果您長期將日誌層級保留在 **DEBUG**，CloudWatch 可能會存放大量的記錄資料。這可能會增加您的 CloudWatch 費用。請考慮使用資源型記錄，以增加特定物件群組中僅限裝置的詳細資訊。如需資源型記錄的詳細資訊，請參閱 [設定 AWS IoT 記錄](configure-logging.md)。此外，當您完成疑難排解時，請將日誌層級降低到較不詳細的層級。

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

本主題討論下列兩個可供您調查的領域。
+ 與您授權方 Lambda 函數相關的問題。
+ 與您裝置相關的問題。

## 檢查您的授權方 Lambda 函數中的問題
<a name="custom-auth-troubleshooting-lambda"></a>

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

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

   若要執行此確認，您可以呼叫 [DescribeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeAuthorizer.html) API，或在 AWS IoT Core 主控台的 **Secure** (安全) 區段中按一下所需的授權方。

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

   1. 開啟 AWS Lambda 主控台 ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)：//)，然後選取與您的授權方相關聯的 函數。

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

1. 如果您未看到叫用，請確認 AWS IoT Core 具有叫用 Lambda 函數的許可。如果您看到叫用，請跳到下一個步驟。執行下列步驟來驗證您的 Lambda 函數是否具有必要的許可。

   1. 在 AWS Lambda 主控台中為您的函數選擇**許可**索引標籤。

   1. 在頁面底部尋找 **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"
              }
            }
          }
        ]
      }
      ```

   1. 此政策會將函數的`InvokeFunction`許可授予 AWS IoT Core 委託人。如果您沒有看到它，您必須使用 [AddPermission](https://docs.aws.amazon.com/lambda/latest/dg/API_AddPermission.html) API 來新增它。下列範例顯示如何使用 AWS CLI來做到這一點。

      ```
      aws lambda add-permission --function-name FunctionName --principal iot.amazonaws.com --source-arn AuthorizerARn --statement-id Id-123 --action "lambda:InvokeFunction"
      ```

1. 如果您看到叫用，請確認沒有錯誤。錯誤可能表示 Lambda 函數未正確處理 AWS IoT Core 傳送給它的連線事件。

   如需在 Lambda 函數中處理事件的相關資訊，請參閱 [定義您的 Lambda 函式](custom-auth-lambda.md)。您可以使用 AWS Lambda 主控台中的測試功能 ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)：//) 在函數中硬式編碼測試值，以確保函數正確處理事件。

1. 如果您看到叫用沒有錯誤，但您的裝置無法連接 (或發佈、訂閱和接收訊息)，問題可能是您 Lambda 函數傳回的政策未對您裝置正在嘗試採取的動作提供許可。執行下列步驟，以判斷函數傳回的政策是否發生任何錯誤。

   1. 使用 Amazon CloudWatch Logs Insights 查詢，來掃描短時間內的記錄以檢查是否發生失敗。下列範例查詢會依時間戳記排序事件並尋找失敗。

      ```
      display clientId, eventType, status, @timestamp | sort @timestamp desc | filter status = "Failure"    
      ```

   1. 更新您的 Lambda 函數以記錄其傳回的資料， AWS IoT Core 以及觸發函數的事件。您可以使用這些記錄來檢查函數建立的政策。

1. 如果您看到叫用沒有錯誤，但您的裝置無法連接 (或發佈、訂閱和接收訊息)，另一個原因可能是您 Lambda 函數超過逾時限制。自訂授權方的 Lambda 函數逾時限制為 5 秒。您可以在 CloudWatch 日誌或指標中查看函數持續時間。

## 調查裝置問題
<a name="custom-auth-troubleshooting-investigate"></a>

如果您發現叫用 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 連線的裝置也須傳遞應用程式層通訊協定交涉 (ALPN) TLS 延伸 (其值為 `mqtt`)。
+ 自訂身分驗證目前僅適用於連接埠 443。

**可能的應用程式層問題：**
+ 如果已啟用簽署 (在您的授權方中，`signingDisabled` 欄位是 false)，請尋找下列簽章問題。
  + 確定您是在 `x-amz-customauthorizer-signature` 標頭或在查詢字串參數中傳遞字符簽章。
  + 確定服務不是簽署字符以外的值。
  + 確定您在標頭或查詢參數中傳遞字符，而此標頭或查詢參數是您在授權方的 `token-key-name` 欄位中所指定的。
+ 確定您在 `x-amz-customauthorizer-name` 標頭或查詢字串參數中傳遞的授權方名稱是有效的，或者您已為您的帳戶定義預設授權方。