AWS IoT Greengrass
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如何使用 AWS 管理控制台配置本地资源访问

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

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

本教程介绍如何使用 AWS 管理控制台配置对 AWS IoT Greengrass Core设备上本地资源的访问权限。它包含以下高级步骤:

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

先决条件

要完成此教程,需要:

  • Greengrass 组和 Greengrass 核心 (v1.3 or later)。要创建 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 "/dest/LRAtest". Then it reads the file and # publishes the content to the AWS IoT "LRA/test" topic. import sys import greengrasssdk import platform import os import logging # Create a Greengrass Core SDK client. client = greengrasssdk.client('iot-data') volumePath = '/dest/LRAtest' def function_handler(event, context): client.publish(topic='LRA/test', payload='Sent from AWS IoT Greengrass Core.') try: 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.\n') with open(volumePath + '/test', 'r') as myfile: data = myfile.read() client.publish(topic='LRA/test', payload=data) except Exception as e: logging.error("Experiencing error :{}".format(e)) return
  2. AWS IoT Greengrass Core 开发工具包 下载 页面下载 适用于 Python 的 AWS IoT Greengrass Core 开发工具包。在 Python 部分,选择 v1.4.0 - Current version (on GitHub) (1.4.0 版本 – 最新版本(在 GitHub 上)),然后下载软件开发工具包。

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

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

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

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

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

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

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

首先,创建 Lambda 函数。

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

  2. 选择 Create function

  3. 选择 Author from scratch

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

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

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

    3. AWS IoT Greengrass 不会使用此角色,因此您可以创建或选择任何 Lambda 执行角色。

  5. 选择 Create function

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

     

    现在,上传您的 Lambda 函数部署程序包并注册处理程序。

  6. 在函数的 Configuration (配置) 选项卡上,对于 Function code (函数代码),使用以下值:

    1. 对于 代码输入种类,选择上传 .zip 文件

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

    3. 对于 Handler (处理程序),请选择 lraTest.function_handler

  7. 选择 Upload

    
      突出显示“Upload (上传)”的“Function code (函数代码)”部分。
  8. 选择您的 lraTestLambda.zip 部署程序包。

  9. 在页面顶部,选择保存

    
      突出显示“Save (保存)”的 TestLRA 函数页面。

    注意

    AWS Lambda 控制台上的测试键不可与该函数一同使用。AWS IoT Greengrass 核心 SDK 不包含在 AWS Lambda 控制台中独立运行 Greengrass Lambda 函数所需的模块。这些模块(例如 greengrass_common)会在被部署到您的 Greengrass 核心之后提供给这些函数。

    代码输入种类菜单中选择编辑内联代码,即可在函数代码部分中查看您的代码。

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

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

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

    
      “Actions (操作)”菜单中的“Publish new version (发布新版本)”选项。
  11. 对于 Version description (版本描述),输入 First version,然后选择 Publish

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

    
      “Actions (操作)”菜单中的“Create alia (创建别名)”选项。
  13. Create a new alias (创建新的别名) 页面上,对于 Name (名称),输入 test。对于 Version (版本),输入 1

    注意

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

  14. 选择 Create

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

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

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

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

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

  1. 在 AWS IoT Core 控制台中,选择 Greengrass,然后选择 Groups (组)

    
      AWS IoT Core 控制台的左侧窗格,突出显示了“Groups (组)”。
  2. 选择要在其中添加 Lambda 函数的 Greengrass 组。

  3. 在组配置页面上,选择 Lambdas,然后选择 Add Lambda

    
      突出显示包含“Lambdas”和“Add Lambda (添加 Lambda)”的组配置页面。
  4. Add a Lambda to your Greengrass Group (将 Lambda 添加到 Greengrass 组) 页面上,选择 Use existing Lambda

    
      突出显示“Use existing Lambda (使用现有 Lambda)”的“Add a Lambda to your Greengrass Group (将 Lambda 添加到 Greengrass 组)”页面。
  5. Use existing Lambda (使用现有 Lambda) 页面上,选择 TestLRA,然后选择 Next

  6. Select a Lambda version (选择 Lambda 版本) 页面上,选择 Alias:test,然后选择 Finish

     

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

  7. Lambdas 页面上,选择 TestLRA Lambda 函数。

    
      突出显示 TestLRA Lambda 函数的“Lambdas”页面。
  8. TestLRA 配置页面上,选择编辑

  9. Group-specific Lambda configuration (组特定的 Lambda 配置) 页面上,使用以下值:

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

    2. Lambda lifecycle (Lambda 生命周期) 下,选择 Make this function long-lived and keep it running indefinitely (使该函数长时间生存,保持其无限期运行):有关更多信息,请参阅Greengrass Lambda 函数的生命周期配置

    
      包含更新后属性的 TestLRA 页面。

    重要

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

  10. 在页面底部,选择 Update

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

在该步骤中,您将本地卷资源添加到 Greengrass 组并为该函数授予对资源的读写访问权限。本地资源具有组级别的范围,使其可供组中的所有 Lambda 函数访问。

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

    
      突出显示包含“Resources (资源)”的组配置页面。
  2. 本地选项卡上,选择添加本地资源

  3. Create a local resource (创建本地资源) 页面上,使用以下值:

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

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

    3. 对于 Source path (源路径),输入 /src/LRAtest。主机操作系统上必须存在该路径。

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

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

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

    5. Group owner file access permission (组所有者文件访问权限) 下,选择 Automatically add OS group permissions of the Linux group that owns the resource (自动添加拥有资源的 Linux 组的操作系统组权限)

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

      
     突出显示“Save (保存)”的“Create a local resource (创建本地资源)”页面。
  4. Lambda 函数从属关系下,选择选择

  5. 选择 TestLRA,选择读写访问权限,然后选择完成

    
      突出显示包含“Done (完成)”的 Lambda 函数从属关系属性。
  6. 在页面底部,选择保存资源页面显示新的 testDirectory 资源。

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

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

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

  1. 在组配置页面上,选择 Subscriptions (订阅),然后选择 Add Subscription

    
      突出显示“Subscriptions (订阅)”和“Add Subscription (添加订阅)”的组页面。
  2. 选择您的源和目标页面,配置源和目标,如下所示:

    1. 对于选择源,选择 Lambdas,然后选择 TestLRA

    2. 对于选择目标,选择服务,然后选择 IoT Cloud

    3. 选择 Next

      
        突出显示“Next (下一步)”的“Select your source and target (选择您的源和目标)”页面。
  3. Filter your data with a topic (利用主题筛选您的数据) 页面的 Optional topic filter (可选主题筛选条件) 中,输入 LRA/test,然后选择 Next

    
      突出显示“LRA/test”和“Next (下一步)”的“Filter your data with a topic (利用主题筛选您的数据)”页面。
  4. 选择 Finish订阅页面显示新订阅。

     

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

  5. Subscriptions (订阅) 页面上,选择 Add Subscription

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

    1. 对于选择源,选择服务,然后选择 IoT Cloud

    2. 对于选择目标,选择 Lambdas,然后选择 TestLRA

    3. 选择 Next

      
        突出显示“Next (下一步)”的“Select your source and target (选择您的源和目标)”页面。
  7. Filter your data with a topic (利用主题筛选您的数据) 页面的 Optional topic filter (可选主题筛选条件) 中,输入 invoke/LRAFunction,然后选择 Next

    
      突出显示“invoke/LRAFunction”和“Next (下一步)”的“Filter your data with a topic (利用主题筛选您的数据)”页面。
  8. 选择 Finish订阅页面显示两个订阅。

步骤 6:部署 AWS IoT Greengrass 组

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

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

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

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

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

      注意

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

    2. 要启动守护程序,请执行以下操作:

      cd /greengrass/ggc/core/ sudo ./greengrassd start
  2. 在组配置页面上,选择 Deployments (部署),然后从 Actions (操作) 菜单中,选择 Deploy (部署)

    
      突出显示“Deployments (部署)”和“Deploy (部署)”的组页面。

    注意

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

  3. Configure how devices discover your core (配置设备搜索您的核心的方式) 页面上,选择 Automatic detection

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

    
      突出显示“Automatic detection (自动检测)”的“Configure how devices discover your core (配置设备搜索您的核心的方式)”页面。

    注意

    在系统提示时,授予权限以创建Greengrass 服务角色,并将该角色与您在当前 AWS 区域中的 AWS 账户关联。该角色允许 AWS IoT Greengrass 访问您 AWS 服务中的资源。每个 AWS 账户只需要一个 Greengrass 服务角色,但相应角色必须与您在其中使用 AWS IoT Greengrass 的每个 AWS 区域中的 AWS 账户关联。

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

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

测试本地资源访问

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

  1. 在 AWS IoT Core 控制台主页上的左侧窗格中,选择 Test (测试)

    
      AWS IoT Core 控制台的左侧窗格,突出显示了“Test (测试)”。
  2. Subscriptions (订阅) 部分中,对于 Subscription topic (订阅主题),请输入 LRA/test。对于 MQTT payload display (MQTT 负载显示),选择 Display payloads as strings (将负载显示为字符串)

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

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

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

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

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