AWS IoT Greengrass:如何使用 AWS 管理控制台配置本地资源访问
AWS IoT Greengrass:如何使用 AWS 管理控制台配置本地资源访问
您可以配置 Lambda 函数以安全访问主机 Greengrass 核心设备上的本地资源。本地资源是指物理上存在于主机中的总线和外围设备,或主机操作系统上的文件系统卷。
步骤 1:创建 Lambda 函数部署程序包
在该步骤中,您将创建一个 Lambda 函数部署程序包,这是包括函数代码和依赖项的 ZIP 文件。您还可以下载 AWS IoT Greengrass 核心开发工具包,以包括在程序包中作为依赖项。
-
在您的计算机上,将以下 Python 脚本复制到名为
lraTest.py
的本地文件。这是 Lambda 函数的应用程序逻辑。# Demonstrates a simple use case of local resource access. # This Lambda function writes a file test to a volume mounted inside # the Lambda environment under destLRAtest. Then it reads the file and # publishes the content to the AWS IoT LRAtest topic. import sys import greengrasssdk import platform import os import logging # Setup logging to stdout logger = logging.getLogger(__name__) logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) # Create a Greengrass Core SDK client. client = greengrasssdk.client('iot-data') volumePath = '/dest/LRAtest' def function_handler(event, context): try: client.publish(topic='LRA/test', payload='Sent from AWS IoT Greengrass Core.') volumeInfo = os.stat(volumePath) client.publish(topic='LRA/test', payload=str(volumeInfo)) with open(volumePath + '/test', 'a') as output: output.write('Successfully write to a file.') with open(volumePath + '/test', 'r') as myfile: data = myfile.read() client.publish(topic='LRA/test', payload=data) except Exception as e: logger.error('Failed to publish message: ' + repr(e)) return
-
从 AWS IoT Greengrass Core 开发工具包 下载 页面下载 适用于 Python 的 AWS IoT Greengrass Core 开发工具包。
-
解压缩下载的程序包以获取软件开发工具包。软件开发工具包是
greengrasssdk
文件夹。 -
将以下项目压缩到名为
lraTestLambda.zip
的文件中:lraTest.py
。应用程序逻辑。greengrasssdk
。所有 Python Lambda 函数必需的库。
lraTestLambda.zip
文件即 Lambda 函数部署程序包。
步骤 2:创建并发布 Lambda 函数
- 创建Lambda函数。
-
在 (基本信息) 部分中,使用以下值。
-
对于 (函数名称),输入
TestLRA
。 -
对于 (运行时),选择 Python 3.7。
-
对于(权限),请保留默认设置。这将创建一个授予基本 Lambda 权限的执行角色。
-
-
点击(创建函数)。
-
在函数的 (配置) 选项卡上,对于 (函数代码),使用以下值:
- 对于 代码输入种类,选择上传 .zip 文件。
- 对于 (运行时),选择 Python 3.7。
- 对于 (处理程序),请输入 lraTest.function_handler。
-
选择 (上传)。
-
选择您的
lraTestLambda.zip
部署程序包。 -
在页面顶部,选择(保存)。
-
在(操作)中,选择(发布新版本)。
-
对于 (版本描述),输入
First version
,然后选择 (Publish)。 -
在 (创建新的别名) 页面上,对于 (名称),输入
test
。对于 (版本),输入 1。注意
AWS IoT Greengrass 不支持 $LATEST 版本的 Lambda 别名。
-
选择 (创建)。
步骤 3:将 Lambda 函数添加到 Greengrass 组
在该步骤中,您将该函数添加到您的组并配置该函数的生命周期。
-
在组控制页面选择(Lambda)中的(添加Lambda)。
-
选择使用现有Lambda。
-
在 (使用现有 Lambda) 页面上,选择 TestLRA,然后选择 (下一步)。
-
在 (选择 Lambda 版本) 页面上,选择 Alias:test,然后选择 (完成)。
接下来,配置 Lambda 函数的生命周期。
-
在 TestLRA 配置页面上,选择(编辑)。
-
在 (组特定的 Lambda 配置) 页面上,对于 (超时),选择 (30 秒)。
重要
使用本地资源的 Lambda 函数(如本过程中所述)必须在 Greengrass 容器中运行。否则,如果尝试部署该函数,则部署将失败。有关更多信息,请参阅容器化。
步骤 4:将本地资源添加到 Greengrass 组
在该步骤中,您将本地卷资源添加到 Greengrass 组并为该函数授予对资源的读写访问权限。本地资源有一个群组级别的作用域。您可以给组中的任何 Lambda 函数授予权限以访问资源。
-
在组配置页面上,选择(Lambda)中的TestLRA函数,进入以下界面。
-
选择(资源)中的(添加本地资源)
-
选择(添加本地资源)。
-
在 (创建本地资源) 页面上,使用以下值:
-
对于 (资源名称),输入
testDirectory
。 -
对于 (资源类型),选择 Volume (卷)。
-
对于 (源路径),输入
/src/LRAtest
。主机操作系统上必须存在该路径。源路径是核心设备文件系统上的资源的绝对路径。此位置位于函数在其中运行的容器之外。该路径不能以
/sys
开头。 -
对于 (目的地路径),输入
/dest/LRAtest
。主机操作系统上必须存在该路径。目的地路径是 Lambda 命名空间中资源的绝对路径。此位置位于函数在其中运行的容器之内。
-
在 (组所有者文件访问权限) 下,选择 (自动添加拥有资源的 Linux 组的操作系统组权限)。
组所有者文件访问权限选项可让您授予对 Lambda 进程的额外的文件访问权限。
-
选择(读写访问权限)。
-
-
选择(保存)
步骤 5:将订阅添加到 Greengrass 组
在该步骤中,您将两个订阅添加到 Greengrass 组。这些订阅在 Lambda 函数与 AWS IoT 之间启用双向通信。
-
在组配置页面上,选择 (订阅),然后选择 (添加订阅)。
-
在选择您的源和目标页面,配置源和目标,如下所示:
-
对于(选择源),选择 (Lambdas),然后选择 TestLRA。
-
对于(选择目标),选择(服务),然后选择 IoT Cloud。
-
选择 (下一步)。
-
-
在 (利用主题筛选您的数据) 页面上,对于 (主题筛选条件),输入
LRA/test
,然后选择 (下一步)。 -
然后再添加一个订阅。源为IoT Cloud,目标为TestLRA,主题筛选条件为invoke/LRAFunction
步骤 6:部署 AWS IoT Greengrass 组
确保 AWS IoT Greengrass Core正在运行。根据需要在您的 Raspberry Pi 终端中运行以下命令。
-
要检查守护程序是否正在运行,请执行以下操作:
ps aux | grep -E 'greengrass.*daemon'
如果输出包含
/greengrass/ggc/packages/1.10.0/bin/daemon
的root
条目,则表示守护程序正在运行。注意
路径中的版本取决于您的核心设备上安装的 AWS IoT Greengrass 核心软件版本。
-
要启动守护程序,请执行以下操作:
cd /greengrass/ggc/core/ sudo ./greengrassd start
-
在组配置页面上,选择 (部署),然后从 (操作) 菜单中,选择 (部署)。
部署可能出现问题。
-
第一个问题是因为不存在路径
/src/LRAtest
和/dest/LRAtest
。在树莓派上通过以下命令创建文件路径即可。sudo mkdir /src cd /src mkdir LRAtest sudo mkdir /dest cd /dest mkdir LRAtest
-
第二个问题是因为ggc用户没有对刚刚创建的文件的读取写入权限,在树莓派上执行以下命令以给所有用户所有权限。
sudo chmod -R 777 src/ sudo chmod -R 777 dest/
然后就可以部署成功了。
-
测试本地资源访问
现在,您可以验证是否正确配置了本地资源访问。要进行测试,您需要订阅 LRA/test
主题,并发布到 invoke/LRAFunction
主题。如果 Lambda 函数将预期的负载发送到 AWS IoT,则测试成功。
-
在 AWS IoT 控制台主页上的左侧窗格中,选择 (测试)。
-
在 (订阅) 部分中,对于 (订阅主题),请输入
LRA/test
。对于 (MQTT 负载显示),选择 (将负载显示为字符串)。 -
选择 (订阅主题)。您的 Lambda 函数将发布到 LRA/test 主题。
-
在 (发布) 部分中,输入
invoke/LRAFunction
,然后选择 Publish to topic 来调用您的 Lambda 函数。如果页面显示函数的三个消息负载,则测试成功。Lambda 函数创建的测试文件位于 Greengrass 核心设备上的
/src/LRAtest
目录中。尽管该 Lambda 函数写入到/dest/LRAtest
目录中的文件,但该文件仅在 Lambda 命名空间中是可见的。您在常规 Linux 命名空间中看不到它。对目标路径的任何更改都会反映在文件系统上的源路径中。