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

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

排除 Amazon IoT Greengrass V2 的故障

使用本节中的故障排除信息和解决方案来帮助解决以下方面的问题Amazon IoT Greengrass Version 2。

查看Amazon IoT Greengrass核心软件和组件日志

Amazon IoT GreengrassCore 软件将日志写入本地文件系统,您可以使用该文件系统查看有关核心设备的实时信息。您还可以将核心设备配置为将日志写入 CloudWatch 日志,这样就可以远程排除核心设备故障。这些日志可以帮助您识别组件、部署和核心设备的问题。有关更多信息,请参阅监控Amazon IoT Greengrass日志

Amazon IoT Greengrass核心软件问题

对Amazon IoT Greengrass核心软件问题进行故障排除。

主题

无法设置核心设备

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

无法将Amazon IoT Greengrass核心软件作为系统服务启动

如果Amazon IoT Greengrass Core 软件无法启动,请检查系统服务日志以确定问题。一个常见的问题是 Java 在 PATH 环境变量 (Linux) 或 PATH 系统变量 (Windows) 上不可用。

无法将 nucleus 设置为系统服务

当Amazon IoT Greengrass核心软件安装程序无法设置Amazon IoT Greengrass为系统服务时,您可能会看到此错误。在 Linux 设备上,如果核心设备没有 systemd 初始化系统,通常会出现此错误。即使无法设置系统服务,安装程序也可以成功设置Amazon IoT Greengrass核心软件。

请执行下列操作之一:

  • 将Amazon IoT Greengrass核心软件作为系统服务进行配置和运行。必须将软件配置为系统服务才能使用的所有功能Amazon IoT Greengrass。你可以安装 systemd 或使用不同的初始化系统。有关更多信息,请参阅将 Greengrass 核心配置为系统服务

  • 在没有系统服务的情况下运行Amazon IoT Greengrass Core 软件。您可以使用安装程序在 Greengrass 根文件夹中设置的加载器脚本来运行该软件。有关更多信息,请参阅运行Amazon IoT Greengrass没有系统服务的核心软件

无法连接到Amazon IoT Core

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

  • 检查您的核心设备是否可以连接到互联网,然后Amazon IoT Core. 有关您的设备连接的Amazon IoT Core终端节点的更多信息,请参阅配置Amazon IoT Greengrass核心软件

  • 检查您的核心设备是否Amazon IoT使用了允许iot:Connectiot:Publishiot:Receive、和iot:Subscribe权限的证书。

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

内存不足错误

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

无法安装 Greengrass CLI

在 CoAmazon IoT Greengrass re 的安装命令中使用--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

User root is not allowed to execute

当运行Amazon IoT Greengrass Core 软件的用户(通常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

com.aws.greengrass.lifecyclemanager.GenericExternalService: Could not determine user/group to run with

当核心设备尝试运行组件而 Greengrass nucleus 未指定用于运行组件的默认系统用户时,您可能会看到此错误。

要修复此问题,请配置 Greengrass 核心以指定运行组件的默认系统用户。有关更多信息,请参阅 配置运行组件的用户配置默认组件用户

Failed to map segment from shared object: operation not permitted

当Amazon IoT Greengrass核心软件无法启动时,您可能会看到此错误,因为该/tmp文件夹是使用noexec权限装载的。默认情况下,Amazon通用运行时 (CRT) 库使用该/tmp文件夹。

请执行下列操作之一:

  • 运行以下命令以使用exec权限重新装载该/tmp文件夹,然后重试。

    sudo mount -o remount,exec /tmp
  • 如果你运行 Greengrass nucleus v2.5.0 或更高版本,你可以设置 JVM 选项来更改Amazon CRT 库使用的文件夹。您可以在部署或安装Amazon IoT Greengrass核心软件时在 Greengrass nucleus 组件配置中指定jvmOptions参数。将 /path/ to/use 替换为Amazon CRT 库可以使用的文件夹路径。

    { "jvmOptions": "-Daws.crt.lib.dir=\"/path/to/use\"" }

无法设置 Windows 服务

如果你在微软 Windows 2016 设备上安装Amazon IoT Greengrass酷睿软件,你可能会看到这个错误。Windows 2016 不支持Amazon IoT Greengrass核心软件,有关支持的操作系统的列表,请参阅支持的平台

如果你必须使用 Windows 2016,则可以执行以下操作:

  1. 解压缩下载的Amazon IoT Greengrass Core 安装存档

  2. Greengrass目录中打开bin/greengrass.xml.template文件。

  3. <autoRefresh>标签之前将</service>标签添加到文件末尾。

    </log> <autoRefresh>false</autoRefresh> </service>

com.aws.greengrass.util.exceptions.TLSAuthException: Failed to get trust manager

在没有根证书颁发机构 (CA) 文件的情况下安装Amazon IoT Greengrass Core 软件时,可能会看到此错误。

2022-06-05T10:00:39.556Z [INFO] (main) com.aws.greengrass.lifecyclemanager.Kernel: service-loaded. {serviceName=DeploymentService} 2022-06-05T10:00:39.943Z [WARN] (main) com.aws.greengrass.componentmanager.ClientConfigurationUtils: configure-greengrass-mutual-auth. Error during configure greengrass client mutual auth. {} com.aws.greengrass.util.exceptions.TLSAuthException: Failed to get trust manager

检查您是否在提供给安装程序的配置文件中使用rootCaPath参数指定了有效的根 CA 文件。有关更多信息,请参阅安装 Amazon IoT Greengrass Core 软件

com.aws.greengrass.deployment.IotJobsHelper: No connection available during subscribing to Iot Jobs descriptions topic. Will retry in sometime

当核心设备无法连接订阅部署任务通知时Amazon IoT Core,您可能会看到此警告消息。执行以下操作:

  • 检查核心设备是否已连接到 Internet 并且可以访问您配置Amazon IoT的数据端点。有关核心设备使用的终端节点,请参阅允许设备流量通过代理或防火墙

  • 查看 Greengrass 日志中是否存在其他发现其他根本原因的错误。

software.amazon.awssdk.services.iam.model.IamException: The security token included in the request is invalid

当您使用自动配置安装Amazon IoT Greengrass核心软件时,您可能会看到此错误,并且安装程序使用无效的Amazon会话令牌。执行以下操作:

  • 如果您使用临时安全证书,请检查会话令牌是否正确以及您正在复制和粘贴完整的会话令牌。

  • 如果您使用长期安全证书,请检查设备是否没有您之前使用临时证书时的会话令牌。执行以下操作:

    1. 运行以下命令以取消会话令牌环境变量。

      Linux or Unix
      unset AWS_SESSION_TOKEN
      Windows Command Prompt (CMD)
      set AWS_SESSION_TOKEN=
      PowerShell
      Remove-Item Env:\AWS_SESSION_TOKEN
    2. 检查Amazon凭证文件是否包含会话令牌aws_session_token~/.aws/credentials如果是,请从文件中删除该行。

      aws_session_token = AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4Olgk

您也可以在不提供Amazon凭据的情况下安装Amazon IoT Greengrass Core 软件。有关更多信息,请参阅 通过手动资源配置安装Amazon IoT Greengrass核心软件通过Amazon IoT机群配置安装Amazon IoT Greengrass核心软件

software.amazon.awssdk.services.iot.model.IotException: User: <user> is not authorized to perform: iot:GetPolicy

当您使用自动配置功能安装Amazon IoT Greengrass核心软件时,您可能会看到此错误,并且安装程序使用没有所需权限的Amazon凭据。有关所需权限的更多信息,请参阅安装程序配置资源的最低 IAM 策略

检查证书的 IAM 身份的权限,并向 IAM 身份授予任何缺失的必需权限。

Error: com.aws.greengrass.shadowmanager.sync.model.FullShadowSyncRequest: Could not execute cloud shadow get request

当您使用影子管理器组件将设备影子与之同步时,您可能会看到此错误Amazon IoT Core。HTTP 403 状态码表明发生此错误是因为核心设备的Amazon IoT策略未授予呼叫权限GetThingShadow

com.aws.greengrass.shadowmanager.sync.model.FullShadowSyncRequest: Could not execute cloud shadow get request. {thing name=MyGreengrassCore, shadow name=MyShadow} 2021-07-14T21:09:02.456Z [ERROR] (pool-2-thread-109) com.aws.greengrass.shadowmanager.sync.SyncHandler: sync. Skipping sync request. {thing name=MyGreengrassCore, shadow name=MyShadow} com.aws.greengrass.shadowmanager.exception.SkipSyncRequestException: software.amazon.awssdk.services.iotdataplane.model.IotDataPlaneException: null (Service: IotDataPlane, Status Code: 403, Request ID: f6e713ba-1b01-414c-7b78-5beb3f3ad8f6, Extended Request ID: null)

要与本地影子同步Amazon IoT Core,核心设备的Amazon IoT策略必须授予以下权限:

  • iot:GetThingShadow

  • iot:UpdateThingShadow

  • iot:DeleteThingShadow

检查核心设备的Amazon IoT政策,并添加所有缺少的必需权限。有关更多信息,请参阅下列内容:

Operation aws.greengrass#<operation> is not supported by Greengrass

当您在自定义 Greengrass 组件中使用进程间通信 (IPC) 操作且核心设备上未安装所需的Amazon组件时,您可能会看到此错误。

要修复此问题,请将所需的组件作为依赖项添加到组件配方中,这样Amazon IoT Greengrass Core 软件就会在您部署组件时安装所需的组件。

java.io.FileNotFoundException: <stream-manager-store-root-dir>/stream_manager_metadata_store (Permission denied)

当您将直播管理器配置为使用不存在或权限不正确的根文件夹时,您可能会在直播管理器日志文件 (aws.greengrass.StreamManager.log) 中看到此错误。有关如何配置该文件夹的更多信息,请参阅直播管理器配置

com.aws.greengrass.security.provider.pkcs11.PKCS11CryptoKeyService: Private key or certificate with label <label> does not exist

PKCS #11 提供者组件找不到或加载您在将Amazon IoT Greengrass Core 软件配置为使用硬件安全模块 (HSM) 时指定的私钥或证书时,就会出现此错误。执行以下操作:

  • 使用您配置Amazon IoT Greengrass核心软件要使用的插槽、用户 PIN 和对象标签,检查私钥和证书是否存储在 HSM 中。

  • 在 HSM 中检查私钥和证书是否使用相同的对象标签。

  • 如果您的 HSM 支持对象 ID,请检查私钥和证书在 HSM 中是否使用相同的对象 ID。

查看 HSM 的文档,了解如何查询 HSM 中安全令牌的详细信息。如果您需要更改安全令牌的插槽、对象标签或对象 ID,请查看 HSM 的文档以了解如何操作。

software.amazon.awssdk.services.secretsmanager.model.SecretsManagerException: User: <user> is not authorized to perform: secretsmanager:GetSecretValue on resource: <arn>

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

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

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

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

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

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

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

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

software.amazon.awssdk.services.secretsmanager.model.SecretsManagerException: Access to KMS is not allowed

当您使用密钥管理器组件部署由密钥加密的Amazon Secrets Manager密Amazon Key Management Service钥时,可能会发生此错误。如果核心设备的代币交换 IAM 角色未授予解密密密钥的权限,则部署将失败,并且 Greengrass 日志包含此错误。

要修复此问题,请为核心设备的令牌交换角色添加kms:Decrypt权限。有关更多信息,请参阅下列内容:

java.lang.NoClassDefFoundError: com/aws/greengrass/security/CryptoKeySpi

当你尝试安装具有硬件安全性的Amazon IoT Greengrass Core 软件并且使用不支持硬件安全集成的较早版本的 Greengrass nucleus 时,你可能会看到这个错误。要使用硬件安全集成,必须使用 Greengrass nucleus v2.5.3 或更高版本。

com.aws.greengrass.security.provider.pkcs11.PKCS11CryptoKeyService: CKR_OPERATION_NOT_INITIALIZED

在将 CorAmazon IoT Greengrass e 作为系统服务运行 Core 时使用 TPM2 库时,您可能会看到此错误。

此错误表明您需要添加一个环境变量,该变量提供 PKCS #11 存储区在Amazon IoT Greengrass Core systemd 服务文件中的位置。

有关更多信息,请参阅PKCS #11 提供商组件文档的 “要求” 部分。

Amazon IoT Greengrass云问题

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

An error occurred (AccessDeniedException) when calling the CreateComponentVersion operation: User: arn:aws:iam::123456789012:user/<username> is not authorized to perform: null

当你从Amazon IoT Greengrass控制台或通过CreateComponentVersion操作创建组件版本时,你可能会看到这个错误。

此错误表明您的食谱不是有效的 JSON 或 YAML。检查食谱的语法,修复任何语法问题,然后重试。您可以使用在线 JSON 或 YAML 语法检查器来识别食谱中的语法问题。

Invalid Input: Encountered following errors in Artifacts: {<s3ArtifactUri> = Specified artifact resource cannot be accessed}

当你从Amazon IoT Greengrass控制台或通过CreateComponentVersion操作创建组件版本时,你可能会看到这个错误。此错误表明组件配方中的 S3 工件无效。

执行以下操作:

  • 检查 S3 存储桶是否与您创建组件的Amazon Web Services 区域位置相同。 Amazon IoT Greengrass不支持对组件构件的跨区域请求。

  • 检查构件 URI 是否是有效的 S3 对象 URL,并检查该构件在该 S3 对象 URL 上是否存在。

  • 检查您是否Amazon Web Services 账户有权访问工件的 S3 对象 URL。

核心设备部署问题

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

Error: com.aws.greengrass.componentmanager.exceptions.PackageDownloadException: Failed to download artifact

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

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

software.amazon.awssdk.services.s3.model.S3Exception: null (Service: S3, Status Code: 403, Request ID: null, ...)

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

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

  • 核心设备的令牌交换角色不允许Amazon IoT Greengrass核心软件从您在组件配方中指定的 S3 对象 URL 下载组件工件。检查令牌交换角色是否允许使用工s3:GetObject件可用的 S3 对象 URL。

software.amazon.awssdk.services.s3.model.S3Exception: Access Denied (Service: S3, Status Code: 403, Request ID: <requestID>

PackageDownloadException 错误可能包括核心设备没有调用权限时的堆栈跟踪s3:GetBucketLocation。错误消息还包括以下消息。

reason: Failed to determine S3 bucket location

检查核心设备的令牌交换角色是否允许使用s3:GetBucketLocation工件可用的 S3 存储桶。

Error: com.aws.greengrass.componentmanager.exceptions.ArtifactChecksumMismatchException: Integrity check for downloaded artifact failed. Probably due to file corruption.

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

执行以下操作:

  • 检查托管构件文件的 S3 存储桶中是否已更改。如果文件在您创建组件后发生了变化,请将其恢复到核心设备期望的先前版本。如果您无法将文件恢复到其先前版本,或者要使用文件的新版本,请使用构件文件创建组件的新版本。

  • 检查您的核心设备的互联网连接。如果工件文件在下载时损坏,则可能会发生此错误。创建新部署并重试。

Error: com.aws.greengrass.componentmanager.exceptions.NoAvailableComponentVersionException: Failed to negotiate component <name> version with cloud and no local applicable version satisfying requirement <requirements>

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

以下情况下可能会出现此问题:

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

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

  • 存在满足版本要求的组件版本,但没有一个与核心设备的平台兼容。

  • 核心设备的Amazon IoT策略不授予greengrass:ResolveComponentCandidates权限。在错误日志Status Code: 403中查找以确定此问题。要解决此问题,请将greengrass:ResolveComponentCandidates权限添加到核心设备的Amazon IoT策略中。有关更多信息,请参阅Amazon IoT Greengrass V2核心设备的最低Amazon IoT政策

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

software.amazon.awssdk.services.greengrassv2data.model.ResourceNotFoundException: The latest version of Component <componentName> doesn't claim platform <coreDevicePlatform> compatibility

当您将组件部署到核心设备并且该组件未列出与核心设备平台兼容的平台时,您可能会看到此错误。请执行下列操作之一:

com.aws.greengrass.componentmanager.exceptions.PackagingException: The deployment attempts to update the nucleus from aws.greengrass.Nucleus-<version> to aws.greengrass.Nucleus-<version> but no component of type nucleus was included as target component

当你部署依赖于 Greengrass 核心的组件时,你可能会看到这个错误,而核心设备运行的 Greengrass nucleus 版本早于可用的最新次要版本。之所以出现此错误,是因为Amazon IoT Greengrass Core软件尝试自动将组件更新到最新的兼容版本。但是,Amazon IoT Greengrass核心软件会阻止 Greengrass 核心更新到新的次要版本,因为Amazon提供的几个组件依赖于 Greengrass nucleus 的特定次要版本。有关更多信息,请参阅Greengrass 核心更新行为

您必须修改部署以指定要使用的 Greengrass 核心版本。请执行下列操作之一:

  • 修改部署以指定核心设备当前运行的 Greengrass 核心版本。

  • 修改部署以指定 Greengrass 核心的后续次要版本。如果选择此选项,则还必须更新所有Amazon依赖于 Greengrass nucleus 特定次要版本的组件的版本。有关更多信息,请参阅Amazon-提供的组件

Info: com.aws.greengrass.deployment.exceptions.RetryableDeploymentDocumentDownloadException: Greengrass Cloud Service returned an error when getting full deployment configuration

当核心设备收到大型部署文档时,您可能会看到此错误,该文档是大于 7 KB(针对事物的部署)或 31 KB(针对事物组的部署)的部署文档。要检索大型部署文档,核心设备的Amazon IoT策略必须允许该greengrass:GetDeploymentConfiguration权限。当核心设备没有此权限时,可能会发生此错误。出现此错误时,部署将无限期重试,其状态为 “进行中” (IN_PROGRESS)。

要解决此问题,请将greengrass:GetDeploymentConfiguration权限添加到核心设备的Amazon IoT策略中。有关更多信息,请参阅更新核心设备的Amazon IoT政策

Warn: com.aws.greengrass.deployment.DeploymentService: Failed to get thing group hierarchy

当核心设备收到部署且核心设备的Amazon IoT策略不允许greengrass:ListThingGroupsForCoreDevice许可时,您可能会看到此警告。创建部署时,核心设备使用此权限来识别其事物组,并移除已从中移除核心设备的任何事物组的组件。如果核心设备运行 Greengrass nucleus v2.5.0,则部署将失败。如果核心设备运行 Greengrass nucleus v2.5.1 或更高版本,则部署会继续进行,但不会移除组件。有关事物组移除行为的更多信息,请参阅将Amazon IoT Greengrass组件部署到设备

要更新核心设备的行为以删除从中移除核心设备的事物组的组件,请将greengrass:ListThingGroupsForCoreDevice权限添加到核心设备的Amazon IoT策略中。有关更多信息,请参阅更新核心设备的Amazon IoT政策

Info: com.aws.greengrass.deployment.DeploymentDocumentDownloader: Calling Greengrass cloud to get full deployment configuration

您可能会看到多次打印此信息消息而没有错误,因为核心设备在DEBUG日志级别记录错误。当核心设备收到大型部署文档时,可能会出现此问题。出现此问题时,部署将无限期重试,其状态为 “进行中” (IN_PROGRESS)。有关如何解决此问题的更多信息,请参阅此疑难解答

核心设备组件问题

解决核心设备上的 Greengrass 组件问题。

Warn: '<command>' is not recognized as an internal or external command

当Amazon IoT Greengrass核心软件无法在组件的生命周期脚本中运行命令时,您可能会在 Greengrass 组件的日志中看到此错误。组件的状态BROKEN是这个错误的结果。如果运行组件的系统用户(例如)在 PATHggc_user文件夹中找不到命令的可执行文件,则可能会出现此错误。

在 Windows 设备上,检查运行该组件的系统用户是否有包含可执行文件的文件夹。PATH如果缺少了PATH,请执行之一:

  • 将可执行文件的文件夹添加到PATH系统变量中,该变量可供所有用户使用。然后,重新启动该组件。

    如果您运行 Greengrass nucleus 2.5.0,则在更新PATH系统变量后,必须重新启动Amazon IoT Greengrass Core 软件才能运行更新后的组件PATH。如果重新启动软件PATH后Amazon IoT Greengrass Core 软件未使用更新版本,请重新启动设备并重试。有关更多信息,请参阅运行Amazon IoT GreengrassCore 软件

  • 将可执行文件的文件夹添加到运行该PATH组件的系统用户的用户变量中。

Python 脚本不记录消息

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

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

    Linux or Unix
    python3 -u hello_world.py
    Windows
    py -3 -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 脚本是否输出日志消息的更多信息,请参阅监控Amazon IoT Greengrass日志

更改默认配置时组件配置不更新

当您更改组件配方DefaultConfiguration中的时,新的默认配置不会在部署期间取代该组件的现有配置。要应用新的默认配置,必须将组件的配置重置为其默认设置。部署组件时,将单个空字符串指定为重置更新

Console
重置路径
[""]
Amazon CLI

以下命令创建对核心设备的部署。

aws greengrassv2 create-deployment --cli-input-json file://reset-configuration-deployment.json

reset-configuration-deployment.json文件包含以下 JSON 文档。

{ "targetArn": "arn:aws:iot:us-west-2:123456789012:thing/MyGreengrassCore", "deploymentName": "Deployment for MyGreengrassCore", "components": { "com.example.HelloWorld": { "componentVersion": "1.0.0", "configurationUpdate": {, "reset": [""] } } } }
Greengrass CLI

以下 Greengrass CLI 命令在核心设备上创建本地部署。

sudo greengrass-cli deployment create \ --recipeDir recipes \ --artifactDir artifacts \ --merge "com.example.HelloWorld=1.0.0" \ --update-config reset-configuration-deployment.json

reset-configuration-deployment.json文件包含以下 JSON 文档。

{ "com.example.HelloWorld": { "RESET": [""] } }

awsiot.greengrasscoreipc.model.UnauthorizedError

当 Greengrass 组件无权对资源执行 IPC 操作时,您可能会在 Greengrass 组件的日志中看到此错误。要授予组件调用 IPC 操作的权限,请在组件的配置中定义 IPC 授权策略。有关更多信息,请参阅授权组件执行 IPC 操作

提示

如果您更改了组件配方DefaultConfiguration中的,则必须将该组件的配置重置为其新的默认配置。部署组件时,将单个空字符串指定为重置更新。有关更多信息,请参阅更改默认配置时组件配置不更新

com.aws.greengrass.authorization.exceptions.AuthorizationException: Duplicate policy ID "<id>" for principal "<componentList>"

如果多个 IPC 授权策略(包括核心设备上的所有组件)使用相同的策略 ID,则可能会看到此错误。

检查组件的 IPC 授权策略,修复所有重复项,然后重试。要创建唯一的策略 ID,我们建议您将组件名称、IPC 服务名称和计数器结合起来。有关更多信息,请参阅授权组件执行 IPC 操作

提示

如果您更改了组件配方DefaultConfiguration中的,则必须将该组件的配置重置为其新的默认配置。部署组件时,将单个空字符串指定为重置更新。有关更多信息,请参阅更改默认配置时组件配置不更新

com.aws.greengrass.tes.CredentialRequestHandler: Error in retrieving AwsCredentials from TES (HTTP 400)

当核心设备无法从令牌交换服务获取Amazon凭证时,您可能会看到此错误。HTTP 400 状态代码表明,之所以发生此错误,是因为核心设备的代币交换 IAM 角色不存在或不存在允许Amazon IoT证书提供者担任该角色的信任关系。

执行以下操作:

  1. 确定核心设备使用的令牌交换角色。错误消息包括核心设备的Amazon IoT角色别名,该别名指向代币交换角色。在开发计算机上运行以下命令,并MyGreengrassCoreTokenExchangeRoleAlias用错误消息中的Amazon IoT角色别名名称替换。

    aws iot describe-role-alias --role-alias MyGreengrassCoreTokenExchangeRoleAlias

    响应包括代币交换 IAM 角色的 Amazon 资源名称 (ARN)。

    { "roleAliasDescription": { "roleAlias": "MyGreengrassCoreTokenExchangeRoleAlias", "roleAliasArn": "arn:aws:iot:us-west-2:123456789012:rolealias/MyGreengrassCoreTokenExchangeRoleAlias", "roleArn": "arn:aws:iam::123456789012:role/MyGreengrassV2TokenExchangeRole", "owner": "123456789012", "credentialDurationSeconds": 3600, "creationDate": "2021-02-05T16:46:18.042000-08:00", "lastModifiedDate": "2021-02-05T16:46:18.042000-08:00" } }
  2. 检查该角色是否存在。运行以下命令,将 MyGreengrassV2TokenExchangeRole 替换为令牌交换角色的名称。

    aws iam get-role --role-name MyGreengrassV2TokenExchangeRole

    如果命令返回NoSuchEntity错误,则该角色不存在,您必须创建该角色。有关如何创建和配置该角色的更多信息,请参阅授权核心设备与Amazon服务

  3. 检查角色是否具有信任关系,以允许Amazon IoT凭证提供者代入该角色。上一步的响应包含一个AssumeRolePolicyDocument,用于定义角色的信任关系。该角色必须定义允许承担该角色credentials.iot.amazonaws.com的信任关系。此文档应类似于以下示例。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "credentials.iot.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

    如果角色的信任关系不credentials.iot.amazonaws.com允许代入该角色,则必须将此信任关系添加到该角色中。有关更多信息,请参阅《Amazon Identity and Access Management用户指南》中的修改角色

com.aws.greengrass.tes.CredentialRequestHandler: Error in retrieving AwsCredentials from TES (HTTP 403)

当核心设备无法从令牌交换服务获取Amazon凭证时,您可能会看到此错误。HTTP 403 状态代码表明,之所以发生此错误,是因为核心设备的Amazon IoT策略没有为核心设备的Amazon IoT角色别名授予iot:AssumeRoleWithCertificate权限。

查看核心设备的Amazon IoT策略,并为核心设备的Amazon IoT角色别名添加iot:AssumeRoleWithCertificate权限。错误消息包括核心设备的当前Amazon IoT角色别名。有关此权限以及如何更新核心设备Amazon IoT策略的更多信息,请参阅Amazon IoT Greengrass V2核心设备的最低Amazon IoT政策更新核心设备的Amazon IoT政策

com.aws.greengrass.tes.CredentialsProviderError: Could not load credentials from any providers

当组件尝试请求Amazon凭证但无法连接到令牌交换服务时,您可能会看到此错误。

执行以下操作:

  • 检查该组件是否声明了对令牌交换服务组件的依赖关系aws.greengrass.TokenExchangeService。如果不是,请添加依赖项并重新部署组件。

  • 如果组件在 docker 中运行,请确保应用正确的网络设置和环境变量使用AmazonDocker 容器组件 (Linux) 中的凭据

  • 如果组件是用 NodeJ S 编写的,请设置 dns。 setDefaultResult订购ipv4first

  • 检查是否有/etc/hosts以开头::1和包含的条目localhost。删除该条目以查看它是否导致组件连接到错误的地址的令牌交换服务。

Received error when attempting to retrieve ECS metadata: Could not connect to the endpoint URL: "<tokenExchangeServiceEndpoint>"

当组件未运行令牌交换服务并且组件尝试请求Amazon证书时,您可能会看到此错误。

执行以下操作:

  • 检查该组件是否声明了对令牌交换服务组件的依赖关系aws.greengrass.TokenExchangeService。如果不是,请添加依赖项并重新部署组件。

  • 检查组件在其install生命周期中是否使用Amazon证书。 Amazon IoT Greengrass不保证代币交换服务在install生命周期内的可用性。更新组件,将使用Amazon证书的代码移至startuprun生命周期,然后重新部署该组件。

copyFrom: <configurationPath> is already a container, not a leaf

当您将配置值从容器类型(列表或对象)更改为非容器类型(字符串、数字或布尔值)时,您可能会看到此错误。执行以下操作:

  1. 检查组件的配方,看看其默认配置是将该配置值设置为列表还是对象。如果是,请删除或更改该配置值。

  2. 创建部署以将该配置值重置为其默认值。有关更多信息,请参阅 创建部署更新组件配置

然后,您可以将该配置值设置为字符串、数字或布尔值。

com.aws.greengrass.componentmanager.plugins.docker.exceptions.DockerLoginException: Error logging into the registry using credentials - 'The stub received bad data.'

Docker 应用程序管理器组件尝试从亚马逊Elastic Container Registry (Amazon ECR) 的私有存储库下载 Docker 镜像时,您可能会在 Greengrass 核心日志中看到此错误。如果您使用wincred Docker 凭证帮助器 (docker-credential-wincred),则会发生此错误。因此,Amazon ECR 无法存储登录凭证。

执行以下之一:

  • 如果您不使用wincred Docker 凭证帮助器,请将该docker-credential-wincred程序从核心设备中删除。

  • 如果您使用wincred Docker 凭证帮助器,请执行以下操作:

    1. 重命名核心设备上的docker-credential-wincred程序。wincred替换为 Windows Docker 凭证助手的新名称。例如,您可以将其重命名为docker-credential-wincredreal

    2. 更新 Docker 配置文件 (.docker/config.json) 中的credsStore选项,使用 Windows Docker 凭证帮助器的新名称。例如,如果您将程序重命名为docker-credential-wincredreal,则将credsStore选项更新为wincredreal

      { "credsStore": "wincredreal" }

java.io.IOException: Cannot run program "cmd" ...: [LogonUser] The password for this account has expired.

当运行组件进程(例如)的系统用户的密码已过期时,您可能会在 Windows 核心设备上看到此错误。ggc_user因此,Amazon IoT GreengrassCore 软件无法以该系统用户的身份运行组件进程。

更新 Greengrass 系统用户的密码
  1. 以管理员身份运行以下命令以设置用户的密码。将 ggc_user 替换为系统用户,将密码替换为要设置的密码。

    net user ggc_user password
  2. 使用该PsExec 实用程序将用户的新密码存储在该 LocalSystem 帐户的凭据管理器实例中。用您设置的用户密码替换密码。

    psexec -s cmd /c cmdkey /generic:ggc_user /user:ggc_user /pass:password
提示

根据您的 Windows 配置,用户的密码可能会设置为在将future 某个日期过期。为确保您的 Greengrass 应用程序继续运行,请跟踪密码何时过期,并在密码过期之前进行更新。您也可以将用户的密码设置为永不过期。

  • 要检查用户及其密码何时过期,请运行以下命令。

    net user ggc_user | findstr /C:expires
  • 要将用户的密码设置为永不过期,请运行以下命令。

    wmic UserAccount where "Name='ggc_user'" set PasswordExpires=False

aws.greengrass.StreamManager: Instant exceeds minimum or maximum instant

将流管理器 v2.0.7 升级到 v2.0.8 和 v2.0.11 之间的版本时,如果该组件无法启动,则可能会在流管理器组件的日志中看到以下错误。

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}

如果您部署了 stream manager v2.0.7 并且想要升级到更高版本,则必须直接升级到 stream manager v2.0.12。有关流管理器组件的更多信息,请参阅流管理器

核心设备 Lambda 函数组件问题

解决核心设备上的 Lambda 函数组件问题。

The following cgroup subsystems are not mounted: devices, memory

在以下情况下运行容器化 Lambda 函数时,您可能会看到此错误:

  • 核心设备没有为内存或设备 cgroup 启用 cgroup v1。

  • 核心设备启用了 cgroups v2。Greengrass Lambda 函数需要 cgroups v1,而 cgroups v1 和 v2 是相互排斥的。

要启用 cgroups v1,请使用以下 Linux 内核参数启动设备。

cgroup_enable=memory cgroup_memory=1 systemd.unified_cgroup_hierarchy=0
提示

在 Raspberry Pi 上,编辑/boot/cmdline.txt文件以设置设备的内核参数。

ipc_client.py:64,HTTP Error 400:Bad Request, b'No subscription exists for the source <label-or-lambda-arn> and subject <label-or-lambda-arn>

当您在 V2Amazon IoT Greengrass 核心设备上运行使用 Core SDK 的 V1 Lambda 函数时,您可能会看到此错误,但未在传统订阅路由器组件中指定订阅。要修复此问题,请部署和配置旧版订阅路由器以指定所需的订阅。有关更多信息,请参阅导入 V1 Lambda 函数

组件版本已停产

当核心设备上的组件版本停产时,你可能会在Personal Health Dashboard (PHD) 上看到一条通知。组件版本在停产后的 60 分钟内将此通知发送给您的 PHD。

要查看需要修改哪些部署,请使用以下命令执行以下操作Amazon Command Line Interface:

  1. 运行以下命令以获取核心设备的列表。

    aws greengrassv2 list-core-devices
  2. 运行以下命令以检索步骤 1 中的每个步骤之一。coreDeviceName替换为要查询的每个核心设备的名称。

    aws greengrassv2 list-installed-components --core-device-thing-name coreDeviceName
  3. 收集在先前步骤中安装的已停产组件版本的核心设备。

  4. 运行以下命令以检索步骤 3 中的每个步骤以检索步骤 3。coreDeviceName替换为要查询的核心设备的名称。

    aws greengrassv2 list-effective-deployments --core-device-thing-name coreDeviceName

    响应包含核心设备的部署任务列表。您可以修改部署以选择其他组件版本。有关如何修改部署的更多信息,请参阅修改部署

Greengrass 命令行界面问题

排查G reengrass

java.lang.RuntimeException: Unable to create ipc client

当您运行 Greengrass CLI 命令并指定与安装Amazon IoT Greengrass核心软件的根文件夹不同的根文件夹时,您可能会看到此错误。

执行以下任一操作来设置根路径,然后将 /greengrass/v2 替换为Amazon IoT Greengrass Core 软件安装路径:

  • GGC_ROOT_PATH 环境变量设置为 /greengrass/v2

  • --ggcRootPath /greengrass/v2参数添加到您的命令,如以下示例所示。

    greengrass-cli --ggcRootPath /greengrass/v2 <command> <subcommand> [arguments]

Amazon Command Line Interface问题

对Amazon CLI的问题进行故障排除Amazon IoT Greengrass V2。

Error: Invalid choice: 'greengrassv2'

当您使用Amazon CLI(例如aws greengrassv2 list-core-devices)运行Amazon IoT Greengrass V2命令时,可能会看到此错误。

此错误表示您的版本Amazon CLI不支持Amazon IoT Greengrass V2。要Amazon IoT Greengrass V2与一起使用Amazon CLI,必须具有以下版本之一或更高版本:

  • Amazon CLIV1 最低版本:v1.18.197

  • Amazon CLIV2 最低版本:v2.1.11

提示

您可以运行以下命令来检查您所Amazon CLI拥有的版本。

aws --version

要解决此问题,请将更新Amazon CLI到支持的更高版本Amazon IoT Greengrass V2。有关更多信息,请参阅Amazon Command Line Interface用户指南Amazon CLI中的安装、更新和卸载