Fleet Provisioning后设备注册为IoT Thing但未注册为Greengrass Core
问题描述
执行GreenGrass Fleet Provisioning流程后,设备已在AWS IoT平台注册为IoT Thing,但未被成功注册为GreenGrass Core设备。在已启用TCP连接的EC2实例、RPi Zero设备上分别部署验证,两类环境均复现该问题。查看/greengrass/v2/logs/greengrass.log路径下的日志,观测到如下MQTT相关错误:
// EC2实例日志 2022-06-24T05:22:27.557Z [WARN] (pool-2-thread-9) com.aws.greengrass.deployment.IotJobsHelper: No connection available during subscribing to Iot Jobs descriptions topic. Will retry in sometime. {ThingName=ec2_gg_thing_test} 2022-06-24T05:22:35.268Z [ERROR] (pool-2-thread-1) com.aws.greengrass.mqttclient.MqttClient: Error subscribing. {topic=$aws/things/ec2_gg_thing_test/shadow/name/AWSManagedGreengrassV2Deployment/update/accepted} 2022-06-24T05:22:35.269Z [WARN] (pool-2-thread-1) com.aws.greengrass.deployment.ShadowDeploymentListener: Caught exception while subscribing to shadow topics, will retry shortly. {} // RPi Zero日志 2022-06-24T05:25:20.883Z [WARN] (pool-2-thread-11) com.aws.greengrass.deployment.IotJobsHelper: No connection available during subscribing to Iot Jobs descriptions topic. Will retry in sometime. {ThingName=rpiZero} 2022-06-24T05:26:10.037Z [ERROR] (pool-2-thread-10) com.aws.greengrass.mqttclient.MqttClient: Error subscribing. {topic=$aws/things/rpiZero/shadow/name/AWSManagedGreengrassV2Deployment/update/accepted} 2022-06-24T05:26:10.043Z [WARN] (pool-2-thread-10) com.aws.greengrass.deployment.ShadowDeploymentListener: Caught exception while subscribing to shadow topics, will retry shortly. {}
补充配置信息如下:
部署执行的启动命令:
sudo -E java -Droot=/greengrass/v2 -Dlog.store=FILE \ -jar /GreengrassInstaller/lib/Greengrass.jar \ --trusted-plugin /GreengrassInstaller/FleetProvisioningByClaim.jar \ --init-config /GreengrassInstaller/config.yaml \ --component-default-user ggc_user:ggc_group \ --setup-system-service true
部署使用的/GreengrassInstaller/config.yaml内容:
--- services: aws.greengrass.Nucleus: version: "2.5.6" aws.greengrass.FleetProvisioningByClaim: configuration: rootPath: "greengrass/v2" awsRegion: "us-west-2" iotDataEndpoint: "<data-endpoint>-ats.iot.us-west-2.amazonaws.com" iotCredentialEndpoint: "<credentials-endpoint>.credentials.iot.us-west-2.amazonaws.com" iotRoleAlias: "GGProvisionTest_TokenExchange_RoleAlias" provisioningTemplate: "GGProvisionTest_Template" claimCertificatePath: "greengrass/v2/claim-certs/claim.pem.crt" claimCertificatePrivateKeyPath: "greengrass/v2/claim-certs/claim.private.pem.key" rootCaPath: "greengrass/v2/AmazonRootCA1.pem" templateParameters: ThingName: "<thingName>" ThingGroupName: "<thingGroup>"
可能原因
- 配置文件路径格式错误。所有资源路径均使用相对路径(未以
/开头),Fleet Provisioning插件启动时无法定位到根目录、Claim证书、私钥、RootCA文件,导致TLS握手失败,MQTT连接无法建立,这是两类不同设备同时复现问题的最常见诱因。 - 端点配置未替换占位符。配置中
iotDataEndpoint、iotCredentialEndpoint保留了<data-endpoint>、<credentials-endpoint>占位符,未填充账号下实际的IoT端点地址,设备无法连接到AWS IoT服务端。 - Fleet Provisioning模板权限缺失。模板未配置
AttachPolicy逻辑,或绑定的IoT策略缺少MQTT连接、主题订阅相关权限,设备完成Thing注册后,持有的设备证书无权限访问IoT Core的MQTT服务,导致订阅被拒绝。 - 证书文件权限配置错误。Greengrass运行用户
ggc_user没有Claim证书、私钥、RootCA文件的读取权限,TLS握手阶段无法加载证书材料,连接建立失败。 - 出站网络访问被拦截。设备本地防火墙、VPC安全组/ACL规则阻止了到IoT端点8883端口(MQTT over TLS)的出站访问,导致连接超时。
排查与修复步骤
- 修正所有路径为绝对路径
将配置文件中所有路径补全根前缀,修正后配置片段如下:
rootPath: "/greengrass/v2" claimCertificatePath: "/greengrass/v2/claim-certs/claim.pem.crt" claimCertificatePrivateKeyPath: "/greengrass/v2/claim-certs/claim.private.pem.key" rootCaPath: "/greengrass/v2/AmazonRootCA1.pem"
- 替换端点占位符为实际值
通过控制台或CLI获取账号下的真实IoT端点:
- 数据端点:执行
aws iot describe-endpoint --endpoint-type iot:Data-ATS获取,替换<data-endpoint>部分 - 凭证端点:执行
aws iot describe-endpoint --endpoint-type iot:CredentialProvider获取,替换<credentials-endpoint>部分
确保配置中不存在尖括号包裹的占位符内容。
- 校验Fleet Provisioning模板权限
打开AWS IoT控制台对应预置模板,确认模板配置了AttachPolicy操作,且绑定的IoT策略至少包含以下权限:
- 允许客户端以Thing名称为ClientId发起MQTT连接
- 允许订阅、接收自身Thing下的Jobs、Shadow相关主题
- 允许读取、更新自身Thing的Shadow数据
- 修复证书文件权限
执行以下命令给Greengrass运行用户授予证书文件的读权限:
sudo chown -R ggc_user:ggc_group /greengrass/v2/claim-certs/ sudo chown ggc_user:ggc_group /greengrass/v2/AmazonRootCA1.pem sudo chmod 600 /greengrass/v2/claim-certs/* /greengrass/v2/AmazonRootCA1.pem
- 清理残留后重新部署
停止Greengrass服务,删除之前失败部署生成的残留文件(注意提前备份claim-certs目录和RootCA文件,不要删除这两个资源),重新执行安装启动命令,观察日志中是否出现MQTT连接成功、主题订阅成功的记录。 - 网络连通性校验
在设备上执行telnet <替换后的数据端点地址> 8883,确认8883端口出站连通正常,若连通失败则检查本地防火墙、安全组规则放通对应端口的出站访问。
内容的提问来源于stack exchange,提问作者Hugo Arganda
相关产品推荐
相关产品推荐

