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

AWS IoT Greengrass 问题排查

使用以下信息可帮助您排查 AWS IoT Greengrass 中的问题。

有关 AWS IoT Greengrass 限制的信息,请参阅 Amazon Web Services 一般参考 中的 AWS IoT Greengrass 限制

排查问题

AWS IoT Greengrass 核心问题

症状 解决方案

设备的影子未与云同步。

确保 AWS IoT Greengrass Core 在 Greengrass 服务角色中具有执行 iot:UpdateThingShadowiot:GetThingShadow 操作的权限。如果服务角色使用 AWSGreengrassResourceAccessRolePolicy 托管策略,则在默认情况下包含这些权限。

请参阅影子同步超时问题排查

由于未启用用户命名空间,AWS IoT Greengrass 核心软件未在 Raspberry Pi 上运行。

注意

要在默认 Greengrass container 模式下运行 AWS IoT Greengrass,需要用户命名空间支持。在 No container 模式下运行则无此项要求。有关更多信息,请参阅选择 Lambda 函数容器化时的注意事项

运行 BRANCH=stable rpi-update 以更新到固件和内核的最新稳定版本。对于 Raspbian 分发,此说明适用于 Jessie,但不适用于 Stretch。默认情况下,在 Stretch 中启用用户命名空间。

AWS IoT Greengrass 核心软件未成功启动。

  • 检查您是否使用了适用于您的架构的二进制文件。

  • 查看 runtime.log 以了解错误消息。有关更多信息,请参阅使用日志记录进行问题排查

  • 如果您最近从无容器化运行更改为在 Greengrass 容器中运行,请检查是否缺少任何容器依赖项。

  • 检查您的 AWS IoT Greengrass Core设备是否有可用的本地存储。

AWS IoT Greengrass 核心软件未成功启动。您运行的是 1.6 版本或更早版本,您将在 crash.log 中收到以下错误:The configuration file is missing the CaPath, CertPath or KeyPath. The Greengrass daemon process with [pid = pid] died

执行以下一项操作:

AWS IoT Greengrass 核心软件无法启动,并且您收到以下错误:Failed to parse /greengrass-root/config/config.json

确保 Greengrass 配置文件使用了有效的 JSON 格式。

打开 config.json(位于 /greengrass-root/config 中),并验证 JSON 格式。例如,请确保逗号使用正确。

AWS IoT Greengrass 核心软件无法启动,并且您收到以下错误:[ERROR]-Runtime failed to start: unable to start workers: container test timed out

设置 Greengrass 配置文件中的 postStartHealthCheckTimeout 属性。此可选属性将配置 Greengrass 守护程序等待启动后运行状况检查完成的时间量(以毫秒为单位)。默认值为 30 秒(30000 毫秒)。

打开 config.json(位于 /greengrass-root/config 中)。在 runtime 对象中,添加 postStartHealthCheckTimeout 属性并将值设置为一个大于 30000 的数。在需要的位置添加逗号以创建有效的 JSON 文档。例如:

... "runtime" : { "cgroup" : { "useSystemd" : "yes" }, "postStartHealthCheckTimeout" : 40000 }, ...

AWS IoT Greengrass 核心软件无法在 Raspberry Pi 上启动,并出现以下错误:Failed to invoke PutLogEvents on local Cloudwatch, logGroup: /GreengrassSystem/connection_manager, error: RequestError: send request failed caused by: Post http://path/cloudwatch/logs/: dial tcp address: getsockopt: connection refused, response: { }

如果操作系统版本为 Raspbian Stretch 并且尚未完成必要的内存设置,则会发生这种情况。如果您使用的是 Stretch,则需要执行更多内存设置。有关更多信息,请参阅此步骤

AWS IoT Greengrass 核心软件无法启动,并且您收到以下错误:Unable to create server due to: failed to load group: chmod /greengrass-root/ggc/deployment/lambda/arn:aws-cn:lambda:region:account-id:function:function-name:version/file-name: no such file or directory

如果将 Lambda 可执行文件部署到核心中,请在 group.json 文件中检查函数的 Handler 属性(位于 /greengrass-root/ggc/deployment/group 中)。如果处理程序不是编译的可执行文件的确切名称,请将 group.json 文件内容替换为空 JSON 对象 ({}),并运行以下命令以启动 AWS IoT Greengrass:

cd /greengrass/ggc/core/ sudo ./greengrassd start

然后,使用 AWS Lambda API 更新函数配置的 handler 参数,发布新的函数版本并更新别名。有关详细信息,请参阅 AWS Lambda 函数版本控制和别名

假设按别名将函数添加到 Greengrass 组(建议),您现在可以重新部署组。(否则,您必须在组定义和订阅中指向新的函数版本或别名,然后再部署组。)

AWS IoT Greengrass 核心软件无法启动,并且您收到以下错误:Spool size should be at least 262144 bytes

打开 group.json 文件(位于 /greengrass-root/ggc/deployment/group 中),将文件内容替换为空 JSON 对象 ({}),然后运行以下命令以启动 AWS IoT Greengrass:

cd /greengrass/ggc/core/ sudo ./greengrassd start

然后,遵循过程 在本地存储中缓存消息 中的步骤。对于 GGCloudSpooler 函数,请确保指定一个大于或等于 262144 的 GG_CONFIG_MAX_SIZE_BYTES 值。

AWS IoT Greengrass 核心软件无法启动,并且您在 runtime.log 中收到以下错误:container_linux.go:344: starting container process caused "process_linux.go:424: container init caused \"rootfs_linux.go:64: mounting \\\"/greengrass/ggc/socket/greengrass_ipc.sock\\\" to rootfs \\\"/greengrass/ggc/packages/version/rootfs/merged\\\" at \\\"/greengrass_ipc.sock\\\" caused \\\"stat /greengrass/ggc/socket/greengrass_ipc.sock: permission denied\\\"\""

如果您的 umask 高于 0022,则会出现此情况。要解决此问题,您必须将 umask 设置为 0022 或更低。默认情况下,值 0022 向每个人授予对新文件的读取权限。

AWS IoT Greengrass 核心软件无法启动,并且您收到以下错误:Greengrass daemon running with PID: [processid]. Some system components failed to start. Check 'runtime.log' for errors

查看 runtime.log 和 crash.log 中是否有错误消息。有关更多信息,请参阅使用日志记录进行问题排查

greengrassd 脚本显示:unable to accept TCP connection. accept tcp [::]:8000: accept4: too many open files

AWS IoT Greengrass 核心软件的文件描述符限制已达到阈值,必须调高。

使用以下命令,然后重新启动 AWS IoT Greengrass 核心软件。

ulimit -n 2048

注意

在本示例中,该限制被调高到 2048。请选择符合您的使用案例的值。

您会收到以下错误:Runtime execution error: unable to start lambda container. container_linux.go:259: starting container process caused "process_linux.go:345: container init caused \"rootfs_linux.go:50: preparing rootfs caused \\\"permission denied\\\"\""

将 AWS IoT Greengrass 直接安装在根目录下,或确保 /greengrass 目录及其父目录对所有人具有 execute 权限。

您在 runtime.log 中收到以下警告:[WARN]-[5]GK Remote: Error retrieving public key data: ErrPrincipalNotConfigured: private key for MqttCertificate is not set

AWS IoT Greengrass 使用常见的处理程序来验证所有安全主体的属性。除非您为本地 MQTT 服务器指定了自定义私有密钥,否则将会收到此警告。有关更多信息,请参阅 AWS IoT Greengrass 核心安全委托人

无线 (OTA) 更新失败,并显示以下错误:Permission denied when attempting to use role arn:aws-cn:iam::account-id:role/role-name to access s3 url https://区域-greengrass-updates.s3.区域.amazonaws.com/core/architecture/greengrass-core-distribution-version.tar.gz

在签署人角色策略中,将目标 AWS 区域添加为 Resource。签署人角色用于为 AWS IoT Greengrass 软件更新的 S3 URL 进行预签名。有关更多信息,请参阅 S3 URL 签署人角色

AWS IoT Greengrass Core 配置为使用网络代理,您的 Lambda 函数无法进行传出连接。根据您的运行时和 Lambda 函数用于创建连接的可执行文件,您可能会收到连接超时错误。

确保您的 Lambda 函数使用适当的代理配置通过网络代理进行连接。AWS IoT Greengrass 通过 http_proxyhttps_proxyno_proxy 环境变量将代理配置传递给用户定义的 Lambda 函数。可以按照以下 Python 代码段所示访问它们。

import os print(os.environ['HTTP_PROXY'])

注意

用于建立连接的大多数公用库(例如 boto3 或 cURL 和 python requests 程序包)默认使用这些环境变量。

核心处于无限的连接-断开循环中。runtime.log 文件包含一系列连续的连接和断开条目。

当另一个设备硬编码为使用核心事物名称作为与 AWS IoT 的 MQTT 连接的客户端 ID 时,可能发生这种情况。同一 AWS 区域和 AWS 账户中的同时连接必须使用唯一的客户端 ID。默认情况下,核心使用核心事物名称作为这些连接的客户端 ID。

为解决此问题,您可以更改另一个设备用于连接的客户端 ID(推荐),或覆盖核心的默认值。

覆盖核心设备的默认客户端 ID

  1. 运行以下命令以停止 AWS IoT Greengrass 守护程序:

    cd /greengrass-root/ggc/core/ sudo ./greengrassd stop
  2. 打开 greengrass-root/config/config.json 以作为 su 用户进行编辑。

  3. coreThing 对象中,添加 coreClientId 属性,并将值设置为您的自定义客户端 ID。该值必须介于 1 和 128 个字符之间,并且在 AWS 账户的当前 AWS 区域中必须是唯一的。

    "coreClientId": "MyCustomClientId"
  4. 启动守护程序。

    cd /greengrass-root/ggc/core/ sudo ./greengrassd start

部署问题

症状 解决方案

您在日志中看到有关部署的“403 禁止访问”错误。

确保 AWS IoT Greengrass Core 在云中的策略包含 "greengrass:*" 作为允许的操作。

首次运行 ConcurrentDeployment 时发生 create-deployment 错误。

部署可能正在进行。您可以运行 get-deployment-history 以查看部署是否已创建。如果没有,请再次尝试创建部署。

部署失败,并显示如下错误消息:Greengrass is not authorized to assume the Service Role associated with this accountFailed: TES service role is not associated with this account

通过使用 AWS CLI 中的 get-service-role-for-account 命令,检查相应的服务角色是否与您在当前 AWS 区域中的 AWS 账户相关联。要将 Greengrass 服务角色与您在当前 AWS 区域中的 AWS 账户关联,请使用 associate-service-role-to-account。有关更多信息,请参阅Greengrass 服务角色

部署未完成。

确保 AWS IoT Greengrass 守护程序正在您的核心设备上运行。在您的核心设备终端中运行以下命令来检查守护程序是否正在运行并启动它 (如果需要)。

  1. 要检查守护程序是否正在运行,请执行以下操作:

    ps aux | grep -E 'greengrass.*daemon'

    如果输出包含 root/greengrass/ggc/packages/1.9.0/bin/daemon 条目,则表示守护程序正在运行。

    路径中的版本取决于您的核心设备上安装的 AWS IoT Greengrass 核心软件版本。

  2. 要启动守护程序,请执行以下操作:

    cd /greengrass/ggc/core/ sudo ./greengrassd start

部署未完成,并且 runtime.log 包含多个 wait 1s for container to stop 条目。

在您的核心设备终端中运行以下命令,以重新启动 AWS IoT Greengrass 守护程序。

cd /greengrass/ggc/core/ sudo ./greengrassd stop sudo ./greengrassd start

您会收到以下错误:Deployment guid of type NewDeployment for group guid failed error: Error while processing. group config is invalid: 112 or [119 0] don't have rw permission on the file: path

确保 path 目录的所有者组具有该目录的读取和写入权限。

部署失败,runtime.log 中显示如下错误:[list of function arns] are configured to run as root but Greengrass is not configured to run Lambda functions with root permissions。将 greengrass_root/config/config.jsonallowFunctionsToRunAsRoot 的值更改为 yes,或者将 Lambda 函数更改为以另一个用户/组的身份运行。

确保已将 AWS IoT Greengrass 配置为允许 Lambda 函数以根权限运行。有关更多信息,请参阅以根用户身份运行 Lambda 函数

部署失败,显示以下错误消息,并且您运行的是 AWS IoT Greengrass 核心软件 1.7 版:Deployment deployment id of type NewDeployment for group group id failed error: process start failed: container_linux.go:259: starting container process caused "process_linux.go:250: running exec setns process for init caused \"wait: no child processes\""

重试部署。

创建组/创建函数问题

症状 解决方案

您收到错误:Your 'IsolationMode' configuration for the group is invalid

function-definition-version"DefaultConfig" 中的 "IsolationMode" 值不受支持时,出现此错误。支持的值为 "GreengrassContainer""NoContainer"

您收到错误:Your 'IsolationMode' configuration for function with arn function ARN is invalid

function-definition-versionfunction ARN 中的 "IsolationMode" 值不受支持时,出现此错误。支持的值为 "GreengrassContainer""NoContainer"

您收到错误:MemorySize configuration for function with arn function ARN is not allowed in IsolationMode=NoContainer

当您指定 MemorySize 值并选择在不进行容器化的情况下运行时,就会发生该错误。在不进行容器化的情况下运行的 Lambda 函数不能有内存限制。您可以删除限制,也可以更改 Lambda 函数以使其在 AWS IoT Greengrass 容器中运行。

您收到错误:Access Sysfs configuration for function with arn function ARN is not allowed in IsolationMode=NoContainer

当您为 AccessSysfs 指定 true 并且选择在不进行容器化的情况下运行时,就会发生该错误。在不进行容器化的情况下运行的 Lambda 函数必须更新其代码才能直接访问文件系统,并且不能使用 AccessSysfs。您可以为 AccessSysfs 指定 false 值,也可以将 Lambda 函数更改为在 AWS IoT Greengrass 容器中运行。

您收到错误:MemorySize configuration for function with arn function ARN is required in IsolationMode=GreengrassContainer

发生该错误的原因是您没有为在 AWS IoT Greengrass 容器中运行的 Lambda 函数指定 MemorySize 限制。指定 MemorySize 值可解决该错误。

您收到错误:Function function ARN refers to resource of type resourceType that is not allowed in IsolationMode=NoContainer

当您在不进行容器化的情况下运行 Lambda 函数时,您不能访问 Local.DeviceLocal.VolumeML_Model.SageMaker.JobML_Model.S3_ObjectS3_Object.Generic_Archive 资源类型。如果需要这些资源类型,则必须在 AWS IoT Greengrass 容器中运行。您也可以更改 Lambda 函数中的代码,从而在不进行容器化的情况下直接访问本地设备。

您收到错误:Execution configuration for function with arn function ARN is not allowed

当您创建一个具有 GGIPDetectorGGCloudSpooler 的系统 Lambda 函数并且您指定了 IsolationModeRunAs 配置时,出现此错误。您必须省略该系统 Lambda 函数的 Execution 参数。

Docker 中的 AWS IoT Greengrass 核心问题

症状 解决方案

在运行 aws ecr get-login 命令时,您将收到错误 Unknown options: -no-include-email

确保您已安装最新的 AWS CLI 版本(例如,运行:pip install awscli --upgrade --user)。如果您使用的是 Windows,并且您已使用 MSI 安装程序安装 CLI,则必须重复安装过程。有关更多信息,请参阅 AWS Command Line Interface 用户指南 中的在 Microsoft Windows 上安装 AWS Command Line Interface

您将在 Linux 计算机上收到错误,例如 WARNING: IPv4 is disabled. Networking will not work

按照此步骤中所述进行操作来启用 IPv4 网络转发。AWS IoT Greengrass 云部署和 MQTT 通信在未启用 IPv4 转发时将不运行。有关更多信息,请参阅 Docker 文档中的在运行时配置具有命名空间的内核参数 (sysctls)

在 Windows 计算机上运行 Docker 时,您将收到消息 Firewall Detected while Sharing Drives

请参阅错误:防火墙阻止 Windows 和容器之间的文件共享 Docker 支持问题。如果您登录虚拟私有网络 (VPN) 并且网络设置阻止挂载共享驱动器,也会出现此错误。在这种情况下,请关闭 VPN 并重新运行 Docker 容器。

您收到错误:Cannot create container for the service greengrass: Conflict. The container name "/aws-iot-greengrass" is already in use.

当较旧的容器使用容器名称时,可能会发生这种情况。要解决此问题,请运行以下命令以删除旧的 Docker 容器:

docker rm -f $(docker ps -a -q -f "name=aws-iot-greengrass")

您会在 runtime.log 中收到以下错误:[FATAL]-Failed to reset thread's mount namespace due to an unexpected error: "operation not permitted". To maintain consistency, GGC will crash and need to be manually restarted

如果您尝试将一个 GreengrassContainer Lambda 函数部署到 Docker 容器中运行的 AWS IoT Greengrass Core,会出现此错误。目前,只有 NoContainer Lambda 函数可以部署到 Greengrass Docker 容器。

要解决此问题,请确保所有 Lambda 函数处于 NoContainer 模式并启动新的部署。然后,当启动容器时,不要将现有 deployment 目录绑定挂载到 AWS IoT Greengrass Core Docker 容器。相反,在它的位置创建一个空 deployment 目录,并将该目录绑定挂载到 Docker 容器中。这样,新的 Docker 容器就可以接收具有在 NoContainer 模式下运行的 Lambda 函数的最新部署。

有关更多信息,请参阅 在 Docker 容器中运行 AWS IoT Greengrass

使用日志记录进行问题排查

如果日志配置为存储在本地文件系统中,请在以下位置开始查找。阅读文件系统上的日志需要根权限。

greengrass-root/ggc/var/log/crash.log

显示在 AWS IoT Greengrass Core崩溃时生成的消息。

greengrass-root/ggc/var/log/system/runtime.log

显示有关哪些组件失败的消息。

greengrass-root/ggc/var/log/system/

包含来自 AWS IoT Greengrass 系统组件的所有日志,例如,证书管理器和连接管理器。通过利用 ggc/var/log/system/ggc/var/log/system/runtime.log 中的消息,您应该能够找出 AWS IoT Greengrass 系统组件中出现了哪些错误。

greengrass-root/ggc/var/log/user/

包含来自用户定义的 Lambda 函数的所有日志。检查此文件夹以查找来自您的本地 Lambda 函数的错误消息。

注意

默认情况下,greengrass-root/greengrass 目录。如果配置了写入目录,则日志位于该目录中。

如果日志配置为存储在云中,请使用 CloudWatch Logs 来查看日志消息。仅可在 AWS IoT Greengrass Core设备上的文件系统日志中找到 crash.log

如果将 AWS IoT 配置为向 CloudWatch 写入日志,则在系统组件尝试连接到 AWS IoT 时发生连接错误的情况下,请查看这些日志。

有关 AWS IoT Greengrass 日志记录的更多信息,请参阅 利用 AWS IoT Greengrass 日志进行监控

注意

AWS IoT Greengrass 核心软件 1.0 版本的日志存储在 greengrass-root/var/log 目录下。

排查存储问题

当本地文件存储空间已满时,某些组件可能会开始失败:

  • 本地影子更新未进行。

  • 新的 AWS IoT Greengrass Core MQTT 服务器证书无法在本地下载。

  • 部署失败。

您应该始终留意本地的可用空间大小。您可以基于已部署的 Lambda 函数的大小、日志记录配置(请参阅使用日志记录进行问题排查)和在本地存储的影子的数量计算可用空间。

对消息进行问题排查

AWS IoT Greengrass 中的所有消息都是通过 QoS 0 发送的。默认情况下,AWS IoT Greengrass 在内存中队列中存储消息。因此,在 AWS IoT Greengrass Core重新启动时,未处理的消息将会丢失(例如,在组部署或设备重启后)。不过,您可以配置 AWS IoT Greengrass (v1.6 or later) 以将消息缓存到文件系统中,以便在核心重新启动时永久保存这些消息。您也可以配置队列大小。有关更多信息,请参阅MQTT 消息队列

注意

在使用默认内存中队列时,我们建议您部署组或在服务中断最少的情况下重新启动设备。

如果配置队列大小,请确保它大于或等于 262144 字节 (256 KB)。否则,AWS IoT Greengrass 可能无法正确启动。

影子同步超时问题排查

如果 Greengrass 核心设备和云之间的通信明显延迟,则影子同步可能因超时而失败。在这种情况下,您应会看到如下所示的日志条目:

[2017-07-20T10:01:58.006Z][ERROR]-cloud_shadow_client.go:57,Cloud shadow client error: unable to get cloud shadow what_the_thing_is_named for synchronization. Get https://1234567890abcd.iot.us-west-2.amazonaws.com:8443/things/what_the_thing_is_named/shadow: net/http: request canceled (Client.Timeout exceeded while awaiting headers) [2017-07-20T10:01:58.006Z][WARN]-sync_manager.go:263,Failed to get cloud copy: Get https://1234567890abcd.iot.us-west-2.amazonaws.com:8443/things/what_the_thing_is_named/shadow: net/http: request canceled (Client.Timeout exceeded while awaiting headers) [2017-07-20T10:01:58.006Z][ERROR]-sync_manager.go:375,Failed to execute sync operation {what_the_thing_is_named VersionDiscontinued []}"

一种可能的解决方法是配置核心设备等待主机响应的时长。打开 greengrass-root/config 中的 config.json 文件,在 system.shadowSyncTimeout 字段中添加一个超时值(以秒为单位)。例如:

{ "system": { "shadowSyncTimeout": 10 }, "coreThing": { "caPath": "root-ca.pem", "certPath": "cloud.pem.crt", "keyPath": "cloud.pem.key", ... }, ... }

如果未在 config.json 中指定 shadowSyncTimeout 值,则默认值为 5 秒。

注意

对于 AWS IoT Greengrass 核心软件 1.6 及更早版本,默认 shadowSyncTimeout 为 1 秒。

检查 AWS IoT Greengrass 论坛

如果您无法使用本主题中的问题排查信息解决问题,可以在 AWS IoT Greengrass 论坛中搜索相关问题或发布新的论坛话题。AWS IoT Greengrass 团队成员主动监控该论坛。