本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
授权方故障排除
本主题介绍可能导致自定义身份验证工作流中出现故障的常见问题以及解决这些问题的步骤。要最有效地解决问题,请启用 CloudWatch 日志,Amazon IoT Core然后将日志级别设置为 DEBUG。你可以在Amazon IoT Core控制台中启用 CloudWatch 日志 (https://console.aws.amazon.com/iot/
注意
如果将日志级别长时间保留在 DEBUG, CloudWatch 可能会存储大量的日志记录数据。这可能会增加您的 CloudWatch费用。考虑使用基于资源的日志记录来增加仅针对特定事物组中设备的详细程度。有关基于资源的日志记录的更多信息,请参阅 配置 Amazon IoT 日志记录。此外,当您完成故障排除时,将日志级别降到详细程度较低的级别。
在您开始故障排除之前,请查看 了解自定义身份验证工作流 获取自定义身份验证过程的高度概要视图。这有助于您了解应该在何处查找问题的根源。
本主题将讨论以下两个方面供您调查。
与授权方 Lambda 函数相关的问题。
与您的设备相关的问题。
检查授权方的 Lambda 函数中是否存在问题
执行以下步骤以确保设备的连接尝试正在调用 Lambda 函数。
验证哪个 Lambda 函数与您的授权方相关联。
您可以通过调用 DescribeAuthorizerAPI 或通过单击Amazon IoT Core控制台安全部分中所需的授权方进行查证。
检查 Lambda 函数的调用指标。为此,请执行以下步骤。
打开 Amazon Lambda 控制台 (https://console.aws.amazon.com/lambda/
),然后选择与您的授权方关联的函数。 选择监控选项卡并查看与您的问题相关的时间范围的指标。
如果您没有看到任何调用,请验证 Amazon IoT Core 有权调用 Lambda 函数。如果您看到调用,则跳到下一步。执行以下步骤以验证 Lambda 函数是否具有所需的权限。
在 Amazon Lambda 控制台中选择您函数的权限选项卡。
在页面底部找到基于资源的策略部分。如果您的 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" } } } ] }此策略向您的函数授予对 Amazon IoT Core 委托人的
InvokeFunction权限。如果您没有看到它,则必须使用 AddPermissionAPI 进行添加。以下示例说明如何使用 Amazon CLI 执行此操作。aws lambda add-permission --function-nameFunctionName--principal iot.amazonaws.com --source-arnAuthorizerARn--statement-id Id-123 --action "lambda:InvokeFunction"
如果您看到调用,请验证没有错误。出现错误则可能表明 Lambda 函数未正确处理 Amazon IoT Core 发送给它的连接事件。
有关在 Lambda 函数中处理事件的信息,请参阅 定义您的 Lambda 函数。您可以将该测试功能用于 Amazon Lambda 控制台 (https://console.aws.amazon.com/lambda/
) 对函数中的测试值进行硬编码,以确保函数正确处理事件。 如果您看到没有错误的调用,但您的设备无法连接(或发布、订阅和接收消息),则问题可能是 Lambda 函数返回的策略未授予设备尝试执行的操作的权限。执行以下步骤以确定函数返回的策略是否存在任何问题。
使用 Amazon CloudWatch Logs Insights 查询可在短时间内扫描日志以检查故障。以下示例查询按时间戳对事件进行排序并查找失败。
display clientId, eventType, status, @timestamp | sort @timestamp desc | filter status = "Failure"更新您的 Lambda 函数以记录它返回到 Amazon IoT Core 的数据和触发函数的事件。您可以使用这些日志检查函数创建的策略。
-
如果您看到调用并没有错误,但您的设备无法连接(或发布、订阅和接收消息),则另一个原因可能是 Lambda 函数超出了超时限制。自定义授权方的 Lambda 函数超时限制为 5 秒。您可以在 CloudWatch 日志或指标中检查函数持续时间。
调查设备问题
如果您发现调用 Lambda 函数或函数返回的策略不存在任何问题,请查找设备连接尝试是否存在问题。格式错误的连接请求可能会导致 Amazon IoT Core 不会触发您的授权方。TLS 层和应用程序层均可能出现连接问题。
TLS 层可能存在的问题:
客户必须在所有自定义身份验证请求中传递主机名标头(HTTP、MQTT 通过 WebSockets)或服务器名称指示 TLS 扩展(HTTP、MQTT 通过 WebSockets、MQTT 通过、MQTT)。在这两种情况下,传递的值必须与您账户的 Amazon IoT Core 数据终端节点相匹配。这些是执行以下 CLI 命令时返回的终端节点。
aws iot describe-endpoint --endpoint-type iot:Data-ATSaws 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标头或查询字符串参数传递的授权方名称是有效的,或者您已为您的账户定义了默认授权方。