如何使用 AWS Management Console配置本地资源访问 - AWS IoT Greengrass

AWS IoT Greengrass Version 1 2023 年 6 月 30 日进入延长寿命阶段。有关更多信息,请参阅 AWS IoT Greengrass V1 维护策略。在此日期之后,将 AWS IoT Greengrass V1 不会发布提供功能、增强功能、错误修复或安全补丁的更新。在上面运行的设备 AWS IoT Greengrass V1 不会中断,将继续运行并连接到云端。我们强烈建议您迁移到 AWS IoT Greengrass Version 2,这样可以添加重要的新功能支持其他平台

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

如何使用 AWS Management Console配置本地资源访问

此功能适用于 AWS IoT Greengrass Core v1.3 及更高版本。

您可以配置 Lambda 函数以安全访问主机 Greengrass 核心设备上的本地资源。本地资源是指物理上存在于主机中的总线和外围设备,或主机操作系统上的文件系统卷。有关更多信息(包括要求和约束),请参阅使用 Lambda 函数和连接器访问本地资源

本教程介绍如何使用 AWS Management Console 配置对 AWS IoT Greengrass 核心设备上本地资源的访问权限。它包含以下高级步骤:

有关使用 AWS Command Line Interface的教程,请参阅如何使用 AWS 命令行界面配置本地资源访问

先决条件

要完成此教程,需要:

  • Greengrass 组和 Greengrass Core(v1.3 或更高版本)。要创建 Greengrass 组或核心,请参阅入门 AWS IoT Greengrass

  • Greengrass 核心设备上的以下目录:

    • /src/LRAtest

    • /dest/LRAtest

    这些目录的所有者组必须具有对目录的读写访问权限。您可以使用以下命令授予访问权限:

    sudo chmod 0775 /src/LRAtest

步骤 1:创建 Lambda 函数部署程序包

在该步骤中,您将创建一个 Lambda 函数部署程序包,这是包括函数代码和依赖项的 ZIP 文件。您还可以下载 AWS IoT Greengrass 核心开发工具包,以包括在程序包中作为依赖项。

  1. 在您的计算机上,将以下 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
  2. AWS IoT Greengrass Core 软件开发工具包下载页面,将适用于 Python 的 AWS IoT Greengrass Core 软件开发工具包下载到您的计算机上。

  3. 解压缩下载的程序包以获取软件开发工具包。软件开发工具包是 greengrasssdk 文件夹。

  4. 将以下项目压缩到名为 lraTestLambda.zip 的文件中:

    • lraTest.py. 应用程序逻辑。

    • greengrasssdk. 所有 Python Lambda 函数必需的库。

    lraTestLambda.zip 文件即 Lambda 函数部署程序包。现在您已准备好创建 Lambda 函数和上传部署程序包。

步骤 2:创建并发布 Lambda 函数

在该步骤中,您使用 AWS Lambda 控制台创建 Lambda 函数,然后将其配置为使用您的部署包。接着,发布函数版本并创建别名。

首先,创建 Lambda 函数。

  1. 在 AWS Management Console中,选择 Services (服务),然后打开 AWS Lambda 控制台。

  2. 选择 函数

  3. 选择 创建函数,然后选择 从头开始创作

  4. Basic information (基本信息) 部分中,使用以下值。

    1. 对于 Function name(函数名称),请输入 TestLRA

    2. 对于 Runtime (运行时),选择 Python 3.7

    3. 对于权限,请保留默认设置。这将创建一个授予基本 Lambda 权限的执行角色。此角色未由 AWS IoT Greengrass 使用。

  5. 选择 Create function(创建函数)。

    突出显示“Create function (创建函数)”的“Create function (创建函数)”页面。

     

  6. 上传您的 Lambda 函数部署程序包并注册处理程序。

    1. 代码选项卡上的代码源下,选择上传自。从下拉列表中选择 .zip 文件

      “上传自”下拉列表中突出显示了.zip 文件。
    2. 选择上传,然后选择您的 lraTestLambda.zip 部署包。然后,选择 Save (保存)

    3. 在函数的代码选项卡中,在运行时设置下选择编辑,然后输入以下值。

      • 对于 Runtime (运行时),选择 Python 3.7

      • 对于 Handler (处理程序),请输入 lraTest.function_handler

    4. 选择 Save(保存)。

      注意

      AWS Lambda 控制台上的测试按钮不适用于此功能。AWS IoT Greengrass Core 软件开发工具包不包含在 AWS Lambda 控制台中独立运行 Greengrass Lambda 函数所需的模块。这些模块(例如 greengrass_common)是在函数部署到您的 Greengrass 核心之后提供给它们的。

    接下来,发布您的 Lambda 函数的第一个版本。然后,创建版本的别名

    Greengrass 组可以按别名(推荐)或版本引用 Lambda 函数。使用别名,您可以更轻松地管理代码更新,因为您在更新函数代码时,不必更改订阅表或组定义。相反,您只需将别名指向新的函数版本。

  7. 操作中,选择发布新版本

  8. 对于 Version description (版本描述),输入 First version,然后选择 Publish (发布)

  9. TestLRA: 1 配置页面上,从 Actions (操作) 中选择 Create alias (创建别名)

  10. 创建别名 页面上,对于 名称,输入 test。对于 Version (版本),输入 1

    注意

    AWS IoT Greengrass 不支持 $LATEST 版本的 Lambda 别名。

  11. 选择 Create(创建)。

    突出显示“Create (创建)”的“Create a new alias (创建新别名)”页面。

    现在,您可以将 Lambda 函数添加到 Greengrass 组。

步骤 3:将 Lambda 函数添加到 Greengrass 组

在该步骤中,您将该函数添加到您的组并配置该函数的生命周期。

首先,将 Lambda 函数添加到 Greengrass 组。

  1. 在 AWS IoT 控制台导航窗格的管理下,展开 Greengrass 设备,然后选择组 (V1)

  2. 选择要在其中添加 Lambda 函数的 Greengrass 组。

  3. 在组配置页面上,选择Lambda 函数选项卡。

  4. 我的 Lambda 函数部分下,选择添加

  5. 添加 Lambda 函数 页中,选择 Lambda 函数。Select TestLRA

  6. 选择 Lambda 函数版本

  7. Lambda 函数配置部分中,选择系统用户和组Lambda 函数容器化

     

    接下来,配置 Lambda 函数的生命周期。

  8. 对于 Timeout (超时),选择 30 seconds (30 秒)

    重要

    使用本地资源的 Lambda 函数(如本过程中所述)必须在 Greengrass 容器中运行。否则,如果尝试部署该函数,则部署将失败。有关更多信息,请参阅容器化

  9. 在页面底部,选择添加 Lambda 函数

步骤 4:将本地资源添加到 Greengrass 组

在该步骤中,您将本地卷资源添加到 Greengrass 组并为该函数授予对资源的读写访问权限。本地资源有一个群组级别的作用域。您可以给组中的任何 Lambda 函数授予权限以访问资源。

  1. 在组配置页面上,选择资源选项卡。

  2. 本地资源部分下,选择添加

  3. 添加本地资源 页面上,使用以下值:

    1. 对于 Resource name (资源名称),输入 testDirectory

    2. 对于 Resource type (资源类型),选择 Volume (卷)

    3. 对于 本地设备路径,输入 /src/LRAtest。主机操作系统上必须存在该路径。

      本地设备路径是核心设备文件系统上的资源的绝对路径。此位置位于函数在其中运行的容器之外。该路径不能以 /sys 开头。

    4. 对于 Destination path (目的地路径),输入 /dest/LRAtest。主机操作系统上必须存在该路径。

      目的地路径是 Lambda 命名空间中资源的绝对路径。此位置位于函数在其中运行的容器之内。

    5. 系统组所有者和文件访问权限 下,选择 自动添加拥有资源的系统组的文件系统权限)

      系统组所有者和文件访问权限选项可让您授予对 Lambda 进程的额外的文件访问权限。有关更多信息,请参阅组所有者文件访问权限

  4. 选择 Add resource (添加资源)资源页面显示新的 testDirectory 资源。

步骤 5:将订阅添加到 Greengrass 组

在该步骤中,您将两个订阅添加到 Greengrass 组。这些订阅在 Lambda 函数与 AWS IoT 之间启用双向通信。

首先,为 Lambda 函数创建一个订阅,用于将消息发送到 AWS IoT。

  1. 在组配置页面上,选择 订阅选项卡。

  2. 选择 Add(添加)。

  3. 创建订阅页面中,按如下所述配置源和目标:

    1. 对于源类型,选择 Lambda 函数,然后选择 TestLRA

    2. 对于目标类型,选择服务,然后选择 IoT 云

    3. 对于主题筛选条件字段中,输入 LRA/test,然后选择订阅

  4. 订阅页面显示新订阅。

     

    接下来,配置订阅以从 AWS IoT 调用函数。

  5. 订阅页面,选择添加订阅

  6. 选择您的源和目标页面,配置源和目标,如下所示:

    1. 源类型中,选择 Lambda 函数,然后选择 IoT 云

    2. 目标类型中,选择服务,然后选择 TestLRA

    3. 选择 Next(下一步)。

  7. 利用主题筛选您的数据页面上,对于主题筛选条件,输入 invoke/LRAFunction,然后选择下一步

  8. 选择 Finish (结束)订阅页面显示两个订阅。

步骤 6:部署 AWS IoT Greengrass 组

在该步骤中,您将部署组定义的当前版本。

  1. 确保 AWS IoT Greengrass 核心正在运行。根据需要在您的 Raspberry Pi 终端中运行以下命令。

    1. 要检查守护程序是否正在运行,请执行以下操作:

      ps aux | grep -E 'greengrass.*daemon'

      如果输出包含 root/greengrass/ggc/packages/1.11.6/bin/daemon 条目,则表示守护程序正在运行。

      注意

      路径中的版本取决于您的核心设备上安装的 AWS IoT Greengrass 核心软件版本。

    2. 启动进程守护程序:

      cd /greengrass/ggc/core/ sudo ./greengrassd start
  2. 在组配置页面上,选择部署

    注意

    如果在不进行容器化的情况下运行 Lambda 函数并且尝试访问附加的本地资源,部署将失败。

  3. 如果出现提示,则在 Lambda 函数选项卡的系统 Lambda 函数下,选择 IP 检测器,然后选择编辑,然后选择自动检测

    这使得设备可以自动获取核心的连接信息,例如 IP 地址、DNS 和端口号。建议使用自动检测,不过 AWS IoT Greengrass 也支持手动指定的终端节点。只有在首次部署组时,系统才会提示您选择发现方法。

    注意

    如果出现提示,请授予权限,以创建 Greengrass 服务角色并将其关联至当前 AWS 区域中的 AWS 账户。该角色将允许 AWS IoT Greengrass 访问您的 AWS 服务资源。

    Deployments (部署) 页面显示了部署时间戳、版本 ID 和状态。完成后,部署状态为 已完成

    有关问题排查帮助,请参阅故障排除 AWS IoT Greengrass

测试本地资源访问

现在,您可以验证是否正确配置了本地资源访问。要进行测试,您需要订阅 LRA/test 主题,并发布到 invoke/LRAFunction 主题。如果 Lambda 函数将预期的负载发送到 AWS IoT,则测试成功。

  1. 在 AWS IoT 控制台导航菜单的测试下,选择 MQTT 测试客户端

  2. 订阅主题下的主题筛选器中,输入 LRA/test

  3. 其他信息下,对于 MQTT 负载显示,请选择将负载显示为字符串

  4. 选择 Subscribe。您的 Lambda 函数将发布到 LRA/test 主题。

    突出显示“Subscribe to topic (订阅主题)”的“Subscriptions (订阅)”页面。
  5. 发布到主题下的主题名称中输入 invoke/LRAFunction,然后选择发布以调用您的 Lambda 函数。如果页面显示函数的三个消息负载,则测试成功。

    “Subscriptions (订阅)”页面,突出显示 invoke/LRAFunction 主题和“Publish to topic (发布到主题)”,以及包含消息数据的测试结果。

Lambda 函数创建的测试文件位于 Greengrass 核心设备上的 /src/LRAtest 目录中。尽管该 Lambda 函数写入到 /dest/LRAtest 目录中的文件,但该文件仅在 Lambda 命名空间中是可见的。您在常规 Linux 命名空间中看不到它。对目标路径的任何更改都会反映在文件系统上的源路径中。

有关问题排查帮助,请参阅故障排除 AWS IoT Greengrass