AWS IoT Greengrass Version 1在 2023 年 6 月 30 日之前,将不再接收功能更新,并且将仅收到安全补丁和错误修复。有关更多信息,请参阅AWS IoT Greengrass V1维护时段。我们强烈建议您迁移到AWS IoT Greengrass Version 2,这增加了重要的新功能并支持其他平台。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
配置 AWS IoT Greengrass 核心
网络 ACL 和安全组都允许 (因此可到达您的实例) 的发起 ping 的AWS IoT Greengrass核心是AWS IoT在边缘环境中充当集线器或网关的事物(设备)。与其他 AWS IoT 设备一样,核心位于注册表中,具有设备影子,并使用设备证书在 AWS IoT Core 和 AWS IoT Greengrass 中进行身份验证。核心设备运行AWS IoT Greengrass核心软件,以使其可以管理 Greengrass 组的本地进程,如通信、影子同步和令牌交换。
AWS IoT Greengrass Core 软件提供了以下功能:
-
连接器和 Lambda 函数的部署和本地运行。
-
在本地处理数据流,并自动导出到AWS Cloud.
-
使用托管订阅通过本地网络在设备、连接器和 Lambda 函数之间进行的 MQTT 消息传递。
-
MQTTAWS IoT以及使用托管订阅的设备、连接器和 Lambda 函数。
-
确保设备和设备之间的安全连接AWS Cloud使用设备身份验证和授权。
-
设备的本地影子同步。影子可配置为与AWS Cloud.
-
对本地设备和卷资源的受控访问。
-
用于运行本地推理的云训练机器学习模型的部署。
-
使设备能够发现 Greengrass 核心设备的自动 IP 地址检测。
-
全新的或更新的组配置的集中部署。下载配置数据后,核心设备将自动重启。
-
保护, over-the-air (OTA) 用户定义的 Lambda 函数的软件更新。
-
本地密钥的安全、加密的存储以及连接器和 Lambda 函数进行的受控访问。
AWS IoT Greengrass 核心配置文件
AWS IoT Greengrass 核心软件的配置文件为 config.json
。它位于 /
目录中。greengrass-root
/config
greengrass-root
表示在您的设备上安装 AWS IoT Greengrass 核心软件的路径。通常,这是 /greengrass
目录。
如果您将默认组创建选项来自AWS IoT Greengrass控制台,config.json
文件部署到处于工作状态的核心设备。
您可以运行以下命令以查看该文件的内容:
cat /
greengrass-root
/config/config.json
下面是一个 config.json
示例文件。这是您从中创建核心时生成的版本AWS IoT Greengrass控制台。
服务终端节点必须与
AWS IoT Core 和 AWS IoT Greengrass 终端节点必须与设备上的根 CA 证书的证书类型相对应。如果终端节点和证书类型不匹配,则设备与 AWS IoT Core 或 AWS IoT Greengrass 之间的身份验证尝试将失败。有关更多信息,请参阅《AWS IoT 开发人员指南》中的服务器身份验证。
如果您的设备使用 Amazon Trust Services (ATS) 根 CA 证书(这是首选方法),则设备还必须使用 ATS 终端节点执行设备管理和发现数据层面操作。ATS 终端节点包括 ats
分段,如 AWS IoT Core 终端节点的以下语法所示。
prefix
-ats.iot.region
.amazonaws.com
为了实现向后兼容性,AWS IoT Greengrass目前支持传统 VeriSign 根 CA 证书和终端节点AWS 区域。如果您使用的是传统 VeriSign根 CA 证书,我们建议您创建 ATS 终端节点并改用 ATS 根 CA 证书。否则,请确保使用相应的旧版终端节点。有关更多信息,请参阅 。支持的传统终端节点中的Amazon Web Services 一般参考.
config.json 中的终端节点
在 Greengrass 核心设备上,端点在coreThing
在的对象config.json文件。iotHost
属性表示 AWS IoT Core 终端节点。ggHost
属性表示 AWS IoT Greengrass 终端节点。在以下示例代码段中,这些属性指定 ATS 终端节点。
{ "coreThing" : { ... "iotHost" : "abcde1234uwxyz-ats.iot.us-west-2.amazonaws.com", "ggHost" : "greengrass-ats.iot.us-west-2.amazonaws.com", ... },
- AWS IoT Core 终端节点
-
可以通过适当的
--endpoint-type
参数运行 aws iot describe-endpoint CLI 命令来获取您的 AWS IoT Core 终端节点。-
要返回 ATS 签名的终端节点,请运行:
aws iot describe-endpoint --endpoint-type iot:Data-ATS
-
要归还遗产 VeriSign 签名的终端节点,运行:
aws iot describe-endpoint --endpoint-type iot:Data
-
- AWS IoT Greengrass 终端节点
-
您的AWS IoT Greengrass终端节点是您的
iotHost
主机前缀替换为的端点greengrass. 例如,ATS 签名的终端节点是greengrass-ats.iot.
. 这使用与 AWS IoT Core 终端节点相同的区域。region
.amazonaws.com
通过端口 443 或网络代理进行连接
此功能适用于以下功能AWS IoT GreengrassCore v1.7 及更高版本。
Greengrass 核心使用 MQTT 消息收发协议和 TLS 客户端身份验证与 AWS IoT Core 进行通信。按照惯例, 基于 TLS 的 MQTT 使用端口 8883。但是,作为一项安全措施,限制性环境可能会将入站和出站流量限制到一个较小的 TCP 端口范围。例如,企业防火墙可能会为 HTTPS 流量打开端口 43,但关闭不常用协议使用的其他端口,例如用于 MQTT 流量的端口 883。其他限制性环境可能要求所有流量经由 HTTP 代理连接到 Internet。
为了在此类情况下实现通信,AWS IoT Greengrass 允许以下配置:
-
通过端口 443 进行 MQTT 和 TLS 客户端身份验证的 MQTT. 如果网络允许连接到端口 443,则可以将核心配置为使用端口 443(而非默认端口 8883)进行 MQTT 通信。这可以是与端口 443 的直接连接,也可以是通过网络代理服务器的连接。
AWS IoT Greengrass 使用应用层协议网络
(ALPN) TLS 扩展来启用该连接。与默认配置一样,端口 443 上的基于 TLS 的 MQTT 使用基于证书的客户端身份验证。 当配置为使用与端口 443 的直接连接时,核心支持over-the-air (OTA) 更新为了AWS IoT Greengrass软件。此支持需要使用版本AWS IoT GreengrassCore v1.9.3 或更高版本。
-
通过端口 443 的 HTTPS 通信。AWS IoT Greengrass 默认情况下通过端口 8443 发送 HTTPS 通信,但您可以将其配置为使用端口 443。
-
通过网络代理连接。您可以配置一个网络代理服务器来充当连接到 Greengrass 核心的媒介。仅支持基本身份验证以及 HTTP 和 HTTPS 代理。
代理Lambda 通过
http_proxy
、https_proxy
, 和no_proxy
环境变量。用户定义的 Lambda 函数必须使用这些传入的设置才能通过代理进行连接。Lambda 函数用于建立连接的公用库(例如 boto3 或 cURL 和 python)requests
packages)通常默认使用这些环境变量。如果 Lambda 函数还指定了这些相同的环境变量,AWS IoT Greengrass不会覆盖这些配置。重要 配置为使用网络代理的 Greengrass 核心不支持OTA 更新.
通过端口 443 配置 MQTT
该功能需要使用版本AWS IoT GreengrassCore v1.7 或更高版本。
此过程使 Greengrass 核心能够使用端口 443 与 AWS IoT Core 进行 MQTT 消息传递。
-
运行以下命令以停止 Greengrass 守护程序:
cd /
greengrass-root
/ggc/core/ sudo ./greengrassd stop -
打开
以作为 su 用户进行编辑。greengrass-root
/config/config.json -
在
coreThing
对象中,添加iotMqttPort
属性,并将该属性的值设置为443
,如以下示例所示。{ "coreThing" : { "caPath" : "root.ca.pem", "certPath" : "12345abcde.cert.pem", "keyPath" : "12345abcde.private.key", "thingArn" : "arn:aws:iot:us-west-2:123456789012:thing/core-thing-name", "iotHost" : "abcd123456wxyz-ats.iot.us-west-2.amazonaws.com",
"iotMqttPort" : 443,
"ggHost" : "greengrass-ats.iot.us-west-2.amazonaws.com", "keepAlive" : 600 }, ... } -
启动守护程序。
cd /
greengrass-root
/ggc/core/ sudo ./greengrassd start
通过端口 443 配置 HTTPS
该功能需要使用版本AWS IoT GreengrassCore v1.8 或更高版本。
该过程将核心配置为使用 443 进行 HTTPS 通信。
-
运行以下命令以停止 Greengrass 守护程序:
cd /
greengrass-root
/ggc/core/ sudo ./greengrassd stop -
打开
以作为 su 用户进行编辑。greengrass-root
/config/config.json -
在
coreThing
对象中,添加iotHttpPort
和ggHttpPort
属性,如以下示例所示。{ "coreThing" : { "caPath" : "root.ca.pem", "certPath" : "12345abcde.cert.pem", "keyPath" : "12345abcde.private.key", "thingArn" : "arn:aws:iot:us-west-2:123456789012:thing/core-thing-name", "iotHost" : "abcd123456wxyz-ats.iot.us-west-2.amazonaws.com",
"iotHttpPort" : 443,
"ggHost" : "greengrass-ats.iot.us-west-2.amazonaws.com","ggHttpPort" : 443,
"keepAlive" : 600 }, ... } -
启动守护程序。
cd /
greengrass-root
/ggc/core/ sudo ./greengrassd start
配置网络代理
该功能需要使用版本AWS IoT GreengrassCore v1.7 或更高版本。
该过程允许 AWS IoT Greengrass 通过 HTTP 或 HTTPS 网络代理连接到 Internet。
-
运行以下命令以停止 Greengrass 守护程序:
cd /
greengrass-root
/ggc/core/ sudo ./greengrassd stop -
打开
以作为 su 用户进行编辑。greengrass-root
/config/config.json -
在
coreThing
对象,添加nnetworkProxy对象,如以下示例所示。{ "coreThing" : { "caPath" : "root.ca.pem", "certPath" : "12345abcde.cert.pem", "keyPath" : "12345abcde.private.key", "thingArn" : "arn:aws:iot:us-west-2:123456789012:thing/core-thing-name", "iotHost" : "abcd123456wxyz-ats.iot.us-west-2.amazonaws.com", "ggHost" : "greengrass-ats.iot.us-west-2.amazonaws.com", "keepAlive" : 600,
"networkProxy": { "noProxyAddresses" : "http://128.12.34.56,www.mywebsite.com", "proxy" : { "url" : "https://my-proxy-server:1100", "username" : "Mary_Major", "password" : "pass@word1357" } }
}, ... } -
启动守护程序。
cd /
greengrass-root
/ggc/core/ sudo ./greengrassd start
使用 networkProxy
对象指定有关网络代理的信息。此对象具有以下属性。
字段 | 描述 |
---|---|
noProxyAddresses |
可选。代理免除的 IP 地址或主机名的逗号分隔的列表。 |
proxy |
要连接到的代理。代理具有以下属性。
|
允许终端节点
Greengrass 设备和 AWS IoT Core 或 AWS IoT Greengrass 之间的通信必须经过身份验证。此身份验证基于注册的 X.509 设备证书和加密密钥。要允许经身份验证的请求通过代理而无需其他加密,请允许以下终端节点。
端点 | 端口 | 描述 |
---|---|---|
greengrass. |
443 |
用于进行组管理的控制层面操作。 |
或
|
MQTT:8883 或 443 HTTPS:84443 或 4443 |
用于设备管理的数据平面操作,例如影子同步。 允许仅使用其中一个终端节点或同时使用这两个终端节点,具体取决于您的核心和客户端设备是使用 Amazon Trust Services(首选)根 CA 证书,还是使用旧式根 CA 证书,还是使用旧式根 CA 证书,使用 有关更多信息,请参阅 服务终端节点必须与。 |
或
|
8443 或 443 |
用于设备发现操作。 允许仅使用其中一个终端节点或同时使用这两个终端节点,具体取决于您的核心和客户端设备是使用 Amazon Trust Services(首选)根 CA 证书,还是使用旧式根 CA 证书,还是使用旧式根 CA 证书,使用 有关更多信息,请参阅 服务终端节点必须与。 连接端口 443 的客户端必须实现应用程序层协议协商 (ALPN) |
*.s3.amazonaws.com |
443 |
用于部署操作和 over-the-air 更新。此格式包括 |
logs. |
443 |
如果 Greengrass 组配置为将日志写入到 CloudWatch. |
为 AWS IoT Greengrass 配置写入目录
此功能适用于以下功能AWS IoT GreengrassCore v1.6 及更高版本。
默认为AWS IoT Greengrass核心软件部署在单个根目录中AWS IoT Greengrass执行所有读取和写入操作。不过,您可以配置 AWS IoT Greengrass 以使用单独的目录执行所有写入操作,包括创建目录和文件。在这种情况下,AWS IoT Greengrass 使用两个顶级目录:
-
greengrass-root
目录,您可以将其保留为读写目录,或者选择将其指定为只读目录。它包含应在运行时保持不变的 AWS IoT Greengrass 核心软件和其他关键组件,如证书和config.json
。 -
指定的写入目录。它包含可写内容,如日志、状态信息以及部署的用户定义 Lambda 函数。
该配置将生成以下目录结构。
- Greengrass 根目录
-
greengrass-root
/ |-- certs/ | |-- root.ca.pem | |--hash
.cert.pem | |--hash
.private.key | |--hash
.public.key |-- config/ | |-- config.json |-- ggc/ | |-- packages/ | |--package-version
/ | |-- bin/ | |-- daemon | |-- greengrassd | |-- lambda/ | |-- LICENSE/ | |-- release_notes_package-version
.html | |-- runtime/ | |-- java8
/ | |-- nodejs8.10
/ | |-- python3.8
/ | |-- core/ - 写入目录
-
write-directory
/ |-- packages/ | |--package-version
/ | |-- ggc_root/ | |-- rootfs_nosys/ | |-- rootfs_sys/ | |-- var/ |-- deployment/ | |-- group/ | |-- group.json | |-- lambda/ | |-- mlmodel/ |-- var/ | |-- log/ | |-- state/
配置写入目录
-
运行以下命令以停止 AWS IoT Greengrass 守护程序:
cd /
greengrass-root
/ggc/core/ sudo ./greengrassd stop -
打开
以作为 su 用户进行编辑。greengrass-root
/config/config.json -
添加
writeDirectory
以作为参数并指定目标目录路径,如以下示例所示。{ "coreThing": { "caPath": "root-CA.pem", "certPath": "hash.pem.crt", ... }, ... "writeDirectory" : "/
write-directory
" }注意 您可以更新
writeDirectory
根据需要随时设置。在更新该设置后,AWS IoT Greengrass 在下次启动时使用新指定的写入目录,但不会从以前的写入目录中迁移内容。 -
现已配置您的写入目录,您可以选择将
greengrass-root
目录指定为只读目录。有关说明,请参阅将 Greengrass 根目录指定为只读目录。否则,启动 AWS IoT Greengrass 守护程序:
cd /
greengrass-root
/ggc/core/ sudo ./greengrassd start
将 Greengrass 根目录指定为只读目录
只有在要将 Greengrass 根目录指定为只读目录时,才执行以下步骤。在开始之前,必须配置写入目录。
-
授予对所需目录的访问权限:
-
为
config.json
所有者授予读写权限。sudo chmod 0600 /
greengrass-root
/config/config.json -
将 ggc_user 指定为 certs 和 system Lambda 目录的所有者。
sudo chown -R ggc_user:ggc_group /
greengrass-root
/certs/ sudo chown -R ggc_user:ggc_group /greengrass-root
/ggc/packages/1.11.6/lambda/注意 默认情况下,使用 gc_user 和 gc_user 账户和 gc_user 账户和 gc_user 账户运行系统 Lambda 函数。如果您已配置组级别的默认访问身份来使用不同的账户,则应改为向该用户 (UID) 和组 (GID) 授予权限。
-
-
使用所需的方法将
greengrass-root
目录指定为只读目录。注意 要将
greengrass-root
目录指定为只读目录,一种方法是以只读方式挂载该目录。但是,要申请 over-the-air (OTA) 更新了AWS IoT Greengrass核心软件位于挂载的目录中,必须先卸载该目录,然后在更新后重新安装该目录。您可以将这些umount
和mount
操作添加到ota_pre_update
和ota_post_update
脚本中。有关 OTA 更新的更多信息,请参阅Greengrass OTA 更新代理和使用 OTA 更新的托管 Respawn。 -
启动守护程序。
cd /
greengrass-root
/ggc/core/ sudo ./greengrassd start如果未正确设置步骤 1 中的权限,则不会启动守护程序。
配置 MQTT 设置
在AWS IoT Greengrass环境、本地客户端设备、Lambda 函数、连接器和系统组件既可彼此通信,也可与通信AWS IoT Core. 所有通信都经过核心,核心管理订阅授权实体之间的 MQTT 通信。
有关您可以配置的 MQTT 设置的信息AWS IoT Greengrass,参阅以下部分:
OPC-UA 是一种用于工业通信的信息交换标准。要在 Greengrass 核心上实现对 OPC-UA 的支持,您可以使用IoT SiteWise 连接器. 该连接器可将工业设备数据从 OPC-UA 服务器发送到 AWS IoT SiteWise 中的资产属性。
消息服务质量
AWS IoT Greengrass支持服务质量 (QoS) 级别 0 或 1,具体取决于您的配置以及通信的目标和方向。Greengrass 核心同时作为客户端(用于与 AWS IoT Core 通信)和消息代理(用于本地网络上的通信)。

有关 MQTT 和 QoS 的更多信息,请参阅开始使用
- 与通信AWS Cloud
-
-
出站消息使用 QoS 1
核心发送的消息发往AWS Cloud使用 QoS 1 的目标。AWS IoT Greengrass使用 MQTT 消息队列来处理这些消息。如果消息传送未被确认AWS IoT,则会假脱机处理该消息,以便稍后重试。如果队列已满,则无法重试该消息。邮件传送确认有助于最大限度地减少间歇性连接造成的数据丢失。
因为出站邮件到AWS IoT使用 QoS 1,Greengrass 核心发送消息的最大速率取决于核心和核心之间的延迟AWS IoT. 每次内核发送消息时,它都会等到AWS IoT在发送下一条消息之前确认消息。例如,如果核心与核心之间的往返时间AWS 区域是 50 毫秒,核心每秒最多可以发送 20 条消息。当你选择AWS 区域你的核心连接在哪里。将大量的 IoT 数据摄取到AWS Cloud,您可以使用流管理器.
有关 MQTT 消息队列的更多信息,包括如何配置本地存储缓存以保存发往的消息AWS Cloud目标,请参阅云目标的 MQTT 消息队列.
-
入站消息使用 QoS 0(默认)或 QoS 1
默认情况下,核心使用 QoS 0 订阅来自AWS Cloud源。如果启用持续会话,则核心会订阅 QoS 1。这有助于最大限度地减少间歇性连接造成的数据丢失。要管理这些订阅的 QoS,请在本地后台处理程序系统组件上配置持久性设置。
有关更多信息,包括如何让核心与建立持久会话AWS Cloud目标,请参阅与 AWS IoT Core 的 MQTT 持久性会话.
-
- 与当地目标的沟通
-
所有本地通信都使用 QoS 0。核心会尝试向本地目标发送消息一次,该目标可以是 Greengrass Lambda 函数、连接器或客户端设备. 核心不存储消息或确认交付。消息可置于组件之间的任何位置。
注意 尽管 Lambda 函数之间的直接通信不使用 MQTT 消息收发,但行为是相同的。
云目标的 MQTT 消息队列
发送到的 MQTT 消息AWS Cloud目标排入队列以等待处理。排队的消息按照先进先出 (FIFO) 顺序进行处理。在处理消息并发布到 AWS IoT Core 后,将从队列中删除消息。
默认情况下,Greengrass 核心在内存中存储未处理的消息AWS Cloud目标。您可以将核心配置为将未处理的消息存储在本地存储缓存中。与内存中存储不同,本地存储缓存可以在核心重新启动时永久保存消息(例如,在组部署或设备重启后),因此,AWS IoT Greengrass 可以继续处理这些消息。您也可以配置存储大小。
Greengrass 核心在失去连接时可能会将重复的 MQTT 消息排入队列,因为在 MQTT 客户端检测到它处于脱机状态之前,它会重试发布操作。为避免云目标出现重复的 MQTT 消息,请配置内核的keepAlive
值小于其一半mqttOperationTimeout
值。有关更多信息,请参阅 AWS IoT Greengrass 核心配置文件。
AWS IoT Greengrass使用后台处理程序系统组件(GGCloudSpooler
Lambda 函数)来管理消息队列。您可以使用以下命令GGCloudSpooler
环境变量来配置存储设置。
-
GG_CONFIG_STORAGE_TYPE。消息队列位置。有效值有:
-
FileSystem
. 在物理核心设备磁盘的本地存储缓存中存储未处理的消息。在核心重新启动时,将保留排队的消息以进行处理。在处理后,将删除消息。 -
Memory
(默认值). 在内存中存储未处理的消息。在核心重新启动时,排队的消息将丢失。该选项是针对具有受限硬件功能的设备优化的。在使用该配置时,我们建议您部署组或在服务中断最少的情况下重新启动设备。
-
-
GG_CONFIG_MAX_SIZE_BYT. 存储大小(以字节为单位)。该值可以是任何非负整数大于或等于 262144(256 KB);较小的大小会阻止AWS IoT Greengrass核心软件从一开始。默认大小为 2.5 MB。在达到大小限制时,最早的排队消息将替换为新消息。
此功能适用于以下功能AWS IoT GreengrassCore v1.6 及更高版本。早期版本使用内存中存储,并且队列大小为 2.5 MB。您无法为早期版本配置存储设置。
在本地存储中缓存消息
您可以配置AWS IoT Greengrass以将消息缓存到文件系统中,以便在核心重新启动时永久保存这些消息。为此,您需要部署一个函数定义版本,其中GGCloudSpooler
函数设置存储数据为FileSystem
. 您必须使用 AWS IoT Greengrass API 配置本地存储缓存。您无法在控制台中执行该操作。
以下过程使用create-function-definition-version
用于配置后台处理程序以将排队的消息保存到文件系统中。它还配置 2.6 MB 队列大小。
-
获取目标 Greengrass 组和组版本的 ID。此过程假定这是最新的组和组版本。以下查询返回最近创建的组。
aws greengrass list-groups --query "reverse(sort_by(Groups, &CreationTimestamp))[0]"
或者,您也可以按名称查询。系统不要求组名称是唯一的,所以可能会返回多个组。
aws greengrass list-groups --query "Groups[?Name=='
MyGroup
']"注意 您还可以在中找到这些值AWS IoT控制台。组 ID 显示在组的设置页面上。组版本 ID 显示在组的版本 ID部署选项卡。
-
从输出中的目标组复制
Id
和LatestVersion
值。 -
获取最新的组版本。
-
将
group-id
替换为复制的Id
。 -
Replace
latest-group-version-id
用LatestVersion
所复制。
aws greengrass get-group-version \ --group-id
group-id
\ --group-version-idlatest-group-version-id
-
-
从输出中的
Definition
对象复制CoreDefinitionVersionArn
以及所有其他组组件(FunctionDefinitionVersionArn
除外)的 ARN。在创建新的组版本时,将使用这些值。 -
在输出的
FunctionDefinitionVersionArn
中,复制函数定义的 ID。该 ID 是 ARN 中的functions
段后面的 GUID,如以下示例所示。arn:aws:greengrass:us-west-2:123456789012:/greengrass/definition/functions/bcfc6b49-beb0-4396-b703-6dEXAMPLEcu5/versions/0f7337b4-922b-45c5-856f-1aEXAMPLEsf6
注意 或者,您可以通过运行
create-function-definition
命令,然后从输出中复制该 ID。 -
在函数定义中添加一个函数定义版本。
-
Replace
function-definition-id
用Id
你为函数定义复制的。 -
Replace
arbitrary-function-id
使用函数的名称,如spooler-function
. -
将要在该版本中包含的任何 Lambda 函数添加到
functions
数组。您可以使用get-function-definition-version
命令从现有的函数定义版本中获取 Greengrass Lambda 函数。
警告 确保为
GG_CONFIG_MAX_SIZE_BYTES
指定大于或等于 262144 的值。较小的大小将导致 AWS IoT Greengrass 核心软件无法启动。aws greengrass create-function-definition-version \ --function-definition-id
function-definition-id
\ --functions '[{"FunctionArn": "arn:aws:lambda:::function:GGCloudSpooler:1","FunctionConfiguration": {"Environment": {"Variables":{"GG_CONFIG_MAX_SIZE_BYTES":"2621440","GG_CONFIG_STORAGE_TYPE":"FileSystem"}},"Executable": "spooler","MemorySize": 32768,"Pinned": true,"Timeout": 3},"Id": "arbitrary-function-id
"}]'注意 如果您之前设置
GG_CONFIG_SUBSCRIPTION_QUALITY
环境变量以支持与 AWS IoT Core 的持久性会话,请将其包含在此函数实例中。 -
-
从输出中复制函数定义版本的
Arn
。 -
创建一个包含系统 Lambda 函数的组版本。
-
将
group-id
替换为组的Id
。 -
Replace
core-definition-version-arn
用CoreDefinitionVersionArn
是从最新组版本中复制的。 -
Replace
function-definition-version-arn
用Arn
为新函数定义版本复制的函数定义版本。 -
替换从最新组版本中复制的其他组组件(例如
SubscriptionDefinitionVersionArn
或DeviceDefinitionVersionArn
)的 ARN。 -
删除任何未使用的参数。例如,如果组版本不包含任何资源,请删除
--resource-definition-version-arn
。
aws greengrass create-group-version \ --group-id
group-id
\ --core-definition-version-arncore-definition-version-arn
\ --function-definition-version-arnfunction-definition-version-arn
\ --device-definition-version-arndevice-definition-version-arn
\ --logger-definition-version-arnlogger-definition-version-arn
\ --resource-definition-version-arnresource-definition-version-arn
\ --subscription-definition-version-arnsubscription-definition-version-arn
-
-
从输出中复制
Version
。这是新组版本的 ID。 -
用新组版本替换组。
-
使用为组复制的
替换
group-idId
。 -
Replace
group-version-id
用Version
为新组版本复制的文件。
aws greengrass create-deployment \ --group-id
group-id
\ --group-version-idgroup-version-id
\ --deployment-type NewDeployment -
要更新存储设置,您需要使用 AWS IoT Greengrass API 创建新的函数定义版本,其中包含具有更新的配置的 GGCloudSpooler
函数。接下来,将函数定义版本添加到新的组版本(以及其他组组件)中,然后部署该组版本。如果要还原默认配置,您可以部署不包含GGCloudSpooler
function.
控制台中不显示这个系统 Lambda 函数。不过,在将函数添加到最新组版本后,除非您使用 API 替换或删除该函数,否则它将包含在从控制台指定的部署中。
与 AWS IoT Core 的 MQTT 持久性会话
此功能适用于 AWS IoT Greengrass Core v1.10 及更高版本。
Greengrass 核心可以与 AWS IoT 消息代理建立持久性会话。持久性会话是允许核心接收在其脱机时发送的消息。核心是连接中的客户端。
在持久性会话中,AWS IoT消息代理保存核心在连接期间进行的所有订阅。如果核心断开连接,AWS IoT消息代理存储未确认的消息和作为 QoS 1 发布并发往本地目标的新消息,例如 Lambda 函数和客户端设备. 当核心重新连接时,将恢复持久性会话,AWS IoT 消息代理以每秒 10 条消息的最大速率将存储的消息发送到核心。持久性会话的默认过期限为 1 小时,从消息代理检测到核心断开连接时开始。有关更多信息,请参阅 。MQTT 持久性会话中的AWS IoT开发人员指南.
AWS IoT Greengrass使用后台处理程序系统组件(GGCloudSpooler
Lambda 函数)来创建具有AWS IoT作为源。您可以使用以下命令GGCloudSpooler
用于配置持久会话的环境变量。
-
GG_CONFIG_订阅_质量. 订阅的质量AWS IoT作为源。有效值有:
-
AtMostOnce
(默认值). 禁用持久性会话。订阅使用 QoS 0。 -
AtLeastOncePersistent
. 启用持久性会话。设置cleanSession
标志0
在CONNECT
消息和订阅使用 QoS 1。核心接收的使用 QoS 1 发布的消息保证会到达 Greengrass 守护进程的内存中工作队列。核心在将消息添加到队列中之后,对应的消息。从队列到本地目标(例如 Greengrass Lambda 函数、连接器或设备)的后续通信将作为 QoS 0 发送。AWS IoT Greengrass不能保证交付给本地目标。
注意 您可以使用maxWorkItem计数配置属性来控制工作项队列的大小。例如,如果您的工作负载需要大量的 MQTT 流量,您可以增大队列大小。
启用持久会话后,内核至少会打开一个额外的连接,以便与AWS IoT. 有关更多信息,请参阅 与 AWS IoT 的 MQTT 连接的客户端 ID。
-
配置 MQTT 持久性会话
您可以配置 AWS IoT Greengrass 以使用与 AWS IoT Core 的持久性会话。为此,您需要部署一个函数定义版本,其中GGCloudSpooler
函数将订阅质量设置为AtLeastOncePersistent
. 此设置适用于具有 AWS IoT Core (cloud
) 作为源的所有订阅。您必须使用AWS IoT Greengrass用于配置持久会话的 API。您无法在控制台中执行该操作。
以下过程使用create-function-definition-version
CLI 命令将后台处理程序配置为使用持久会话。在以下步骤中,我们假定您要更新现有组的最新组版本的配置。
-
获取目标 Greengrass 组和组版本的 ID。此过程假定这是最新的组和组版本。以下查询返回最近创建的组。
aws greengrass list-groups --query "reverse(sort_by(Groups, &CreationTimestamp))[0]"
或者,您也可以按名称查询。系统不要求组名称是唯一的,所以可能会返回多个组。
aws greengrass list-groups --query "Groups[?Name=='
MyGroup
']"注意 您还可以在中找到这些值AWS IoT控制台。组 ID 显示在组的设置页面上。组版本 ID 显示在组的版本 ID部署选项卡。
-
从输出中的目标组复制
Id
和LatestVersion
值。 -
获取最新的组版本。
-
将
group-id
替换为复制的Id
。 -
Replace
latest-group-version-id
用LatestVersion
所复制。
aws greengrass get-group-version \ --group-id
group-id
\ --group-version-idlatest-group-version-id
-
-
从输出中的
Definition
对象复制CoreDefinitionVersionArn
以及所有其他组组件(FunctionDefinitionVersionArn
除外)的 ARN。在创建新的组版本时,将使用这些值。 -
在输出的
FunctionDefinitionVersionArn
中,复制函数定义的 ID。该 ID 是 ARN 中的functions
段后面的 GUID,如以下示例所示。arn:aws:greengrass:us-west-2:123456789012:/greengrass/definition/functions/bcfc6b49-beb0-4396-b703-6dEXAMPLEcu5/versions/0f7337b4-922b-45c5-856f-1aEXAMPLEsf6
注意 或者,您可以通过运行
create-function-definition
命令,然后从输出中复制该 ID。 -
在函数定义中添加一个函数定义版本。
-
Replace
function-definition-id
用Id
你为函数定义复制的。 -
Replace
arbitrary-function-id
使用函数的名称,如spooler-function
. -
将要在该版本中包含的任何 Lambda 函数添加到
functions
数组。您可以使用get-function-definition-version
命令从现有的函数定义版本中获取 Greengrass Lambda 函数。
aws greengrass create-function-definition-version \ --function-definition-id
function-definition-id
\ --functions '[{"FunctionArn": "arn:aws:lambda:::function:GGCloudSpooler:1","FunctionConfiguration": {"Environment": {"Variables":{"GG_CONFIG_SUBSCRIPTION_QUALITY":"AtLeastOncePersistent"}},"Executable": "spooler","MemorySize": 32768,"Pinned": true,"Timeout": 3},"Id": "arbitrary-function-id
"}]'注意 如果你之前设置了
GG_CONFIG_STORAGE_TYPE
要么GG_CONFIG_MAX_SIZE_BYTES
环境变量为定义存储设置,将它们包含在此函数实例中。 -
-
从输出中复制函数定义版本的
Arn
。 -
创建一个包含系统 Lambda 函数的组版本。
-
将
group-id
替换为组的Id
。 -
Replace
core-definition-version-arn
用CoreDefinitionVersionArn
是从最新组版本中复制的。 -
Replace
function-definition-version-arn
用Arn
为新函数定义版本复制的函数定义版本。 -
替换从最新组版本中复制的其他组组件(例如
SubscriptionDefinitionVersionArn
或DeviceDefinitionVersionArn
)的 ARN。 -
删除任何未使用的参数。例如,如果组版本不包含任何资源,请删除
--resource-definition-version-arn
。
aws greengrass create-group-version \ --group-id
group-id
\ --core-definition-version-arncore-definition-version-arn
\ --function-definition-version-arnfunction-definition-version-arn
\ --device-definition-version-arndevice-definition-version-arn
\ --logger-definition-version-arnlogger-definition-version-arn
\ --resource-definition-version-arnresource-definition-version-arn
\ --subscription-definition-version-arnsubscription-definition-version-arn
-
-
从输出中复制
Version
。这是新组版本的 ID。 -
用新组版本替换组。
-
使用为组复制的
替换
group-idId
。 -
Replace
group-version-id
用Version
您为新组版本复制的这些文件。
aws greengrass create-deployment \ --group-id
group-id
\ --group-version-idgroup-version-id
\ --deployment-type NewDeployment -
-
(可选)增加maxWorkItem计数属性在核心配置文件中。这可以帮助核心处理增加的 MQTT 流量以及与本地目标的通信。
要使用这些配置更改更新内核,请使用AWS IoT Greengrass用于创建新的函数定义版本,其中包含GGCloudSpooler
函数具有更新的配置。接下来,将函数定义版本添加到新的组版本(以及其他组组件)中,然后部署该组版本。如果要还原默认配置,您可以创建不包含 GGCloudSpooler
函数的函数定义版本。
控制台中不显示这个系统 Lambda 函数。不过,在将函数添加到最新组版本后,除非您使用 API 替换或删除该函数,否则它将包含在从控制台指定的部署中。
与 AWS IoT 的 MQTT 连接的客户端 ID
此功能适用于以下功能AWS IoT GreengrassCore v1.8 及更高版本。
Greengrass 核心与 AWS IoT Core 建立 MQTT 连接,以便执行影子同步和证书管理等操作。对于这些连接,核心会根据核心事物名称生成可预测的客户端 ID。可预测的客户端 ID 可用于监控、审计和定价功能,包括AWS IoT Device Defender和AWS IoT生命周期事件. 您还可以围绕可预测的客户端 ID 创建逻辑(例如,基于证书属性的订阅策略模板)。
在同步连接中使用重复的客户端 ID 可能会导致无限的连接断开连接。如果另一个设备硬编码为使用核心设备名称作为连接中的客户端 ID,则可能发生这种情况。有关更多信息,请参阅此问题排查步骤。
Greengrass 设备还与以下设备的 “舰队索引” 服务完全集成AWS IoT Device Management. 这允许您根据设备属性、影子状态和云中的连接状态对设备进行索引编制和搜索。例如,Greengrass 设备至少建立一个使用事物名称作为客户端 ID 的连接,因此,您可以使用设备连接索引来发现哪些 Greengrass 设备当前已与 AWS IoT Core 连接或断开连接。有关更多信息,请参阅 。队列索引服务中的AWS IoT开发人员指南.
为本地消息收发配置 MQTT 端口
该功能需要使用版本AWS IoT GreengrassCore v1.10 或更高版本。
Greengrass 核心充当本地 Lambda 函数、连接器和客户端设备. 默认情况下,内核将端口 8883 用于本地网络上的 MQTT 流量。您可能需要更改端口,以避免与端口 8883 上运行的其他软件发生冲突。
配置核心用于本地 MQTT 通信的端口号
-
运行以下命令以停止 Greengrass 守护程序:
cd /
greengrass-root
/ggc/core/ sudo ./greengrassd stop -
打开
以作为 su 用户进行编辑。greengrass-root
/config/config.json -
在
coreThing
对象,添加ggMqttPort
属性,然后将值设置为要使用的端口号。有效值为 1024 到 65535。以下示例将端口号设置为9000
.{ "coreThing" : { "caPath" : "root.ca.pem", "certPath" : "12345abcde.cert.pem", "keyPath" : "12345abcde.private.key", "thingArn" : "arn:aws:iot:us-west-2:123456789012:thing/core-thing-name", "iotHost" : "abcd123456wxyz-ats.iot.us-west-2.amazonaws.com", "ggHost" : "greengrass-ats.iot.us-west-2.amazonaws.com",
"ggMqttPort" : 9000,
"keepAlive" : 600 }, ... } -
启动守护程序。
cd /
greengrass-root
/ggc/core/ sudo ./greengrassd start -
如果自动 IP 检测已为核心启用,则配置完成。
如果未启用自动 IP 检测,则必须更新核心的连接信息。这样,客户端设备就可以在发现操作期间接收正确的端口号,以获取核心连接信息。您可以使用AWS IoT控制台AWS IoT Greengrass用于更新核心连接信息的 API。对于此过程,您只能更新端口号。核心的本地 IP 地址保持不变。
- 更新核心的连接信息(控制台)
-
-
在组配置页面上,选择 Greengrass 核心。
-
在核心详细信息页中,选择MQTT 代理终端节点选项卡。
-
选择管理终端节点然后选择添加终端节点
-
输入您当前的本地 IP 地址和新的端口号。以下示例设置端口号
9000
确保 IP 地址192.168.1.8
. -
移除过时的终端节点,然后选择更新
-
- 更新核心的连接信息 (API)
-
-
使用 UpdateConnectivityInfo 操作。以下示例使用
update-connectivity-info
中的AWS CLI以设置端口号9000
确保 IP 地址192.168.1.8
.aws greengrass update-connectivity-info \ --thing-name "MyGroup_Core" \ --connectivity-info "[{\"Metadata\":\"\",\"PortNumber\":9000,\"HostAddress\":\"192.168.1.8\",\"Id\":\"localIP_192.168.1.8\"},{\"Metadata\":\"\",\"PortNumber\":8883,\"HostAddress\":\"127.0.0.1\",\"Id\":\"localhost_127.0.0.1_0\"}]"
-
注意 还可以配置核心用于与 AWS IoT Core 进行 MQTT 消息传递的端口。有关更多信息,请参阅 通过端口 443 或网络代理进行连接。
在与的 MQTT 连接中的发布、订阅和取消订阅操作的超时AWS Cloud
AWS IoT Greengrass v1.10.2 或更高版本中提供了此功能。
您可以配置允许 Greengrass 核心在与 AWS IoT Core 的 MQTT 连接中完成发布、订阅或取消订阅操作的时间(以秒为单位)。如果因带宽限制或高延迟导致操作超时,您可能需要调整此设置。要在 config.json 文件中配置此设置,请在 coreThing
对象中添加或更改 mqttOperationTimeout
属性。例如:
{ "coreThing": { "mqttOperationTimeout": 10, "caPath": "root-ca.pem", "certPath": "
hash
.cert.pem", "keyPath": "hash
.private.key", ... }, ... }
默认超时时间为 5 秒。最小超时值为 5 秒。
激活自动 IP 检测
您可以配置AWS IoT Greengrass以使 Greengrass 组中的客户端设备能够自动发现 Greengrass 核心。启用后,内核将监视其 IP 地址的更改。如果地址发生变化,内核将发布更新的地址列表。这些地址将提供给与核心位于同一 Greengrass 组中的客户端设备使用。
这些区域有:AWS IoT客户端设备的策略必须授予greengrass:Discover
允许设备检索核心的连接信息。有关策略语句的更多信息,请参阅Discover。
要从中启用此功能AWS IoT Greengrass控制台,自动检测在您首次部署Greengrass 组时。您也可以在组配置页面上启用或禁用此功能,方法是选择Lambda 函数选项卡并选择IP 探测器. 在以下情况下启用自动 IP 检测自动检测和覆盖 MQTT 代理端点已选择。
使用管理自动发现AWS IoT GreengrassAPI,您必须配置IPDetector
系统 Lambda 函数。以下步骤演示如何使用 create-function-definition-version用于配置 Greengrass 核心的自动发现的 CLI 命令。
-
获取目标 Greengrass 组和组版本的 ID。此过程假定这是最新的组和组版本。以下查询返回最近创建的组。
aws greengrass list-groups --query "reverse(sort_by(Groups, &CreationTimestamp))[0]"
或者,您也可以按名称查询。系统不要求组名称是唯一的,所以可能会返回多个组。
aws greengrass list-groups --query "Groups[?Name=='
MyGroup
']"注意 您还可以在中找到这些值AWS IoT控制台。组 ID 显示在组的设置页面上。组版本 ID 显示在组的版本 ID部署选项卡。
-
从输出中的目标组复制
Id
和LatestVersion
值。 -
获取最新的组版本。
-
将
group-id
替换为复制的Id
。 -
Replace
latest-group-version-id
用LatestVersion
所复制。
aws greengrass get-group-version \ --group-id
group-id
\ --group-version-idlatest-group-version-id
-
-
从输出中的
Definition
对象复制CoreDefinitionVersionArn
以及所有其他组组件(FunctionDefinitionVersionArn
除外)的 ARN。在创建新的组版本时,将使用这些值。 -
从输出中的
FunctionDefinitionVersionArn
,复制函数定义的 ID 和函数定义版本:arn:aws:greengrass:
region
:account-id
:/greengrass/groups/function-definition-id
/versions/function-definition-version-id
注意 您可以选择运行
create-function-definition
命令以创建一个函数定义,然后从输出中复制该 ID。 -
使用
get-function-definition-version
命令可获取当前定义状态。使用function-definition-id
你为函数定义而复制。例如,4d941bc7-92a1-4f45-8d64-examplef76c3
.aws greengrass get-function-definition-version --function-definition-id
function-definition-id
--function-definition-version-idfunction-definition-version-id
记下列出的函数配置。在创建新的函数定义版本时,您需要包括这些内容,以防止丢失当前的定义设置。
-
在函数定义中添加一个函数定义版本。
-
Replace
function-definition-id
用Id
你为函数定义复制的。例如,4d941bc7-92a1-4f45-8d64-examplef76c3
. -
Replace
arbitrary-function-id
使用函数的名称,如auto-detection-function
. -
将要在该版本中包含的所有 Lambda 函数添加到要在该版本中包含的所有 Lambda 函数
functions
数组,例如上一步中列出的任何数组。
aws greengrass create-function-definition-version \ --function-definition-id
function-definition-id
\ --functions '[{"FunctionArn":"arn:aws:lambda:::function:GGIPDetector:1","Id":"arbitrary-function-id
","FunctionConfiguration":{"Pinned":true,"MemorySize":32768,"Timeout":3}}]'\ --region us-west-2 -
-
从输出中复制函数定义版本的
Arn
。 -
创建一个包含系统 Lambda 函数的组版本。
-
将
group-id
替换为组的Id
。 -
Replace
core-definition-version-arn
用CoreDefinitionVersionArn
是从最新组版本中复制的。 -
Replace
function-definition-version-arn
用Arn
为新函数定义版本复制的函数定义版本。 -
替换从最新组版本中复制的其他组组件(例如
SubscriptionDefinitionVersionArn
或DeviceDefinitionVersionArn
)的 ARN。 -
删除任何未使用的参数。例如,如果组版本不包含任何资源,请删除
--resource-definition-version-arn
。
aws greengrass create-group-version \ --group-id
group-id
\ --core-definition-version-arncore-definition-version-arn
\ --function-definition-version-arnfunction-definition-version-arn
\ --device-definition-version-arndevice-definition-version-arn
\ --logger-definition-version-arnlogger-definition-version-arn
\ --resource-definition-version-arnresource-definition-version-arn
\ --subscription-definition-version-arnsubscription-definition-version-arn
-
-
从输出中复制
Version
。这是新组版本的 ID。 -
用新组版本替换组。
-
使用为组复制的
替换
group-idId
。 -
Replace
group-version-id
用Version
您为新组版本复制的这些文件。
aws greengrass create-deployment \ --group-id
group-id
\ --group-version-idgroup-version-id
\ --deployment-type NewDeployment -
如果要手动输入 Greengrass 核心的 IP 地址,您可以使用其他不包含 IPDetector
函数的函数定义来完成此教程。这将阻止检测函数定位并自动输入您的 Greengrass 核心 IP 地址。
在 Lambda 控制台中不显示这个系统 Lambda 函数。在将函数添加到最新组版本后,除非您使用 API 替换或删除该函数,否则它将包含在从控制台指定的部署中。
配置初始化系统以启动 Greengrass 守护程序
最佳做法是,将初始化系统设置为在引导期间启动 Greengrass 守护程序,尤其是在管理大量设备时。
如果您将apt
以安装AWS IoT Greengrass核心软件,你可以使用 systemd 脚本来启用启动时启动。有关更多信息,请参阅 使用 systemd 脚本管理 Greengrass 守护程序生命周期。
具有不同类型的初始化系统(如 initd、systemd 和 SystemV),并且它们使用类似的配置参数。以下示例是用于 systemd 的服务文件。Type
参数设置为 forking
,因为 greengrassd(用于启动 Greengrass)为 Greengrass 守护程序进程创建分支,而 Restart
参数设置为 on-failure
以指示 systemd 在 Greengrass 进入故障状态时重新启动 Greengrass。
要查看您的设备是否使用 systemd,请运行check_ggc_dependencies
脚本,如中所述模块 1. 然后,要使用 systemd,请确保将 useSystemd
config.json 中的 参数设置为 yes
。
[Unit] Description=Greengrass Daemon [Service] Type=forking PIDFile=/var/run/greengrassd.pid Restart=on-failure ExecStart=/greengrass/ggc/core/greengrassd start ExecReload=/greengrass/ggc/core/greengrassd restart ExecStop=/greengrass/ggc/core/greengrassd stop [Install] WantedBy=multi-user.target
有关如何在 Raspberry Pi 上为 systemd 创建和启用服务文件的信息,请参阅 Raspberry Pi 文档中的 SYSTEMD