Troubleshooting - AWS IoT Greengrass
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Troubleshooting

使用此部分中的故障排除信息和解决方案来帮助解决 AWS AWS IoT Greengrass 版本 2 的问题。

查看 AWS IoT IoT Greengrass 核心软件日志

AWS AWS IoT Greengrass 核心软件日志文件提供有关核心设备的实时信息。这可以帮助您确定与组件和部署相关的问题。

此日志文件还包括插件组件的日志,例如日志管理器密钥管理器

查看核心设备日志文件

  • 运行以下命令以实时查看日志文件。Replace /greengrass/v2 替换为 AWS AWS IoT Greengrass 根文件夹的路径。

    sudo tail -f /greengrass/v2/logs/greengrass.log

查看组件日志

组件日志文件提供有关在 Greengrass 核心设备上运行的组件的实时信息。这可以帮助您确定组件的问题。

注意

AWS AWS IoT Greengrass 核心软件不会为插件组件(如日志管理器密钥管理器)创建组件日志文件。有关如何查看插件组件日志的更多信息,请参阅查看 AWS IoT IoT Greengrass 核心软件日志

查看组件的日志文件

  • 运行以下命令以实时查看日志文件。Replace /greengrass/v2 替换为 AWS AWS IoT Greengrass 根文件夹的路径,并替换 com.example.HelloWorld 替换为组件的名称。

    sudo tail -f /greengrass/v2/logs/com.example.HelloWorld.log

AWS AWS IoT Greengrass 核心软件问题

使用以下信息解决 AWS AWS IoT Greengrass 核心软件问题。

无法设置核心设备

如果 AWS AWS IoT Greengrass 核心软件安装程序失败,并且您无法设置核心设备,则可能需要卸载软件并重试。有关更多信息,请参阅卸载 AWS AWS IoT Greengrass 核心软件

无法连接到 AWS IoT IoT Core

例如,当 AWS AWS IoT Greengrass Core 软件无法连接到 AWS AWS IoT Core 以检索部署作业时,您可能会看到此错误。执行以下操作:

  • 检查您的核心设备是否可以连接到 Internet 和 AWS IoT IoT Core。有关设备连接到的 AWS IoT IoT Core 终端节点的更多信息,请参阅配置 AWS AWS IoT Greengrass 核心软件

  • 检查核心设备的 AWS AWS IoT 事物是否使用允许 iot:Connectiot:Publishiot:Receiveiot:Subscribe 权限的证书。

  • 如果您的核心设备使用网络代理,请检查您的核心设备是否具有设备角色,并且其角色是否允许 iot:Connectiot:Publish、 和 iot:Receive iot:Subscribe 权限。

内存不足错误

如果您的设备没有足够的内存在 Java 堆中分配对象,通常会发生此错误。在内存有限的设备上,您可能需要指定最大堆大小来控制内存分配。有关更多信息,请参阅使用 JVM 选项控制内存分配

无法安装 Greengrass CLI

在 AWS AWS IoT Greengrass 核心的安装命令中使用 --deploy-dev-tools 参数时,您可能会看到以下控制台消息。

Thing group exists, it could have existing deployment and devices, hence NOT creating deployment for Greengrass first party dev tools, please manually create a deployment if you wish to

当由于您的核心设备是具有现有部署的事物组的成员而未安装 Greengrass CLI 组件时,会发生这种情况。如果您看到此消息,则可以手动将 Greengrass CLI 组件 (aws.greengrass.Cli) 部署到设备以安装 Greengrass CLI。有关更多信息,请参阅安装 Greengrass CLI

不允许用户根目录执行

当运行 AWS AWS IoT Greengrass 核心软件的用户(通常为 root)无权sudo与任何 用户和任何组一起运行时,您可能会看到此错误。对于默认ggc_user系统用户,此错误如下所示:

Sorry, user root is not allowed to execute <command> as ggc_user:ggc_group.

检查您的 /etc/sudoers 文件是否授予用户以其他组sudo身份运行的权限。中用户的权限/etc/sudoers应类似于以下示例。

root ALL=(ALL:ALL) ALL

无法从共享对象映射分段:不允许 操作

当 AWS AWS IoT Greengrass 核心软件由于/tmp挂载了 noexec 权限而无法启动时,通常会发生此错误。

运行以下命令以使用 /tmp 权限重新挂载exec目录,然后重试。

sudo mount -o remount,exec /tmp

AWS AWS IoT Greengrass 云问题

使用以下信息排查 AWS AWS IoT Greengrass 控制台和 API 的问题。每个条目对应于您在执行操作时可能看到的错误消息。

调用 CreateComponentVersion 操作时出现错误 (AccessDeniedException: 123456789012:user/<username> 无权执行:null

当您从 AWS AWS IoT Greengrass 控制台或使用 CreateComponentVersion 操作创建组件版本时,可能会看到此错误。

此错误表示您的配方 JSON 或 YAML 无效。检查配方的语法,修复任何语法问题,然后重试。您可以使用在线 JSON 或 YAML 语法检查程序来识别配方中的语法问题。

核心设备部署问题

使用以下信息排查 Greengrass 核心设备上的部署问题。每个条目对应于您可能会在核心设备上看到的日志消息。

错误PackageDownloadException: Failed to download artifact

当核心设备应用部署时,当 AWS AWS IoT Greengrass 核心软件无法下载组件构件时,您可能会看到此错误。由于此错误,部署失败。

当您收到此错误时,日志还包括一个堆栈跟踪,您可以使用它来标识特定问题。以下每个条目对应于您可能会在Failed to download artifact错误消息的堆栈跟踪中看到的消息。

s3model.S3Exception (服务S3状态代码:403,请求 ID:null,...)

PackageDownloadException 错误可能在以下情况下包含此堆栈跟踪:

  • 组件构件在您在组件的配方中指定的 Amazon S3 URL 中不可用。检查是否将构件上传到S3 存储桶,以及构件 URL 是否与存储桶中的构件的 Amazon S3 URL 匹配。

  • 核心设备角色不允许 AWS AWS IoT Greengrass 核心软件从您在组件的配方中指定的 Amazon S3 URL 下载组件构件。检查设备角色是否允许 s3:GetObject Amazon S3 URL 具有构件。

错误:com.aws.greengrass.componentmanager.exceptions.ArtifactChecksumMismatchException:已下载项目的完整性检查失败。可能是由于文件损坏。

当核心设备应用部署时,当 AWS AWS IoT Greengrass 核心软件无法下载组件构件时,您可能会看到此错误。部署失败,因为下载的构件文件的校验和与您创建组件时 AWS AWS IoT Greengrass 计算的校验和不匹配。

执行以下操作:

  • 检查构件文件是否在托管它的 S3 存储桶中发生更改。如果自您创建组件后 文件发生了更改,请将其还原到核心设备所需的早期版本。如果您无法将文件还原到以前的版本,或者如果您要使用文件的新版本,请使用构件文件创建组件的新版本。

  • 检查核心设备的 Internet 连接。如果构件文件在下载时损坏,则会出现此错误。创建新部署并重试。

错误NoAvailableComponentVersionException无法协商包含云的组件 name<> 版本,并且没有满足要求的本地适用版本 requirements<>

当核心设备找不到满足核心设备的部署要求的组件版本时,您可能会看到此错误。核心设备检查 AWS AWS IoT Greengrass 服务和本地设备上的 组件。错误消息包括每个部署的目标以及该部署的组件版本要求。部署目标可以是事物、事物组或 LOCAL_DEPLOYMENT,表示核心设备上的本地部署。

此问题可能在以下情况下发生:

  • 核心设备是具有冲突的组件版本要求的多个部署的目标。例如,核心设备可能是包含 com.example.HelloWorld 组件的多个部署的目标,其中一个部署需要 版本 1.0.0,另一个部署需要 版本 1.0.1。组件不能同时满足这两个要求,因此部署失败。

  • 组件版本在 AWS IoT IoT Greengrass 服务或本地设备上不存在。例如, 组件可能已删除。

  • 存在符合版本要求的组件版本,但它们均与核心设备的平台不兼容。

要解决此问题,请修改部署以包含兼容的组件版本,或删除不兼容的组件版本。有关如何修改云部署的更多信息,请参阅修订部署。有关如何修改本地部署的更多信息,请参阅 AWS AWS IoT Greengrass CLI 部署创建命令。

SecretsManagerException: User: user<> is not authorized to perform: GetSecretValue on resource: arn<>

当您使用 Secret Manager 组件部署 AWS AWS Secrets Manager 密钥时,可能会发生此错误。如果核心设备的令牌交换 IAM 角色未授予获取密钥的权限,则部署将失败,并且 Greengrass 日志将包含此错误。

授权核心设备下载密钥

  1. secretsmanager:GetSecretValue 权限添加到核心设备的令牌交换角色。以下示例策略语句授予获取密钥值的权限。

    { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue" ], "Resource": [ "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyGreengrassSecret-abcdef" ] }

    有关更多信息,请参阅授权核心设备与 AWS 服务交互

  2. 将部署重新应用于核心设备。请执行下列操作之一:

    • 修改部署而不进行任何更改。核心设备在收到修订后的部署时尝试再次下载密钥。有关更多信息,请参阅修订部署

    • 重新启动 AWS AWS IoT Greengrass 核心软件以重试部署。有关更多信息,请参阅 运行 AWS AWS IoT Greengrass 核心软件

    如果密钥管理器成功下载密钥,则部署成功。

核心设备组件问题

使用以下信息排查核心设备上的 Greengrass 组件问题。

Python 脚本不记录消息

Greengrass 核心设备收集可用于识别组件问题的日志。如果您的 Python 脚本的 stdoutstderr 消息未显示在组件日志中,您可能需要刷新缓冲区或禁用 Python 中这些标准输出流的缓冲。执行以下任一操作:

  • 使用 -u 参数运行 Python 以在 stdout 和 上禁用缓冲stderr

    python3 -u hello_world.py
  • 在组件的配方中使用 SetenvPYTHONUNBUFFERED 环境变量设置为非空字符串。此环境变量禁用 stdout 和 上的缓冲stderr

  • 刷新 stdoutstderr 流的缓冲区。请执行下列操作之一:

    • 打印时刷新消息。

      import sys print('Hello, error!', file=sys.stderr, flush=True)
    • 打印后刷新消息。您可以在刷新流之前发送多条消息。

      import sys print('Hello, error!', file=sys.stderr) sys.stderr.flush()

有关如何验证 Python 脚本是否输出日志消息的更多信息,请参阅查看组件日志