故障排除 AWS IoT Greengrass V2 - AWS IoT Greengrass

故障排除 AWS IoT Greengrass V2

使用本节中的故障排除信息和解决方案可帮助解决 AWS IoT Greengrass Version 2 的问题。

查看 AWS IoT Greengrass Core 软件和组件日志

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

AWS IoT Greengrass Core 软件问题

排查 AWS IoT Greengrass Core 软件问题。

主题

无法设置核心设备

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

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

如果 AWS IoT Greengrass Core 软件无法启动,请检查系统服务日志以确定问题。一个常见问题是 PATH 环境变量(Linux)或 PATH 系统变量(Windows)中没有 Java。

无法将 Nucleus 设置为系统服务

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

请执行以下操作之一:

无法连接至 AWS IoT Core

例如,当 AWS IoT Greengrass Core 软件无法连接 AWS IoT Core 以检索部署任务时,可能会出现此错误。执行以下操作:

  • 检查您的核心设备是否可以连接互联网和 AWS IoT Core。有关您的设备连接的 AWS IoT Core 端点的更多信息,请参阅 配置 AWS IoT Greengrass Core 软件

  • 检查您的核心设备 AWS IoT 事物是否使用了允许 iot:Connectiot:Publishiot:Receiveiot:Subscribe 权限的证书。

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

内存不足错误

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

无法安装 Greengrass CLI

您在 AWS IoT Greengrass Core 的安装命令中使用 --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

如果运行 AWS 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 Nucleus 以指定运行组件的默认系统用户。有关更多信息,请参阅配置运行组件的用户配置默认组件用户

Failed to map segment from shared object: operation not permitted

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

请执行以下操作之一:

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

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

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

Windows 服务设置失败

如果您在 Microsoft Windows 2016 设备上安装 AWS IoT Greengrass Core 软件,则可能会出现此错误。Windows 2016 不支持 AWS IoT Greengrass Core 软件,有关支持的操作系统的列表,请参阅 支持的平台

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

  1. 解压缩已下载的 AWS 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)文件的情况下安装 AWS 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 根文件。有关更多信息,请参阅 安装 AWS IoT Greengrass Core 软件

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

当核心设备无法连接 AWS IoT Core 以订阅部署作业通知时,可能会出现此警告消息。执行以下操作:

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

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

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

当您安装具有自动预置功能的 AWS IoT Greengrass Core 软件时,如果安装程序使用的 AWS 会话令牌无效,则可能会出现此错误。执行以下操作:

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

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

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

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

      aws_session_token = AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4Olgk

您也可以在不提供 AWS 凭证的情况下安装 AWS IoT Greengrass Core 软件。有关更多信息,请参阅通过手动资源预置安装 AWS IoT Greengrass Core 软件通过 AWS IoT 实例集预置安装 AWS IoT Greengrass Core 软件

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

当您安装具有自动预置功能的 AWS IoT Greengrass Core 软件时,如果安装程序使用的 AWS 凭证不具备所需权限,则可能会出现此错误。有关所需权限的更多信息,请参阅安装程序配置资源的最低 IAM 策略

检查凭证的 IAM 身份权限,并授予 IAM 身份任何缺失的所需权限。

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

当您使用影子管理器组件AWS IoT Core 同步设备影子时,可能会出现此错误。HTTP 403 状态码表示出现此错误是因为核心设备的 AWS 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)

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

  • iot:GetThingShadow

  • iot:UpdateThingShadow

  • iot:DeleteThingShadow

检查核心设备的 AWS IoT 策略,并添加任何缺失的所需权限。有关更多信息,请参阅下列内容:

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

当您在自定义 Greengrass 组件中使用进程间通信(IPC)操作时,如果核心设备上未安装 AWS 提供的所需组件,则可能会出现此错误。

要解决此问题,请在组件配方中添加所需组件作为依赖关系,这样 AWS 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 提供程序组件无法找到或加载您在将 AWS IoT Greengrass Core 软件配置为使用硬件安全模块(HSM)时指定的私钥或证书,则可能会出现此错误。执行以下操作:

  • 使用配置 AWS IoT Greengrass Core 软件以使用的槽位、用户 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>

当您使用密钥管理器组件部署 AWS Secrets Manager 密钥时,可能会出现此错误。如果核心设备的令牌交换 IAM 角色未授予获取密钥的权限,则部署失败且 Greengrass 日志中包含此错误。

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

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

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

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

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

    • 重新启动 AWS IoT Greengrass Core 软件以重新尝试部署。有关更多信息,请参阅 运行 AWS IoT Greengrass Core 软件

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

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

当您使用密钥管理器组件部署通过 AWS Key Management Service 密钥加密的 AWS Secrets Manager 密钥时,可能会出现此错误。如果核心设备的令牌交换 IAM 角色未授予解密密钥的权限,则部署失败且 Greengrass 日志中包含此错误。

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

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

当您尝试安装满足硬件安全条件的 AWS IoT Greengrass Core 软件时,如果使用不支持硬件安全集成的早期 Greengrass Nucleus 版本,则可能会出现此错误。要使用硬件安全集成,必须使用 Greengrass Nucleus v2.5.3 或更高版本。

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

当您使用 TPM2 库时,如果将 AWS IoT Greengrass Core 作为系统服务运行,则可能会出现此错误。

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

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

Greengrass core device stuck on nucleus v2.12.3

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

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

    Linux or Unix
    sudo systemctl stop greengrass
    Windows Command Prompt (CMD)
    sc stop "greengrass"
    PowerShell
    Stop-Service -Name "greengrass"
  2. 在您的核心设备上,将 AWS 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. 将 AWS 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"

AWS IoT Greengrass 云问题

使用以下信息帮助排查 AWS 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

当您通过 AWS IoT Greengrass 控制台或 CreateComponentVersion 操作创建组件版本时,可能会出现此错误。

此错误表明您的配方并非有效 JSON 或 YAML。请检查配方的语法,修复所有语法问题,然后再次尝试。您可以使用在线 JSON 或 YAML 语法检查器来识别配方中的语法问题。

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

当您通过 AWS IoT Greengrass 控制台或 CreateComponentVersion 操作创建组件版本时,可能会出现此错误。此错误表明组件配方中的 S3 构件无效。

执行以下操作:

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

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

  • 检查您的 AWS 账户 是否有权通过其 S3 对象 URL 访问该构件。

INACTIVE deployment status

当您在没有所需的依赖 AWS IoT 策略的情况下调用 ListDeployments API 时,可能会出现 INACTIVE 部署状态。您必须具有所需权限才能获得准确的部署状态。您可以在由 AWS IoT Greengrass V2 定义的操作中,按照 ListDeployments 所需的权限找到相关操作。如果没有所需的依赖 AWS IoT 权限,您仍然可以看到部署状态,但可能会看到不准确的 INACTIVE 部署状态。

核心设备部署问题

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

主题

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

当核心设备应用部署时,若 AWS IoT Greengrass Core 软件无法下载组件构件,则可能会出现此错误。该错误导致部署失败。

当您收到此错误时,日志中还会包含可用于识别具体问题的堆栈跟踪。以下每个条目都与您可能在 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 相匹配。

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

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

当核心设备无权调用 s3:GetBucketLocation 时,PackageDownloadException 错误可能包含此堆栈跟踪。该错误消息包括以下消息。

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.

当核心设备应用部署时,若 AWS IoT Greengrass Core 软件无法下载组件构件,则可能会出现此错误。部署失败的原因是下载的构件文件的校验和与 AWS 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>

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

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

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

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

  • 有符合版本要求的组件版本,但都无法与核心设备平台兼容。

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

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

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

当您将组件部署至核心设备时,如果该组件未列出与核心设备平台兼容的平台,则可能会出现此错误。请执行以下操作之一:

  • 如果该组件为自定义 Greengrass 组件,则可以更新该组件以使其与核心设备兼容。添加与核心设备平台匹配的新清单,或更新现有清单以匹配核心设备平台。有关更多信息,请参阅 AWS IoT Greengrass 组件配方参考

  • 如果组件由 AWS 提供,请检查该组件的另一个版本是否与核心设备兼容。如果没有兼容的版本,请在 AWS re:Post 上使用 AWS IoT Greengrass 标签联系我们,或联系 AWS Support

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

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

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

  • 修改部署以指定 Greengrass Nucleus 的更高次要版本。如果选择此选项,您还须更新 AWS 提供的所有依赖于 Greengrass Nucleus 特定次要版本的组件版本。有关更多信息,请参阅 AWS 提供的组件

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 Nucleus 的 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(适用于以事物组为目标的部署)的大型部署文档时,可能会出现此错误。要检索大型部署文档,核心设备的 AWS IoT 策略必须允许 greengrass:GetDeploymentConfiguration 权限。核心设备没有此权限时可能会发生此错误。发生此错误时,部署将无限期重试,且状态为进行中 (IN_PROGRESS)。

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

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

当核心设备收到部署时,如果核心设备的 AWS IoT 策略不允许 greengrass:ListThingGroupsForCoreDevice 权限,则可能会出现此错误。创建部署时,核心设备使用此权限来识别其事物组,并移除核心设备所在事物组的组件。如果核心设备运行 Greengrass Nucleus v2.5.0,则部署失败。如果核心设备运行 Greengrass Nucleus v2.5.1 或更高版本,则部署会继续进行,但不会移除组件。有关事物组移除行为的更多信息,请参阅将 AWS IoT Greengrass 组件部署至设备

要更新核心设备的行为以移除核心设备所在事物组的组件,请将 greengrass:ListThingGroupsForCoreDevice 权限添加至核心设备的 AWS IoT 策略中。有关更多信息,请参阅 更新核心设备的 AWS 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。要创建权限策略,请按照以下说明进行操作:创建 AWS IoT 策略

核心设备组件问题

排查核心设备上的 Greengrasss 组件问题。

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

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

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

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

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

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

Python 脚本不记录消息

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

  • 使用 -u 参数运行 Python 以禁用 stdoutstderr 上的缓冲。

    Linux or Unix
    python3 -u hello_world.py
    Windows
    py -3 -u hello_world.py
  • 在组件配方中使用 SetenvPYTHONUNBUFFERED 环境变量设置为非空字符串。此环境变量禁用 stdoutstderr 上的缓冲。

  • 刷新 stdoutstderr 流的缓冲区。请执行以下操作之一:

    • 打印时刷新消息。

      import sys print('Hello, error!', file=sys.stderr, flush=True)
    • 打印后刷新消息。在刷新流之前,您可以发送多条消息。

      import sys print('Hello, error!', file=sys.stderr) sys.stderr.flush()

有关如何验证 Python 脚本是否输出日志消息的更多信息,请参阅 监控 AWS IoT Greengrass 日志

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

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

Console
重置路径
[""]
AWS 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 操作时,您可能会在组件日志中看到此错误。要授予组件调用 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)

当核心设备无法从令牌交换服务中获取 AWS 凭证时,可能会出现此错误。HTTP 400 状态代码表示出现此错误是因为核心设备的令牌交换 IAM 角色不存在或不具备允许 AWS IoT 凭证提供程序承担该角色的信任关系。

执行以下操作:

  1. 确定核心设备使用的令牌交换角色。错误消息包括核心设备的 AWS IoT 角色别名,该别名指向令牌交换角色。在开发计算机上运行以下命令,然后将 MyGreengrassCoreTokenExchangeRoleAlias 替换为错误消息中的 AWS 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 错误,则该角色不存在,您必须进行创建。有关如何创建和配置该角色的更多信息,请参阅 授权核心设备与 AWS 服务交互

  3. 检查角色是否存在允许 AWS 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 承担该角色,则必须将此信任关系添加至角色。有关更多信息,请参阅《AWS Identity and Access Management 用户指南》中的修改角色

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

当核心设备无法从令牌交换服务中获取 AWS 凭证时,可能会出现此错误。HTTP 403 状态代码表示出现此错误是因为核心设备的 AWS IoT 策略未授予核心设备 AWS IoT 角色别名的 iot:AssumeRoleWithCertificate 权限。

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

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

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

执行以下操作:

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

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

  • 如果组件是用 NodeJS 编写的,请将 dns.setDefaultResultOrder 设置为 ipv4first

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

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

如果组件未运行令牌交换服务而尝试请求 AWS 凭证,则可能会出现此错误。

执行以下操作:

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

  • 检查组件是否在其 install 生命周期中使用 AWS 凭证。AWS IoT Greengrass 并不能保证令牌交换服务在 install 生命周期中的可用性。更新组件以将使用 AWS 凭证的代码移至 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 应用程序管理器组件尝试从 Amazon Elastic Container Registry(Amazon ECR)的私有存储库下载 Docker 映像时,您可能会在 Greengrass Nucleus 日志中看到这个错误。如果您使用 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.

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

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

    net user ggc_user password
  2. 使用 PsExec 实用程序将用户的新密码存储在 LocalSystem 账户的 Credential Manager 实例中。将 password 替换为您设置的用户密码。

    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 函数时,可能会出现此错误:

  • 核心设备没有为内存或设备 cgroups 启用 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 核心设备上运行使用 AWS IoT Greengrass Core SDK 的 V1 Lambda 函数时,如果没有在旧版订阅路由器组件中指定订阅,则可能会出现此错误。要解决此问题,请部署和配置旧版订阅路由器以指定所需订阅。有关更多信息,请参阅 导入 V1 Lambda 函数

组件版本已停用

如果核心设备上的某个组件版本停用,您可能会在 Personal Health Dashboard(PHD)上看到通知。组件版本将在停用后的 60 分钟内将此通知发送给您的 PHD。

要查看需要修改哪些部署,请使用 AWS 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 命令行界面问题

排查 Greengrass CLI 的问题。

java.lang.RuntimeException: Unable to create ipc client

当您运行 Greengrass CLI 命令并指定与安装 AWS IoT Greengrass Core 软件的根文件夹不同的根文件夹时,可能会出现此错误。

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

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

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

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

AWS Command Line Interface 问题

排查 AWS IoT Greengrass V2 的 AWS CLI 问题。

Error: Invalid choice: 'greengrassv2'

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

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

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

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

提示

您可以运行以下命令以核查您所拥有的 AWS CLI 版本。

aws --version

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