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

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

问题排查AWS IoT Greengrass

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

有关 AWS IoT Greengrass 配额(限制),请参阅 服务配额Amazon Web Services 一般参考.

AWS IoT Greengrass Core 问题

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

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

问题

 

错误 配置文件缺少标记、路径或键盘。[PID=<的Greengrass后台进程pid>]死亡。

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

  • 升级到V1.7 or later...我们建议您始终运行最新版本的 AWS IoT Greengrass 核心软件。如需下载信息,请参阅 AWS IoT Greengrass 核心软件.

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

    注意

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

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

 

错误 无法解析/<Greengrass-root>/config/config.json。

解决方案: 当您在这个时候 AWS IoT Greengrass 核心软件未启动。确保 Greengrass配置文件 正在使用有效的JSON格式。

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

 

错误 生成TLS配置时出错: 错误缺血

解决方案: 当您在这个时候 AWS IoT Greengrass 核心软件未启动。确保 加密 Greengrass配置文件的部分有效。错误消息应提供更多信息。

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

 

错误 运行时无法启动:无法启动工作人员:容器测试超时。

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

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

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

 

错误 无法在本地CloudWatch上调用PutlogEvents,loggroup: /GreenGrassSystem/Connection_Manager,错误: RequestError:发送请求失败,原因如下: http://<path>/CloudWatch/Logs/:DialTCP<address>:getsockopt:连接拒绝,响应:{}。

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

 

错误 由于:无法加载组而无法创建服务器:chmod/<greengrass-root>/ggc/deployment/lambda/arn:aws-cn:Lambda:<region>:<account-id>:function:<function-name>:<version>/<文件名>:没有此类文件或目录。

解决方案: 当您在这个时候 AWS IoT Greengrass 核心软件未启动。如果您部署 Lambda 可执行文件 核心部分,检查功能 Handler 属性在 group.json 文件(位于/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 组(建议),您现在可以重新部署组。(否则,您必须在组定义和订阅中指向新的函数版本或别名,然后再部署组。)

 

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

解决方案: 检查您没有缺少任何container依赖关系。

 

错误 滑阀阀芯尺寸应至少为262144字节。

解决方案: 当您在这个时候 AWS IoT Greengrass 核心软件未启动。打开 group.json 文件(位于 /greengrass-root/ggc/deployment/group),将文件的内容替换为空的JSON对象({}),然后运行以下命令开始 AWS IoT Greengrass:

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

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

 

错误 [错误]-云消息传递错误: 尝试发布消息时出错。{"errorstring":"operationtimedout"}

解决方案: 您可能会看到 GGCloudSpooler.log GreengrassCore无法将MQTT消息发送至 AWS IoT Core. 如果核心环境存在有限的带宽和高延迟,则可能会发生此情况。如果您正在运行 AWS IoT Greengrass v1.10.2或更高版本,尝试增加 mqttOperationTimeout配置JSON 文件。如果此属性不存在,请将其添加到 coreThing 对象中。例如:。

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

默认值为 5,最小值为 。5.

 

错误:container_linux.go:344:开始容器过程导致“process_linux.go:424:container初始化导致\"rootfs_linux.go:64:将\\\"/Greengrass/GGC/Socket/Greengrass_IPC.sock/Socket/Greengrass_ipc.sock/socket/Greengrass_ipc.sock\\\”安装到Rootfs\\\"/Greengrass/GGC/Packages/<version\\\"/Greengrass_IPC.sock\\\"的>/rootfs/merge\\\"导致\\\"STAT/Greengrass/GGC/Socket/Greengrass_IPC.sock:PermissionRejected\\\"\""。

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

 

错误 使用PID运行的Greengrass后台进程:<process-id>。某些系统组件无法启动。检查“runtime.log”中有无错误。

解决方案: 当您在这个时候 AWS IoT Greengrass 核心软件未启动。检查 runtime.logcrash.log 对于具体错误信息。有关更多信息,请参阅 使用日志排查问题.

 

设备影子未与云同步。

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

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

 

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

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

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

ulimit -n 2048
注意

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

 

错误 运行时执行错误:无法启动Lambda容器。container_linux.go:259:启动容器过程导致“process_linux.go:345:container初始化导致\"rootfs_linux.go:50:准备rootfs导致\\\"permissionrejected\\\"\""。

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

 

警告 [WARN]-[5]GK遥控器: 检索公钥数据时出错: ErrPrincipalNotConfigured:未设置MQTTCertificate私钥。

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

 

错误 尝试使用角色时拒绝许可 arn:aws-cn:iam::<account-id>:role/<role-name>访问S3URLhttps://<region>-Greengrass-Updates.s3region>.amazonaws.com/core/<architecture>/Greengrass-Core-<Distribution-version>.tar.gz。

解决方案: 当空气(OTA)更新失败,您可能会看到此错误。在签署人角色政策中,将目标AWS区域添加为 Resource...此签名人角色用于预先签署S3URL的 AWS IoT Greengrass 软件更新。有关详细信息,请参阅 S3URL签署人角色.

 

TheThethe AWS IoT Greengrass Core 配置为使用 网络代理 您的 Lambda 功能无法进行传出连接。

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

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

使用与环境中定义的变量相同的案例,例如,所有小写字母 http_proxy 或所有大写字母 HTTP_PROXY...对于这些变量, AWS IoT Greengrass 支持两者。

注意

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

 

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

解决方案: 当另一个设备硬编码为使用核心事物名称作为与 的 MQTT 连接的客户端 ID 时,可能发生这种情况。AWS IoT. 同一 AWS 区域和 AWS 账户中的同时连接必须使用唯一的客户端 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 个字符之间。它在 AWS 账户的当前 AWS 区域中必须是唯一的。

    "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 当WhenWhen AWS IoT Greengrass 尝试安装安装 /proc 文件系统创建 Lambda 容器。或者,您可能会看到类似错误,例如 operation not permittedEPERM...即使依赖检查程序脚本通过的平台上运行测试,也可能发生这些错误。

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

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

  • 设置 /proc 主机上的装载选项 rw,relatim 只有。

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

注意

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

 

[错误]-运行时执行错误:无法启动Lambda容器。{"errorstring":"无法初始化容器装载:无法掩蔽覆盖上层的Greengrass根:无法在目录<GGC-PATH>中创建掩码设备:存在文件"}

解决方案: 当部署失败时,可能会在runtime.log中看到此错误。如果A Lambda 功能 AWS IoT Greengrass 组无法访问 /usr Core文件系统中的目录。

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

  • 指定 /usr 作为 源路径目标路径.

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

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

 

[错误]-部署失败。{"deployymentid":"<deployment-id>","errorstring":"containertestprocesswithpid<pid>失败:容器处理状态:退出状态1"}

解决方案: 当部署失败时,可能会在runtime.log中看到此错误。如果A Lambda 功能 AWS IoT Greengrass 组无法访问 /usr Core文件系统中的目录。

您可以通过检查来确认 GGCanary.log 对于其他错误。如果 Lambda 功能无法访问 /usr 目录, GGCanary.log 将包含以下错误:

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

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

  • 指定 /usr 作为 源路径目标路径.

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

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

 

解决方案: 您可能会看到 runtime.log 当 AWS IoT Greengrass 核心软件未启动,Linux内核版本为4.19.57或更早版本。此问题在 Debian 操作系统中可能更常见。

要解决该问题,可以执行下列操作之一:

  • 如果您正在运行 AWS IoT Greengrass Core软件v1.9.3或更高版本,添加 system.useOverlayWithTmpfs 属性至 配置JSON,并将值设置为 true...例如:

    { "system": { "useOverlayWithTmpfs": true }, "coreThing": { "caPath": "root-ca.pem", "certPath": "cloud.pem.crt", "keyPath": "cloud.pem.key", ... }, ... }
  • 如果您正在运行 AWS IoT Greengrass 核心软件v1.9.2或更早版本的RaspberryPI,更新至 AWS IoT Greengrass Core软件v1.9.3或更高版本。有关 AWS IoT Greengrass 软件的无线更新的信息,请参阅 。AWS IoT Greengrass Core 软件的 OTA 更新.

  • 升级设备上的 Linux 内核。建议升级到版本 4.4 或更高版本。

注意

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

 

错误 [debug]无法获取路由。丢弃消息。

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

 

错误 [错误24]太多打开<lambda-function>,[errno24]过多打开文件

解决方案: 您可能会在您的 Lambda 功能实例化功能日志文件 StreamManagerClient 在功能处理器中。我们建议您在处理程序之外创建客户端。有关更多信息,请参阅 使用 StreamManagerClient 与流合作.

 

部署问题

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

问题

 

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

解决方案: 使用 AWS IoT 控制台 或 AWS IoT Greengrass API重新部署之前的工作部署。这会将相应的组版本部署到您的核心设备。

重新部署一个部署(控制台)

  1. 在组配置页面上,选择 部署. 该页面显示组的部署历史记录,包括日期和时间、组版本以及每次部署尝试的状态。

  2. 查找包含您要重新部署的部署的行。在 状态 列,选择椭圆(),然后选择 重新部署.

    部署页面,显示部署的“重新部署”操作。

重新部署一个部署 (CLI)

  1. 使用 List部署 要查找要重新部署的部署的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" } ] }
    注意

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

  2. 使用 创建部署 重新部署目标部署。将部署类型设置为 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. 使用 getdeploy状态 要获得部署的状态。

 

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

解决方案: 确保 AWS IoT Greengrass Core 云中包括 "greengrass:*" 作为允许的操作。

 

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

解决方案: 部署可能正在进行。您可以运行 获取-部署状态 查看是否创建了部署。如果没有,请再次尝试创建部署。

 

错误 Greengrass无权承担与此账户相关的服务角色,或者错误: 已失败 TES服务角色与此帐户无关。

解决方案: 当部署失败时,可能会看到此错误。检查Greengrass服务角色是否与您的 AWS 当前帐户 AWS 地区。有关详细信息,请参阅 管理 Greengrass 服务角色 (CLI)管理 Greengrass 服务角色(控制台).

 

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

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

 

错误 签名验证期间出现错误。存储库不会更新,将使用以前的索引文件。GPG错误:https://dnw9lb6lzp2d8.cloudfront.netstableinrelease: 无法验证以下签名,因为公钥不可用: NO_PUBKEY68D644ABD示例

解决方案: 当用于验证APT存储库包的信任密钥时,您可能会看到此错误 AWS IoT Greengrass 缺少、已过期或无效。若要解决此问题,请安装密钥环软件包:

wget -O aws-iot-greengrass-keyring.deb https://d1onfpft10uf5o.cloudfront.net/greengrass-apt/downloads/aws-iot-greengrass-keyring.deb sudo dpkg -i aws-iot-greengrass-keyring.deb

有关更多信息,请参阅 使用 apt 安装 AWS IoT Greengrass Core 软件.

 

部署未完成。

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

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

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

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

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

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

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

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

 

错误 无法找到Java或Java8可执行文件或错误: 部署<部署ID>对于组<组ID>的新部署失败错误:<worker-id>的工作人员无法初始化原因安装的java版本无法初始化必须大于或等于8

解决方案: 如果已启用StreamManager(流量管理器) AWS IoT Greengrass Core,在部署组之前,必须在核心设备上安装Java8Runtime。有关详细信息,请参阅 要求 对于StreamManager。当您使用 默认组创建 工作流程 AWS IoT 控制台 创建组。

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

 

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

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

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

 

部署未完成,且 runtime.log 包含"[错误]-Greengrass部署错误:无法将部署状态报告回云{"deployymentid":"<deployment-id>","errorstring": “无法启动放置,端点:https://<部署状态>,错误: puthttps://<deployment-status>:proxyConnectTCP:x509:未知授权签名证书""}

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

以下示例显示了添加到根 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 属性 配置JSON.

注意

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

 

错误 部署<部署ID>类型新部署组<组ID>失败错误: 处理时出错。组配置无效:112或[1190]文件上没有RW权限: <path>。

解决方案: 确保 <path> 目录对目录具有读取权限。

 

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

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

 

错误 部署<部署ID>类型新部署组<组ID>失败错误: Greengrass部署错误:无法在部署中执行下载步骤。处理时错误:无法加载下载的组文件:无法根据用户名找到UID,用户名:GGC_User:用户:未知用户GGC_User。

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

 

错误 [错误]-运行时执行错误:无法启动Lambda容器。{"errorstring":"无法初始化容器装载:无法掩蔽覆盖上层的Greengrass根:无法在目录<GGC-PATH>中创建掩码设备:存在文件"}

解决方案: 您可能会看到 runtime.log 当部署失败。如果A Lambda Greengrass集团的功能无法访问 /usr Core文件系统中的目录。要解决此问题,请添加 本地卷资源 然后部署组。资源必须:

  • 指定 /usr 作为 源路径目标路径.

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

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

 

错误 部署<部署ID>类型<group-id>的新部署失败错误:处理开始失败:container_linux.go:259:启动container过程导致“process_linux.go:250:运行“执行设置”流程为“已启用”导致\“wait:nochildprocesses\"”。

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

 

错误 [warn]-mqtt[client]dialtcp:查找<host-prefix>-ats.iot。<region>.amazonaws.com:无此类主机... [错误]-Greengrass部署错误:无法将部署状态报告回云...NET/HTTP:请求在等待连接时取消(客户端.等待标头时超时)

解决方案: 如果您正在使用 systemd-resolved,这支持 DNSSEC 默认设置。因此,无法识别许多公共域。尝试达到 AWS IoT Greengrass 端点未能找到主机,因此您的部署仍然在 In Progress 状态。

您可以使用以下命令和输出以测试此问题。将终端节点中的 区域 占位符替换为您的 AWS 区域。

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

一个可能的解决方案是禁用 DNSSEC。当WhenWhen DNSSECfalse,DNS查找 DNSSEC 已验证。有关详细信息,请参阅 已知问题 对于 systemd.

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

  2. 重新启动 systemd-resolved.

有关 resolved.confDNSSEC,运行 man resolved.conf 在您的航站楼。

 

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

使用以下信息帮助解决创建A的问题 AWS IoT Greengrass 组 或 Greengrass Lambda 功能。

 

错误 组的“IsolationMode”配置无效。

解决方案: 此错误发生在 IsolationModeDefaultConfigfunction-definition-version 不支持。支持的值为 GreengrassContainer 和 。NoContainer.

 

错误 用于ARN<function-arn>的“isolationmode”配置无效。

解决方案: 此错误发生在 IsolationMode <function-arn>的<function-arn> function-definition-version 不支持。支持的值为 GreengrassContainer 和 。NoContainer.

 

错误 在IsolationMode=nocontainer中不允许使用ARN<function-arn>的备忘录大小配置。

解决方案: 当您指定 MemorySize 值并且您选择运行而无需容器化。 Lambda 没有容器化的运行功能不能具有内存限制。您可以删除限制或者您可以更改 Lambda 运行的功能 AWS IoT Greengrass 容器。

 

错误 在IsolationMode=nocontainer中不允许使用ARN<function-arn>访问SYSFS配置。

解决方案: 当您指定此错误时 true 对于 AccessSysfs 而且您选择在没有容器化的情况下运行。 Lambda 无容器化的功能必须更新代码,以直接访问文件系统,且无法使用 AccessSysfs...您可以指定 false 对于 AccessSysfs 或者您可以更改 Lambda 运行的功能 AWS IoT Greengrass 容器。

 

错误 在IsolationMode=Greengrasscontainer中需要使用ARN<function-arn>的备忘录大小配置。

解决方案: 由于您未指定 MemorySize 限制 Lambda 您正在运行的功能 AWS IoT Greengrass 容器。指定 MemorySize 值可解决该错误。

 

错误 函数<function-arn>指不允许在isolationmode=nocontainer中类型的<resource-type>的资源。

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

 

错误 不允许使用ARN<function-arn>执行功能配置。

解决方案: 创建系统时出现此错误 Lambda 功能 GGIPDetectorGGCloudSpooler 您指定了 IsolationModeRunAs 配置。您必须忽略 Execution 此系统的参数 Lambda 功能。

 

发现问题

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

 

错误 设备是多个组的成员,设备不能超过10个组

解决方案: 这是已知的限制。A Greengrass设备 最多可为10个组。

 

机器学习资源问题

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

 

InvalidMLModelOwner - ML 模型资源中提供了 GroupOwnerSetting,但是不存在 GroupOwner 或 GroupPermission

解决方案:如果机器学习资源包含 ResourceDownloadOwnerSetting 对象,但未定义必需的 GroupOwnerGroupPermission 属性,则会收到此错误。要解决此问题,请定义缺失的属性。

 

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

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

 

函数 <function-arn> 指在 ResourceAccessPolicy 和资源 OwnerSetting 中都缺少权限的机器学习资源 <resource-id>。

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

 

函数 <function-arn> 是指具有权限 \"rw\" 的机器学习资源 <resource-id>,而资源所有者设置 GroupPermission 仅允许 \"ro\"。

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

 

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

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

 

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

解决方案:如果将相同的操作系统组指定为 Lambda 函数的运行身份标识和机器学习资源的资源所有者,但资源未附加到 Lambda 函数,则会在 runtime.log 中收到此错误。此配置为 Lambda 函数提供隐式权限,它可以使用这些权限来访问资源而无需 AWS IoT Greengrass 授权。

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

AWS IoT GreengrassDocker 中的 核心问题

使用以下信息可帮助解决与在 Docker 容器中运行 AWS IoT Greengrass Core 相关的问题。

 

错误 未知选项:-无电子邮件。

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

 

警告 已禁用IPv4。网络将不起作用。

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

 

错误 防火墙正在阻止窗口和容器之间的文件共享。

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

 

错误 调用GetAuthorisationToke操作时出现错误(访问拒绝例外): 用户:arn:aws:iam::<account-id>:user/<user-name>无权执行:ecr:GetAuthorization资源:*

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

 

错误 无法为Greengrass创建容器: 冲突. 容器名称“/aws-iot-greengrass”已在使用中。

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

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

 

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

解决方案: 此错误 runtime.log 当您尝试部署A时 GreengrassContainer Lambda 功能 AWS IoT Greengrass Core 在靠泊装置容器中运行。目前仅有 NoContainer Lambda 可以将功能部署到GreengrassDocker容器中。

解决这个问题 确保全部 Lambda 功能位于 NoContainer 模式 并开始新部署。然后,在启动容器时,不要绑定现有 deployment 目录到 AWS IoT Greengrass Core Docker容器。相反,在它的位置创建一个空 deployment 目录,并将该目录绑定挂载到 Docker 容器中。这允许新的Docker容器接收最新部署 Lambda 功能运行 NoContainer 模式。

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

使用日志排查问题

您可以为 Greengrass 组配置日志记录设置,例如将日志发送到 CloudWatch Logs 和/或在本地文件系统上存储日志。要在故障排除问题时获得详细信息,可以临时将日志记录级别更改为 DEBUG...在部署组时,记录设置的更改生效。有关更多信息,请参阅 为 AWS IoT Greengrass 配置日志记录.

在本地文件系统上,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 来查看日志消息。crash.log 仅在文件系统日志中找到 AWS IoT Greengrass Core 设备。

IFIFIF AWS IoT 已配置为将日志写入 CloudWatch,如果系统组件尝试连接到 AWS IoT.

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

注意

日志 AWS IoT Greengrass 核心软件v1.0存储在 greengrass-root/var/log 目录。

故障排除存储问题

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

  • 本地影子更新未进行。

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

  • 部署失败。

您应该始终留意本地的可用空间大小。您可以根据部署的大小计算自由空间 Lambda 功能,记录配置(参见 使用日志排查问题)以及本地存储的阴影数量。

对消息进行问题排查

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

注意

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

您还可以配置核心以建立与 的持久会话。AWS IoT. 这允许核心在核心脱机时接收从 AWS 云发送的消息。有关更多信息,请参阅 与 AWS 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 []}"

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

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

如果否 shadowSyncTimeout 值在 config.json,默认值为5秒。

注意

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

检查 AWS IoT Greengrass 论坛

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