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

Amazon IoT Greengrass 核心软件问题

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

主题

无法设置核心设备

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

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

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

无法将 nucleus 设置为系统服务

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

请执行以下操作之一:

无法连接到 Amazon IoT Core

例如,当 Amazon IoT Greengrass Core 软件无法连接 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

当你在 C Amazon IoT Greengrass ore 的安装命令中使用--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

当运行 C Amazon IoT Greengrass ore 软件的用户(通常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 nucleus 以指定运行组件的默认系统用户。有关更多信息,请参阅 配置运行组件的用户配置默认组件用户

Failed to map segment from shared object: operation not permitted

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

请执行以下操作之一:

  • 运行以下命令以重新安装具有exec权限/tmp的文件夹,然后重试。

    sudo mount -o remount,exec /tmp
  • 如果你运行 Greengrass nucleus v2.5.0 或更高版本,则可以设置 JVM 选项来更改 CRT 库使用的文件夹。 Amazon 您可以在部署中或安装核心软件时在 Greengrass 核心组件配置中指定jvmOptions参数。 Amazon IoT Greengrass 将 /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) 文件的情况下安装 C Amazon IoT Greengrass ore 软件时,您可能会看到此错误。

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 ,您可能会看到此警告消息。执行以下操作:

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

  • 查看 Greengrass 日志中是否有其他能揭示其他根本原因的错误。

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

当您安装具有自动配置功能的 Amazon IoT Greengrass Core 软件时,您可能会看到此错误,而安装程序使用的 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 Core 软件安装具有 Amazon IoT 队列配置功能的 C Amazon IoT Greengrass ore 软件

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

安装具有自动配置功能的 Amazon IoT Greengrass Core 软件时,您可能会看到此错误,而安装程序使用的 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 提供程序组件无法找到或加载您在将 C Amazon IoT Greengrass ore 软件配置为使用硬件安全模块 (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. 将部署重新应用于核心设备。请执行以下操作之一:

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

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

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

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

当你将 C Amazon IoT Greengrass ore 作为系统服务运行时,使用 TPM2 库时,你可能会看到这个错误。

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

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

Greengrass core device stuck on nucleus v2.12.3

如果您的 Greengrass 核心设备无法从 nucleus 版本 2.12.3 修改您的部署,则可能需要下载该文件并将其替换为 Greengrass nucleus 版本 2.12.2。Greengrass.jar执行以下操作:

  1. 在你的 Greengrass 核心设备上,运行以下命令停止 Greengrass Core 软件。

    Linux or Unix
    sudo systemctl stop greengrass
    Windows Command Prompt (CMD)
    sc stop "greengrass"
    PowerShell
    Stop-Service -Name "greengrass"
  2. 在您的核心设备上,将 Amazon IoT Greengrass 软件下载到名为的文件中greengrass-2.12.2.zip

    Linux or Unix
    curl -s https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-2.12.2.zip > greengrass-2.12.2.zip
    Windows Command Prompt (CMD)
    curl -s https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-2.12.2.zip > greengrass-2.12.2.zip
    PowerShell
    iwr -Uri https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-2.12.2.zip -OutFile greengrass-2.12.2.zip
  3. 将 Amazon IoT Greengrass Core 软件解压缩到设备上的某个文件夹。GreengrassInstaller替换为要使用的文件夹。

    Linux or Unix
    unzip greengrass-2.12.2.zip -d GreengrassInstaller && rm greengrass-2.12.2.zip
    Windows Command Prompt (CMD)
    mkdir GreengrassInstaller && tar -xf greengrass-2.12.2.zip -C GreengrassInstaller && del greengrass-2.12.2.zip
    PowerShell
    Expand-Archive -Path greengrass-2.12.2.zip -DestinationPath .\\GreengrassInstaller rm greengrass-2.12.2.zip
  4. 运行以下命令,使用 nucleus 版本 2.12.2 Greengrass JAR 文件覆盖 nucleus 版本 2.12.3 Greengrass JAR 文件。

    Linux or Unix
    sudo cp ./GreengrassInstaller/lib/Greengrass.jar /greengrass/v2/packages/artifacts-unarchived/aws.greengrass.Nucleus/2.12.3/aws.greengrass.nucleus/lib
    Windows Command Prompt (CMD)
    robocopy ./GreengrassInstaller/lib/Greengrass.jar /greengrass/v2/packages/artifacts-unarchived/aws.greengrass.Nucleus/2.12.3/aws.greengrass.nucleus/lib /E
    PowerShell
    cp -Path ./GreengrassInstaller/lib/Greengrass.jar -Destination /greengrass/v2/packages/artifacts-unarchived/aws.greengrass.Nucleus/2.12.3/aws.greengrass.nucleus/lib
  5. 运行以下命令启动 Greengrass Core 软件。

    Linux or Unix
    sudo systemctl start greengrass
    Windows Command Prompt (CMD)
    sc start "greengrass"
    PowerShell
    Start-Service -Name "greengrass"

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 访问该项目。

INACTIVE deployment status

在没有必需的依赖 Amazon IoT 策略的情况下调用 ListDeploymentsAPI 时,您可能会获得INACTIVE部署状态。您必须拥有必要的权限才能获得准确的部署状态。您可以通过查看由定义的操作 Amazon IoT Greengrass V2并遵循所需的权限来找到相关操作ListDeployments。如果没有所需的依赖 Amazon IoT 权限,您仍然可以看到部署状态,但可能会看到不准确的部署状态INACTIVE

核心设备部署问题

对 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 Greengrass CLI 部署创建命令。

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 核心版本早于可用的最新次要版本时,您可能会看到此错误。出现此错误的原因是 Amazon IoT Greengrass Core 软件会尝试自动将组件更新到最新的兼容版本。但是, Amazon IoT Greengrass Core 软件会阻止 Greengrass 核更新到新的次要版本,因为提供的 Amazon几个组件依赖于 Greengrass 核的特定次要版本。有关更多信息,请参阅 Greengrass 核更新行为

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

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

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

Error: com.aws.greengrass.deployment.exceptions.DeploymentException: Unable to process deployment. Greengrass launch directory is not set up or Greengrass is not set up as a system service

当你将 Greengrass 设备从一个事物组移到另一个事物组,然后再移回需要重启 Greengrass 的部署的原始组时,你可能会看到这个错误。

要解决此问题,请重新创建设备的启动目录。我们还强烈建议升级到 Greengrass 核心的 2.9.6 或更高版本。

以下是用于重新创建启动目录的 Linux 脚本。将脚本保存在名为的文件中fix_directory.sh

#!/bin/bash set -e GG_ROOT=$1 GG_VERSION=$2 CURRENT="$GG_ROOT/alts/current" if [ ! -L "$CURRENT" ]; then mkdir -p $GG_ROOT/alts/directory_fix echo "Relinking $GG_ROOT/alts/directory_fix to $CURRENT" ln -sf $GG_ROOT/alts/directory_fix $CURRENT fi TARGET=$(readlink $CURRENT) if [[ ! -d "$TARGET" ]]; then echo "Creating directory: $TARGET" mkdir -p "$TARGET" fi DISTRO_LINK="$TARGET/distro" DISTRO="$GG_ROOT/packages/artifacts-unarchived/aws.greengrass.Nucleus/$GG_VERSION/aws.greengrass.nucleus/" echo "Relinking Nucleus artifacts to $DISTRO_LINK" ln -sf $DISTRO $DISTRO_LINK

要运行脚本,请执行以下命令:

[root@ip-172-31-27-165 ~]# ./fix_directory.sh /greengrass/v2 2.9.5 Relinking /greengrass/v2/alts/directory_fix to /greengrass/v2/alts/current Relinking Nucleus artifacts to /greengrass/v2/alts/directory_fix/distro

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有关如何解决此问题的更多信息,请参阅此疑难解答条目

Caused by: software.amazon.awssdk.services.greengrassv2data.model.GreengrassV2DataException: null (Service: GreengrassV2Data, Status Code: 403, Request ID: <some_request_id>, Extended Request ID: null)

当数据平面 API 没有iot:Connect权限时,你可能会看到此错误。如果您没有正确的保单,您将收到GreengrassV2DataException: 403. 要创建权限策略,请按照以下说明进行操作:创建 Amazon IoT 策略

核心设备组件问题

对核心设备上的 Greengrass 组件问题进行故障排除。

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

当 Core 软件无法在组件的生命周期脚本中运行命令时 Amazon IoT Greengrass ,您可能会在 Greengrass 组件的日志中看到此错误。由于此错误,组件的状态变BROKEN为。如果运行组件(例如)的系统用户在 P ATH 的文件夹中找不到该命令的可执行文件,则可能会发生此错误。ggc_user

在 Windows 设备上,检查包含可执行文件的文件夹是否位于运行该组件PATH的系统用户所在的文件夹中。如果中缺少它PATH,请执行以下任一操作:

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

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

  • 将可执行文件的文件夹添加到运行该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 角色的亚马逊资源名称 (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. 检查该角色是否存在。运行以下命令,将 MyGreengrassV2 TokenExchangeRole 替换为令牌交换角色的名称。

    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 凭据但无法连接到令牌交换服务时,您可能会看到此错误。

执行以下操作:

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) 的私有存储库下载 Dock er 镜像时,你可能会在 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 Greengrass Core 软件无法以该系统用户的身份运行组件进程。

更新 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 配置,用户的密码可能会设置为在将来的某个日期过期。为确保您的 Greengrass 应用程序继续运行,请跟踪密码何时过期,并在密码过期之前对其进行更新。您也可以将用户的密码设置为永不过期。

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

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

    wmic UserAccount where "Name='ggc_user'" set PasswordExpires=False
  • 如果你使用的是已弃用该wmic命令的 Windows 10 或更高版本,请运行以下 PowerShell 命令。

    Get-CimInstance -Query "SELECT * from Win32_UserAccount WHERE name = 'ggc_user'" | Set-CimInstance -Property @{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}

如果您部署了流管理器 v2.0.7 并且想要升级到更高版本,则必须直接升级到流管理器 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>

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

组件版本已停产

当核心设备上的某个组件版本停产时,你可能会在个人健康控制面板 (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 中每台核心设备的所有部署任务的状态。coreDeviceName替换为要查询的核心设备的名称。

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

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

Greengrass 命令行界面问题

使用 Greengr ass CLI 对问题进行故障排除。

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 IoT Greengrass V2 命令时 Amazon CLI (例如,aws greengrassv2 list-core-devices),你可能会看到这个错误。

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

  • Amazon CLI V1 最低版本:v1.18.197

  • Amazon CLI V2 最低版本:v2.1.11

提示

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

aws --version

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