本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
授权方故障排除
本主题介绍可能导致自定义身份验证工作流中出现故障的常见问题以及解决这些问题的步骤。要最有效地解决问题,请启用 CloudWatch 的日志 Amazon IoT Core 并将日志级别设置为 调试。你可以启用 CloudWatch 登录 Amazon IoT Core 控制台(https://console.aws.amazon.com/iot/
如果您将日志级别保留为 调试 在很长一段时间内, CloudWatch 可能会存储大量的日志数据。这可以增加你的 CloudWatch 收费。考虑使用基于资源的日志记录来增加仅针对特定事物组中设备的详细程度。有关基于资源的日志记录的更多信息,请参阅 配置 Amazon IoT 日志记录。此外,当您完成故障排除时,将日志级别降到详细程度较低的级别。
在您开始故障排除之前,请查看 了解自定义身份验证工作流 获取自定义身份验证过程的高度概要视图。这有助于您了解应该在何处查找问题的根源。
本主题将讨论以下两个方面供您调查。
-
与授权方 Lambda 函数相关的问题。
-
与您的设备相关的问题。
检查授权方的 Lambda 函数中是否存在问题
执行以下步骤以确保设备的连接尝试正在调用 Lambda 函数。
-
验证哪个 Lambda 函数与您的授权方相关联。
你可以通过致电来做到这一点 DescribeAuthorizer API 或者在中单击所需的授权方 安全 的部分 Amazon IoT Core 控制台。
-
检查 Lambda 函数的调用指标。为此,请执行以下步骤。
-
打开 Amazon Lambda 控制台(https://console.aws.amazon.com/lambda/
),然后选择与您的授权者关联的函数。 -
选择监控选项卡并查看与您的问题相关的时间范围的指标。
-
-
如果您没有看到任何调用,请验证一下 Amazon IoT Core 有权调用您的 Lambda 函数。如果您看到调用,则跳到下一步。执行以下步骤以验证 Lambda 函数是否具有所需的权限。
-
选择 权限 在 “函数” 选项卡中 Amazon Lambda 控制台。
-
找到 Resource-based 政策 页面底部的部分。如果您的 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" } } } ] }
-
该政策授予
InvokeFunction对您的函数的权限 Amazon IoT Core 校长。如果您看不到,则必须使用以下方法进行添加 AddPermission API。以下示例说明如何使用 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 函数返回的策略未授予设备尝试执行的操作的权限。执行以下步骤以确定函数返回的策略是否存在任何问题。
-
使用亚马逊 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 over WebSockets,MQTT)在所有自定义身份验证请求中。在这两种情况下,传递的值都必须与您的一个账户相匹配 Amazon 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标头或查询字符串参数传递的授权方名称是有效的,或者您已为您的账户定义了默认授权方。