排除 Amazon IoT Greengrass 的故障 - Amazon IoT Greengrass
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Amazon IoT Greengrass Version 1在 2023 年 6 月 30 日之前,将不再接收功能更新,并且将仅收到安全补丁和错误修复。有关更多信息,请参阅Amazon IoT Greengrass V1维护时段。我们强烈建议您迁移到Amazon IoT Greengrass Version 2,这增加了重要的新功能支持其他平台

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

排除 Amazon IoT Greengrass 的故障

本节提供故障排除信息和可能的解决方案,以帮助解决 Amazon IoT Greengrass 的问题。

有关以下内容的信息Amazon IoT Greengrass配额(限制),请参阅Service Quotas中的Amazon Web Services 一般参考.

Amazon IoT Greengrass Core 问题

如果Amazon IoT Greengrass核心软件无法启动,请尝试以下常规故障排除步骤:

搜索以下症状和错误,以查找信息来帮助排查的问题Amazon IoT Greengrass核心。

问题

 

Error: 配置文件缺失 CaPath、 CertPath 要么 KeyPath. 具有 [pid = <pid>] 的 Greengrass 守护程序进程终止。

解决方案:您可能会在看到此错误crash.log(当为时)Amazon IoT Greengrass核心软件未启动。如果您正在运行 v1.6 或更早版本,可能会发生此错误。请执行下列操作之一:

  • 升级到 v1.7 版或更高版本。我们建议您始终运行最新版本的 Amazon IoT Greengrass 核心软件。有关下载信息,请参阅 Amazon IoT Greengrass 核心软件

  • 为您的 Amazon IoT Greengrass 核心软件版本使用正确的 config.json 格式。有关更多信息,请参阅 Amazon IoT Greengrass 核心配置文件

    注意

    要查找核心设备上安装了哪一版本的 Amazon IoT Greengrass Core 软件,请在您的设备终端上运行以下命令。

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

 

Error: 无法解析/<greengrass-root>/config/config.json。

解决方案:当出现此错误时,您可能会在看到此错误。Amazon IoT Greengrass核心软件未启动。确保 Greengrass 配置文件使用了有效的 JSON 格式。

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

 

Error: 生成 TLS 配置时出错: ErrUnknownuriScheme

解决方案:当出现此错误时,您可能会在看到此错误。Amazon IoT Greengrass核心软件未启动。确保 Greengrass 配置文件的 crypto 部分中的属性是有效的。错误消息应提供更多信息。

打开 config.json(位于 /greengrass-root/config 中),并检查 crypto 部分。例如,证书和密钥路径必须使用正确的 URI 格式并指向正确的位置。

 

Error: 运行时未能启动:无法启动工作线程:容器测试超时。

解决方案:当出现此错误时,您可能会在看到此错误。Amazon IoT Greengrass核心软件未启动。设置postStartHealthCheckTimeout属性位于Greengrass 配置文件. 此可选属性将配置 Greengrass 守护程序等待启动后运行状况检查完成的时间量(以毫秒为单位)。默认值为 30 秒(30000 毫秒)。

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

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

 

Error: 调用失败 PutLogEvents在本地 Cloudwatch 上,logGroup:/GreengrassSystem/gmanger,错误,错误: RequestError: 发送请求失败,原因是:发布 http: <path>///cloudwatch/logs/<address>: 拨打 tcp: getsockopt: 连接被拒绝,回复:{}。

解决方案:当出现此错误时,您可能会在看到此错误。Amazon IoT Greengrass核心软件未启动。如果您在 Raspberry Pi 上运行 Amazon IoT Greengrass,并且尚未完成所需的内存设置,则可能会发生此错误。有关更多信息,请参阅此步骤

 

Error: 无法创建服务器,原因是:无法加载组:chmod/<greengrass-root>/arn /ambda/ar <region>n <account-id><function-name>/ambda <version><file-name>/arn

解决方案:当出现此错误时,您可能会在看到此错误。Amazon IoT Greengrass核心软件未启动。如果你部署了Lambda 执行文件到核心,检查函数的Handler属性位于group.json文件(位于/greengrass/ggc/部署/组)。如果处理程序不是编译的可执行文件的确切名称,请将 group.json 文件内容替换为空 JSON 对象 ({}),并运行以下命令以启动 Amazon IoT Greengrass:

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

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

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

 

在您从无容器化的情况下运行更改为在 Greengrass 容器中运行后,Amazon IoT Greengrass 核心软件无法启动。

解决方案:检查是否缺失任何容器依赖项。

 

Error: 后台打印大小应至少为 262144 字节。

解决方案:当出现此错误时,您可能会在看到此错误。Amazon IoT Greengrass核心软件未启动。打开 group.json 文件(位于 /greengrass-root/ggc/deployment/group 中),将文件内容替换为空 JSON 对象 ({}),然后运行以下命令以启动 Amazon IoT Greengrass:

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

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

 

Error: [错误]-云端消息传递错误:尝试发布消息时出错。 {“ErrorString”: “操作超时”}

解决方案:您可能会在看到此错误GGCloudSpooler.log当 Greengrass 核心无法向发送 MQTT 消息时Amazon IoT Core. 如果核心环境存在有限的带宽和高延迟,则可能会发生此情况。如果你在跑步Amazon IoT Greengrassv1.2 或更高版本中,请尝试增加mqttOperationTimeout中的值config.json文件。如果此属性不存在,请将其添加到 coreThing 对象中。例如:

{ "coreThing": { "mqttOperationTimeout": 10, "caPath": "root-ca.pem", "certPath": "hash.cert.pem", "keyPath": "hash.private.key", ... }, ... }

默认值为 5,最小值为 5

 

错误: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\\\"\"".

解决方案:您可能会在看到此错误runtime.log(当为时)Amazon IoT Greengrass核心软件未启动。如果您的 umask 高于 0022,则会出现此情况。要解决此问题,您必须将 umask 设置为 0022 或更低。默认情况下,值 0022 向每个人授予对新文件的读取权限。

 

Error: Greengrass 守护程序在 PID 为为的情况下运行<process-id>。某些系统组件无法启动。检查“runtime.log”中有无错误。

解决方案:当出现此错误时,您可能会在看到此错误。Amazon IoT Greengrass核心软件未启动。检查 runtime.logcrash.log 中有无特定的错误信息。有关更多信息,请参阅 使用日志排查问题

 

设备影子未与云同步。

解决方案:确保Amazon IoT Greengrass有权限iot:UpdateThingShadowiot:GetThingShadow中的操作Greengrass 服务角色. 如果服务角色使用 AWSGreengrassResourceAccessRolePolicy 托管策略,则在默认情况下包含这些权限。

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

 

错误:无法接受 TCP 连接。接受 tcp [::]:8000: accept4:打开的文件太多。

解决方案:您可能会在看到此错误greengrassd脚本输出。如果 Amazon IoT Greengrass 核心软件的文件描述符限制已达到阈值,必须调高,则可能会发生此错误。

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

ulimit -n 2048
注意

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

 

Error: 运行时执行错误:无法启动 lambda 容器。containainer 进程导致 “proctainer perfs”。

解决方案:或安装Amazon IoT Greengrass直接在根目录下,或确保目录在Amazon IoT Greengrass核心软件已安装,其父目录有execute每个人的权限。

 

警告:[警告]-[5] GK 遥控器:检索公钥数据时出错: ErrPrincipalNotConfigured:中的私有密钥 MqttCertificate 未设置。

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

 

Error: 在试图使用角色 arn <account-id><role-name>grass/ 访问 s3 url htttps httttps 时权限被拒绝<region>。 <region>.amazonaws.com/core/ <architecture>/greengrass-<distribution-version>core-.tar.gz。

解决方案:当出现此错误时,您可能会在看到此错误。 over-the-air (OTA) 更新失败。在签署人角色策略中,添加目标Amazon Web Services 区域作为Resource. 此签署人角色用于为 Amazon IoT Greengrass 软件更新的 S3 URL 进行预签名。有关更多信息,请参阅 S3 URL 签署人角色

 

这些区域有:Amazon IoT Greengrasscore 配置为使用网络代理并且您的 Lambda 函数无法进行传出连接。

解决方案:根据您的运行时和 Lambda 函数用于创建连接的可执行文件,您也可能会收到连接超时错误。确保您的 Lambda 函数使用适当的代理配置通过网络代理进行连接。Amazon IoT Greengrass通过将代理配置传递给用户定义的 Lambda 函数http_proxyhttps_proxy, 和no_proxy环境变量。可以按照以下 Python 代码段所示访问它们。

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

使用与环境中定义的变量相同的大小写,例如全部小写 http_proxy 或全部大写 HTTP_PROXY。对于这些变量,Amazon IoT Greengrass 同时支持这两种写法。

注意

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

 

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

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

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

覆盖核心设备的默认客户端 ID
  1. 运行以下命令以停止 Greengrass 守护程序:

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

  3. coreThing 对象中,添加 coreClientId 属性,并将值设置为您的自定义客户端 ID。值的长度必须介于 1 到 128 个字符之间。它在当前版本中必须是唯一的Amazon Web Services 区域(对于 )Amazon Web Services 账户.

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

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

 

错误:无法启动 lambda 容器。container_linux.go:259:启动容器进程导致出现 "process_linux.go:345:容器初始化导致出现 \"rootfs_linux.go:62:正在将 \\\"proc\\\" 装载到 \\\"

解决方案:在某些平台上,您可能会在中看到此错误runtime.log什么时候Amazon IoT Greengrass尝试挂载/proc文件系统来创建 Lambda 容器。或者,您可能会看到类似的错误,例如 operation not permittedEPERM。即使通过了由依赖关系检查器脚本在平台上运行的测试,仍可能出现这些错误。

请尝试下列可能的解决方案之一:

  • 在 Linux 内核中启用 CONFIG_DEVPTS_MULTIPLE_INSTANCES 选项。

  • 仅在主机上将 /proc 装载选项设置为 rw,relatim

  • 将 Linux 内核升级到 4.9 或更高版本。

注意

此问题与装载 /proc 供本地资源访问无关。

 

[错误]-运行时执行错误:无法启动 lambda 容器。 {“ErrorString”:无法初始化容器挂载:无法在覆盖上层目录中屏蔽 grassgrass 根:无法在目录下创建掩码设备<ggc-path>:文件存在”}

解决方案:当部署失败时,您可能会在 runtime.log 中看到此错误。如果 Lambda 函数位于Amazon IoT Greengrass组无法访问。/usr内核文件系统中的目录。

要解决此问题,请将本地卷资源添加到组,然后部署该组。此资源必须:

  • 指定 /usr 作为 Source path (源路径)Destination path (目标路径)

  • 自动添加拥有资源的 Linux 组的操作系统组权限。

  • 与 Lambda 函数关联并允许只读访问。

 

[错误]-部署失败。 {"deploymentId”: "<deployment-id>“, “ErrorString”: “pid 的容器测试进程<pid>失败:容器进程状态:退出状态 1"}

解决方案:当部署失败时,您可能会在 runtime.log 中看到此错误。如果 Lambda 函数位于Amazon IoT Greengrass组无法访问。/usr内核文件系统中的目录。

你可以通过检查来确认是这种情况GGCanary.log以了解其他错误。如果 Lambda 函数无法访问/usrdirecorGGCanary.log将包含以下错误:

[ERROR]-standard_init_linux.go:207: exec user process caused "no such file or directory"

要解决此问题,请将本地卷资源添加到组,然后部署该组。此资源必须:

  • 指定 /usr 作为 Source path (源路径)Destination path (目标路径)

  • 自动添加拥有资源的 Linux 组的操作系统组权限。

  • 与 Lambda 函数关联并允许只读访问。

 

解决方案:您可能会在看到此错误runtime.log文件时Amazon IoT Greengrass核心软件无法启动。此问题在 Debian 操作系统中可能更常见。

要解决此问题,请执行以下操作:

  1. 升级Amazon IoT Greengrass核心软件升级到 v1.9.3 版或更高版本。这将自动解决此问题。

  2. 如果您在升级后仍然收到此错误Amazon IoT Greengrass核心软件,设置system.useOverlayWithTmpfs属性到true中的config.json文件。

    例 示例
    { "system": { "useOverlayWithTmpfs": true }, "coreThing": { "caPath": "root-ca.pem", "certPath": "cloud.pem.crt", "keyPath": "cloud.pem.key", ... }, ... }
注意

错误消息中会显示您的 Amazon IoT Greengrass Core 软件版本。要查找 Linux 的内核版本,请运行 uname -r

 

Error: [DBUG] — 未能获取路由。丢弃消息。

解决方案:检查您的组中的订阅并确保订阅列出在[DEBUG]消息存在。

 

Error: [Errno 24] 打开的文件太多<lambda-function>,[Errno 24] 打开的文件太多

解决方案:如果函数实例化,您可能会在 Lambda 函数日志文件中看到此错误StreamManagerClient在函数处理程序中。我们建议您在处理程序之外创建客户端。有关更多信息,请参阅 使用 StreamManagerClient 处理流

 

错误:ds 服务器无法开始监听套接字:听 unix <ggc-path>/ggc/socket/greengrass_ipc.sock:bind:参数无效

解决方案:当出现此错误时,您可能会在看到此错误。Amazon IoT Greengrass核心软件无法启动。此错误在当时Amazon IoT Greengrass核心软件安装到文件路径较长的文件夹中。重新安装Amazon IoT Greengrass核心软件到文件路径少于 79 字节的文件夹,如果你不使用写入目录,或者 83 字节(如果您确实使用写入目录)。

[INFO](复印机)aws.greengrass。StreamManager:stdout。造成者:com.fasterxml.jackson.databind。JsonMappingException:瞬间超过最小或最大瞬间

当你升级Amazon IoT Greengrass核心软件升级到 v1.11.3,如果流管理器无法启动,您可能会在流管理器日志中看到以下错误。

2021-07-16T00:54:58.568Z [INFO] (Copier) aws.greengrass.StreamManager: stdout. Caused by: com.fasterxml.jackson.databind.JsonMappingException: Instant exceeds minimum or maximum instant (through reference chain: com.amazonaws.iot.greengrass.streammanager.export.PersistedSuccessExportStatesV1["lastExportTime"]). {scriptName=services.aws.greengrass.StreamManager.lifecycle.startup.script, serviceName=aws.greengrass.StreamManager, currentState=STARTING} 2021-07-16T00:54:58.579Z [INFO] (Copier) aws.greengrass.StreamManager: stdout. Caused by: java.time.DateTimeException: Instant exceeds minimum or maximum instant. {scriptName=services.aws.greengrass.StreamManager.lifecycle.startup.script, serviceName=aws.greengrass.StreamManager, currentState=STARTING}

如果您使用的是某个版本的Amazon IoT Greengrass早于 v1.11.3 的核心软件,如果要升级到更高版本,请使用 OTA 更新升级到 v1.11.4。

GPG error: https://dnw9lb6lzp2d8.cloudfront.net stable InRelease: The following signatures were invalid: EXPKEYSIG 68D644ABD2327D47 AWS Greengrass Master Key

当你跑步时apt update在你所在的设备上安装了Amazon IoT GreengrassAPT 存储库中的核心软件,您可能会看到以下错误。

Err:4 https://dnw9lb6lzp2d8.cloudfront.net stable InRelease The following signatures were invalid: EXPKEYSIG 68D644ABD2327D47 AWS Greengrass Master Key Reading package lists... Done W: GPG error: https://dnw9lb6lzp2d8.cloudfront.net stable InRelease: The following signatures were invalid: EXPKEYSIG 68D644ABD2327D47 AWS Greengrass Master Key

此错误的发生是因为Amazon IoT Greengrass不再提供安装或更新Amazon IoT GreengrassAPT 存储库中的核心软件。成功运行apt update,删除Amazon IoT Greengrass设备来源列表中的存储库。

sudo rm /etc/apt/sources.list.d/greengrass.list sudo apt update

部署问题

使用以下信息可帮助您排查部署问题。

问题

 

您当前的部署不起作用,并且您希望恢复到以前有效的部署。

解决方案:使用Amazon IoT控制台或Amazon IoT Greengrass用于重新部署先前有效的部署的 API。这会将相应的组版本部署到您的核心设备。

重新部署一个部署(控制台)
  1. 在组配置页面上,选择部署选项卡。该页面显示组的部署历史记录,包括日期和时间、组版本以及每次部署尝试的状态。

  2. 查找包含您要重新部署的部署的行。选择要重新部署的部署并选择重新部署.

    
                            部署页面,显示部署的“重新部署”操作。
重新部署一个部署 (CLI)
  1. 使用ListDeployments以查找您要重新部署的部署的 ID。例如:

    aws greengrass list-deployments --group-id 74d0b623-c2f2-4cad-9acc-ef92f61fcaf7

    该命令将返回组的部署列表。

    { "Deployments": [ { "DeploymentId": "8d179428-f617-4a77-8a0c-3d61fb8446a6", "DeploymentType": "NewDeployment", "GroupArn": "arn:aws:greengrass:us-west-2:123456789012:/greengrass/groups/74d0b623-c2f2-4cad-9acc-ef92f61fcaf7/versions/8dd1d899-4ac9-4f5d-afe4-22de086efc62", "CreatedAt": "2019-07-01T20:56:49.641Z" }, { "DeploymentId": "f8e4c455-8ac4-453a-8252-512dc3e9c596", "DeploymentType": "NewDeployment", "GroupArn": "arn:aws:greengrass:us-west-2::123456789012:/greengrass/groups/74d0b623-c2f2-4cad-9acc-ef92f61fcaf7/versions/4ad66e5d-3808-446b-940a-b1a788898382", "CreatedAt": "2019-07-01T20:41:47.048Z" }, { "DeploymentId": "e4aca044-bbd8-41b4-b697-930ca7c40f3e", "DeploymentType": "NewDeployment", "GroupArn": "arn:aws:greengrass:us-west-2::123456789012:/greengrass/groups/74d0b623-c2f2-4cad-9acc-ef92f61fcaf7/versions/1f3870b6-850e-4c97-8018-c872e17b235b", "CreatedAt": "2019-06-18T15:16:02.965Z" } ] }
    注意

    这些 Amazon CLI 命令将示例值用于组和部署 ID。当您运行这些命令时,确保替换示例值。

  2. 使用CreateDeployment重新部署目标部署。将部署类型设置为 Redeployment。例如:

    aws greengrass create-deployment --deployment-type Redeployment \ --group-id 74d0b623-c2f2-4cad-9acc-ef92f61fcaf7 \ --deployment-id f8e4c455-8ac4-453a-8252-512dc3e9c596

    该命令会返回新部署的 ARN 和 ID。

    { "DeploymentId": "f9ed02b7-c28e-4df6-83b1-e9553ddd0fc2", "DeploymentArn": "arn:aws:greengrass:us-west-2::123456789012:/greengrass/groups/74d0b623-c2f2-4cad-9acc-ef92f61fcaf7/deployments/f9ed02b7-c28e-4df6-83b1-e9553ddd0fc2" }
  3. 使用GetDeploymentStatus以获取部署的状态。

 

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

解决方案:确保的政策Amazon IoT Greengrass云端核心包括"greengrass:*"作为允许的操作。

 

一个 ConcurrentDeployment 当您第一次运行 create-deployment 命令时,就会发生错误。

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

 

Error: Greengrass is not 担任与该账户相关的服务角色,或错误:失败:TES 服务角色未与此账户关联。

解决方案:当部署失败时,您可能会看到此错误。检查 Greengrass 服务角色是否与您的关联Amazon Web Services 账户在目前的Amazon Web Services 区域. 有关更多信息,请参阅 管理 Greengrass 服务角色 (CLI)管理 Greengrass 服务角色(控制台)

 

错误:无法在部署中执行下载步骤。下载时出现错误:下载组定义文件时出错:... x509: certificate has expired or is not yet valid

解决方案:您可能会在看到此错误runtime.log当部署失败时。如果您收到包含 x509: certificate has expired or is not yet valid 消息的 Deployment failed 错误,请检查设备时钟。TLS 和 X.509 证书为构建 IoT 系统提供了安全的基础,但它们要求服务器和客户端上的时间准确无误。IoT 设备在尝试连接 Amazon IoT Greengrass 或使用服务器证书的其他 TLS 服务之前应获得正确的时间(15 分钟内)。有关更多信息,请参阅 。使用设备时间进行验证Amazon IoT服务器证书上的物联网Amazon官方博客.

 

部署未完成。

解决方案:执行以下操作:

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

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

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

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

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

    2. 启动守护程序:

      cd /greengrass/ggc/core/ sudo ./greengrassd start
  • 确保已连接核心设备并正确配置核心连接终端节点。

 

Error: 找不到 Java 或 java8 可执行文件,或者出现错误:<deployment-id>类型的部署 NewDeployment for <group-id>groups <worker-id>未能初始化,原因是已安装的 Java 版本必须大于或等于 8

解决方案:如果已为启用流管理器Amazon IoT Greengrass核心,必须在核心设备上安装 Java 8 运行时,然后再部署组。有关更多信息,请参阅流管理器的要求。默认情况下,当您使用默认组创建中的工作流Amazon IoT控制台来创建组。

或者,禁用流管理器,然后部署该组。有关更多信息,请参阅 配置流管理器设置(控制台)

 

部署未完成,并且 runtime.log 包含多个“等待 1 秒钟让容器停止”条目。

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

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

 

部署未完成,并且runtime.log包含 “[错误]-Greengrass 部署错误:未能向云报告部署状态 {<deployment-id>" DeploymentId” “无法启动 PUT,端点:https://<deployment-status>,错误:输入 https<deployment-status>://: proxyconnect tcp: x509: 由未知机构签名的证书 “}”

解决方案:您可能会在看到此错误runtime.log当 Greengrass 核心被配置为使用 HTTPS 连接并且代理服务器证书链在系统上不受信任时。若要尝试解决此问题,请将该证书链添加到根 CA 证书中。Greengrass 核心会将此文件中的证书添加到在与 Amazon IoT Greengrass 建立 HTTPS 和 MQTT 连接时用于进行 TLS 身份验证的证书池。

以下示例显示了添加到根 CA 证书文件中的代理服务器 CA 证书:

# My proxy CA -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIQWgIVAMHSAzWG/5YVRYtRQOxXUTEpHuEmApzGCSqGSIb3DQEK \nCwUAhuL9MQswCQwJVUzEPMAVUzEYMBYGA1UECgwP1hem9uLmNvbSBJbmMuMRww ... content of proxy CA certificate ... +vHIRlt0e5JAm5\noTIZGoFbK82A0/nO7f/t5PSIDAim9V3Gc3pSXxCCAQoFYnui GaPUlGk1gCE84a0X\n7Rp/lND/PuMZ/s8YjlkY2NmYmNjMCAXDTE5MTEyN2cM216 gJMIADggEPADf2/m45hzEXAMPLE= -----END CERTIFICATE----- # Amazon Root CA 1 -----BEGIN CERTIFICATE----- MIIDQTCCAimgF6AwIBAgITBmyfz/5mjAo54vB4ikPmljZKyjANJmApzyMZFo6qBg ADA5MQswCQYDVQQGEwJVUzEPMA0tMVT8QtPHRh8jrdkGA1UEChMGDV3QQDExBBKW ... content of root CA certificate ... o/ufQJQWUCyziar1hem9uMRkwFwYVPSHCb2XV4cdFyQzR1KldZwgJcIQ6XUDgHaa 5MsI+yMRQ+hDaXJiobldXgjUka642M4UwtBV8oK2xJNDd2ZhwLnoQdeXeGADKkpy rqXRfKoQnoZsG4q5WTP46EXAMPLE -----END CERTIFICATE-----

默认情况下,根 CA 证书文件位于 /greengrass-root/certs/root.ca.pem 中。要查找核心设备上的位置,请查看crypto.caPath房产在config.json.

注意

greengrass-root 表示在您的设备上安装 Amazon IoT Greengrass 核心软件的路径。通常,这是 /greengrass 目录。

 

Error: <deployment-id>类型的部署 NewDeployment 对于组<group-id>失败错误:处理时出错。groups 配置无效:112 或 [119 0] 对文件不具有 rw 权限<path>。

解决方案:确保<path>目录具有该目录的读取和写入权限。

 

Error: <list-of-function-arns> 配置为以根用户身份运行,但 Greengrass 未配置为通过根用户权限运行 Lambda 函数。

解决方案:您可能会在看到此错误runtime.log当部署失败时。确保您拥有配置Amazon IoT Greengrass以允许 Lambda 函数以根权限运行。要么更改的值allowFunctionsToRunAsRootgreengrass_root/config/config.jsonyes或者将 Lambda 函数更改为以另一个用户/组的身份运行。有关更多信息,请参阅 以根用户身份运行 Lambda 函数

 

Error: <deployment-id>类型的部署 NewDeployment 对于组<group-id>失败错误:Greengrass 部署错误:无法在部署中执行下载步骤。处理时出错:无法加载已下载的组文件:无法基于userName 找到 UID,User:User:User。

解决方案:如果默认访问身份的Amazon IoT Greengrass组使用标准系统帐户,ggc_user用户和ggc_group设备上必须存在组。有关介绍如何添加用户和组的说明,请参阅此步骤。请务必完全按所述的方式输入名称。

 

Error: [错误]-运行时执行错误:无法启动 lambda 容器。 {“ErrorString”:无法初始化容器挂载:无法在覆盖上层目录中屏蔽 grassgrass 根:无法在目录下创建掩码设备<ggc-path>:文件存在”}

解决方案:您可能会在看到此错误runtime.log当部署失败时。如果 Greengrass 组中的 Lambda 函数无法访问/usr内核文件系统中的目录。要解决此问题,请将本地卷资源添加到组,然后部署该组。资源必须:

  • 指定 /usr 作为 Source path (源路径)Destination path (目标路径)

  • 自动添加拥有资源的 Linux 组的操作系统组权限。

  • 与 Lambda 函数关联并允许只读访问。

 

Error: <deployment-id>类型的部署 NewDeployment <group-id>for groups 失败:进程启动失败:Containainer 进程导致 “process_linux.go perform”。

解决方案:当部署失败时,您可能会看到此错误。重试部署。

 

Error: [警告]-MQTT [客户端] 拨打 tcp: lookup <host-prefix>-ats.iot。 <region>.amazonaws.com:没有这样的房东... [错误]-Greengrass 部署错误:未能向云报告部署状态... net/htttt:在等待连接时请求被取消(等待标头时超出 Cliengrass)

解决方案:如果您使用systemd-resolved,这将启用DNSSEC默认设置。因此,无法识别许多公共域。尝试到达 Amazon IoT Greengrass 终端节点时找不到主机,因此您的部署保持在 In Progress 状态。

您可以使用以下命令和输出以测试此问题。更换领域终端节点中的占位符包含您的Amazon Web Services 区域.

$ ping greengrass-ats.iot.region.amazonaws.com ping: greengrass-ats.iot.region.amazonaws.com: Name or service not known
$ systemd-resolve greengrass-ats.iot.region.amazonaws.com greengrass-ats.iot.region.amazonaws.com: resolve call failed: DNSSEC validation failed: failed-auxiliary

一个可能的解决方案是禁用 DNSSEC。当 DNSSECfalse 时,DNS 查找未经过 DNSSEC 验证。有关更多信息,请参阅。已知问题为了systemd.

  1. DNSSEC=false 添加到 /etc/systemd/resolved.conf

  2. 重启 systemd-resolved.

有关 resolved.confDNSSEC 的信息,请在终端中运行 man resolved.conf

 

有关创建组和创建函数的问题

可以使用以下信息来帮助排查与创建Amazon IoT GreengrassGroup 或 Greengrass Lambda 函数。

 

Error: 您的IsolationMode'该组的配置无效。

解决方案:function-definition-versionDefaultConfig 中的 IsolationMode 值不受支持时,出现此错误。支持的值为 GreengrassContainerNoContainer

 

Error: 您的IsolationMode'具有 arn 的函数的配置<function-arn>无效。

解决方案:此错误在当时IsolationMode的<function-arn>中的值function-definition-version不支持 。支持的值为 GreengrassContainerNoContainer

 

Error: MemorySize在中<function-arn>不允许使用具有 arn 的函数的 Execution 配置 IsolationMode=NoContainer.

解决方案:当您指定一个时,会出现该错误MemorySize值,你选择在没有容器化的情况下运行。在不进行容器化的情况下运行的 Lambda 函数不能有内存限制。您可以删除限制,也可以更改 Lambda 函数以使其在Amazon IoT Greengrass容器。

 

Error: 在中<function-arn>不允许使用具有 arn 的函数的 Sysfs 配置 IsolationMode=NoContainer.

解决方案:如果您指定,会出现此错误。true为了AccessSysfs而且你选择在没有容器化的情况下运行。在不进行容器化的情况下运行的 Lambda 函数必须更新其代码才能直接访问文件系统,并且不能使用AccessSysfs. 您可以将值指定为false为了AccessSysfs或者您可以将 Lambda 函数更改为在Amazon IoT Greengrass容器。

 

Error: MemorySize具有 arn 的函数<function-arn>的 Execution 配置 IsolationMode=GreengrassContainer.

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

 

Error: 函数<function-arn>指<resource-type>的是不允许的类型的资源 IsolationMode=NoContainer.

解决方案:你无法访问Local.DeviceLocal.VolumeML_Model.SageMaker.JobML_Model.S3_Object,或者S3_Object.Generic_Archive在不进行容器化的情况下运行 Lambda 函数时的资源类型。如果需要这些资源类型,则必须在 Amazon IoT Greengrass 容器中运行。您也可以更改 Lambda 函数中的代码,从而在不进行容器化的情况下直接访问本地设备。

 

Error: <function-arn>不允许使用具有 arn 的函数的 Execution 配置。

解决方案:当您创建一个系统 Lambda 函数时,会出现该错误GGIPDetector要么GGCloudSpooler你指定了IsolationMode要么RunAs配置。你必须省略Execution此系统 Lambda 函数的参数。

 

发现问题

可以使用以下信息帮助解决 Amazon IoT Greengrass 发现服务的问题。

 

Error: Device is many groups,devices 不能超过 10 groups

解决方案:这是一个已知的限制。一个客户端设备最多可以是 10 个组的成员。

 

机器学习资源问题

使用以下信息帮助解决机器学习资源的问题。

 

ML 无效ModelOwner - GroupOwnerSetting ML 模型资源中提供了,但是 GroupOwner 要么 GroupPermission 不存在

解决方案:如果机器学习资源包含ResourceDownloadOwnerSetting对象,但必需GroupOwner要么GroupPermission属性未定义。要解决此问题,请定义缺失的属性。

 

NoContainer 函数无法在附加Machine Learning 资源时配置权限。 <function-arn>是指在资源 <resource-id><ro/rw> 访问策略中具有权限的机器学习资源。

解决方案:如果非容器化的 Lambda 函数指定了对机器学习资源的函数级权限,则会收到此错误。非容器化函数必须从在机器学习资源上定义的资源所有者权限继承权限。要解决此问题,请选择。继承资源所有者权限(console)从 Lambda 函数的资源访问策略中移除权限(API)。

 

函数<function-arn>指的Machine Learning 资源<resource-id>在两者中都缺少权限 ResourceAccessPolicy 和资源 OwnerSetting.

解决方案:如果未为附加的 Lambda 函数或资源配置对机器学习资源的权限,则会收到此错误。要解决此问题,请在ResourceAccessPolicy适用于 Lambda 函数或OwnerSetting资源的属性。

 

函数<function-arn>是指<resource-id>具有权限\ "rw\” 的Machine Learning 资源,而资源所有者设置 GroupPermission只允许\ “ro\”。

解决方案:如果为附加的 Lambda 函数定义的访问权限超过为机器学习资源定义的资源所有者权限,则会收到此错误。要解决此问题,请为 Lambda 函数设置限制更多的权限或为资源所有者设置限制较少的权限。

 

NoContainer 函数<function-arn>是指嵌套目标路径的资源。

解决方案:如果附加到非容器化的 Lambda 函数的多个机器学习资源使用相同的目标路径或嵌套的目标路径,则会收到此错误。要解决此问题,请为资源指定单独的目标路径。

 

Lambda <function-arn> 通过共享同一组所有者 ID 获得对资源 <resource-id> 的访问权限

解决方案:您在收到此错误runtime.log如果将同一个操作系统组指定为 Lambda 函数的Run as (运行方式)身份和资源拥有者用于机器学习资源,但该资源未附加到 Lambda 函数。此配置为 Lambda 函数提供隐式权限,它可以使用这些权限来访问资源Amazon IoT Greengrass授权。

要解决此问题,请为其中一个属性使用不同的操作系统组,或将机器学习资源附加到 Lambda 函数。

Docker 中的 Amazon IoT Greengrass 核心问题

可以使用以下信息来帮助排查与运行Amazon IoT Greengrass核心在一个 Docker 容器中。

 

Error: 未知选项:-no-include-email.

解决方案:此错误在运行aws ecr get-login命令。确保您有最新的Amazon CLI已安装的版本(例如,运行:pip install awscli --upgrade --user)。 如果您使用的是 Windows,并且您已使用 MSI 安装程序安装 CLI,则必须重复安装过程。有关更多信息,请参阅 。安装Amazon Command Line Interface在Microsof中的Amazon Command Line Interface用户指南.

 

警告:IPv4 处于禁用状态。网络将不起作用。

解决方案:在运行时,您可能会收到此警告或类似的消息Amazon IoT GreengrassLinux 计算机上的。按照此步骤中所述进行操作来启用 IPv4 网络转发。Amazon IoT Greengrass 云部署和 MQTT 通信在未启用 IPv4 转发时将不运行。有关更多信息,请参阅 Docker 文档中的在运行时配置具有命名空间的内核参数 (sysctls)

 

Error: 防火墙阻止 Windows 和容器之间的文件共享。

解决方案:您可能会收到此错误或Firewall Detected在 Windows 计算机上运行 Docker 时出现消息。如果您登录虚拟私有网络 (VPN) 并且网络设置阻止挂载共享驱动器,也会出现此错误。在这种情况下,请关闭 VPN 并重新运行 Docker 容器。

 

Error: 出现错误 ()AccessDeniedException) GetAuthorizationToken operation: User perform perform/<account-id>is no <user-name>t authorizedGetAuthorizationToken 在资源上:*

在运行aws ecr get-login-password命令,如果您没有足够的权限访问 Amazon ECR 存储库。有关更多信息,请参阅 。Amazon ECR 存储库策略示例访问一个 Amazon ECR 存储库中的Amazon ECR 用户指南.

 

Error: 无法为服务 Greengrass 创建容器:冲突。容器名称 “/aws-iot-greengrass“已在使用中。

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

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

 

Error: [FATAL]-由于意外错误,无法重置线程的 mount 命名空间:“操作不被允许”。为了保持一致性,GGC 将崩溃,需要手动重新启动。

解决方案:中的错误runtime.log在您尝试部署一个GreengrassContainerLambda 函数转换为Amazon IoT Greengrass核心在 Docker 容器中运行。目前仅有NoContainerLambda 函数可以部署到 Greengrass Docker 容器。

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

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

使用日志排查问题

您可以为 Greengrass 组配置日志记录设置,例如是否将日志发送到 CloudWatch 日志、将日志存储在本地文件系统上,或两者兼而有之。要在排查问题时获取详细信息,您可以暂时将日志记录级别更改为 DEBUG。对日志记录设置所做的更改在部署组时生效。有关更多信息,请参阅 为 Amazon IoT Greengrass 配置日志记录

在本地文件系统上,Amazon IoT Greengrass 将日志存储在以下位置。阅读文件系统上的日志需要根权限。

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

显示在以下情况下生成的消息Amazon IoT Greengrass核心崩溃。

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

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

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

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

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

包含的日志Amazon IoT Greengrass处理将 Greengrass 日志上传到的组件 CloudWatch 日志。如果你无法查看 Greengrass 登录 CloudWatch,则可以使用这些日志进行故障排除。

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

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

注意

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

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

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

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

注意

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

排查存储问题

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

  • 本地影子更新未进行。

  • NewAmazon IoT Greengrass核心 MQTT 服务器证书无法在本地下载。

  • 部署失败。

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

对消息进行问题排查

在 Amazon IoT Greengrass 中本地发送的所有消息都使用 QoS 0 发送。默认情况下,Amazon IoT Greengrass 在内存中队列中存储消息。因此,在 Greengrass 核心重新启动时,未处理的消息将会丢失;例如,在组部署或设备重启后。不过,您可以配置Amazon IoT Greengrass(v1.6 或更高版本)将消息缓存到文件系统中,以便在核心重新启动时永久保存这些消息。您也可以配置队列大小。如果配置队列大小,请确保它大于或等于 262144 字节 (256 KB)。否则,Amazon IoT Greengrass 可能无法正确启动。有关更多信息,请参阅 云目标的 MQTT 消息队列

注意

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

您还可以配置核心以建立与 Amazon IoT 的持久会话。这将允许核心接收从Amazon Web Services 云当核心脱机时。有关更多信息,请参阅 与 Amazon IoT Core 的 MQTT 持久性会话

影子同步超时问题排查

如果 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 []}"

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

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

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

注意

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

查看 Amazon re:Post

如果您无法使用本主题中的问题排查信息解决您的问题,可以搜索排除 Amazon IoT Greengrass 的故障或者查看Amazon IoT Greengrasstag onAmazonre: Post了解相关问题或发布新问题。中的成员Amazon IoT Greengrass团队积极监控Amazonre: Post。