如何使用 Amazon Web Services Management Console配置本地资源访问 - Amazon IoT Greengrass
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

您正在查看Amazon IoT Greengrass Version 1.Amazon IoT Greengrass Version 2是最新的主要版本Amazon IoT Greengrass. 有关使用Amazon IoT Greengrass V2,请参阅Amazon IoT Greengrass Version 2开发人员指南.

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

如何使用 Amazon Web Services Management Console配置本地资源访问

此功能适用于Amazon IoT Greengrass核心 v1.3 及更高版本。

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

本教程介绍如何将Amazon Web Services Management Console配置对本地资源的访问权限,这些资源在Amazon IoT Greengrass核心设备。它包含以下高级步骤:

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

Prerequisites

要完成此教程,需要:

  • Greengrass 组和 Greengrass Core(v1.3 或更高版本)。要创建 Greengrass 组或核心,请参阅开始使用 Amazon IoT Greengrass

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

    • /src/LRAtest

    • /dest/LRAtest

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

    sudo chmod 0775 /src/LRAtest

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

在该步骤中,您将创建一个 Lambda 函数部署程序包,这是包括函数代码和依赖项的 ZIP 文件。您还可以下载 Amazon 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 Amazon 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 Amazon 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. Amazon IoT Greengrass核心开发工具包下载页面,下载Amazon IoT Greengrass核心软件开发工具包到您的计算机。

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

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

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

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

    这些区域有:lraTestLambda.zip文件是 Lambda 函数部署程序包。现在您已准备好创建 Lambda 函数和上传部署程序包。

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

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

首先,创建 Lambda 函数。

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

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

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

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

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

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

  4. 选择创建函数

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

     

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

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

      
                突出显示 .zip 文件的 “从中上传” 下拉菜单。
    2. 选择上传,然后选择您的lraTestLambda.zip部署程序包。然后,选择 Save (保存)

    3. 在存储库的代码选项卡,在Runtime 设置中,选择编辑,然后输入以下值。

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

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

    4. 选择 Save

      注意

      这些区域有:测试按钮上的Amazon Lambda控制台不适用于此函数。这些区域有:Amazon IoT Greengrass核心 SDK 不包含独立运行 Greengrass Lambda 函数所需的模块Amazon Lambda控制台。这些模块(例如greengrass_common)在这些函数部署到您的 Greengrass 核心后提供给这些函数。

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

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

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

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

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

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

    注意

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

  10. 选择创建

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

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

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

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

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

  1. 在Amazon IoT控制台的导航窗格中,选择Greengrass经典 (V1)Groups.

    
      的左侧窗格Amazon IoT控制台并突出显示 “组”。
  2. 选择要在其中添加 Lambda 函数的 Greengrass 组。

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

    
      突出显示包含“Lambdas”和“Add Lambda (添加 Lambda)”的组配置页面。
  4. 将 Lambda 添加到 Greengrass 组页面上,选择使用现有 Lambda

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

  6. 选择 Lambda 版本页面上,选择 Alias:test,然后选择完成

     

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

  7. 在存储库的LAMBDA页面上,选择 TestLRA Lambda 函数。

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

  9. Group-specific Lambda configuration (组特定的 Lambda 配置) 页面上,对于 Timeout (超时),选择 30 seconds (30 秒)

    重要

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

  10. 选择页面底部的更新

第 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 函数与Amazon IoT.

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

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

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

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

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

    3. 选择 Next (下一步)

      
        突出显示“Next (下一步)”的“Select your source and target (选择您的源和目标)”页面。
  3. 利用主题筛选您的数据页面上,对于主题筛选条件,输入 LRA/test,然后选择下一步

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

     

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

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

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

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

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

    3. 选择 Next (下一步)

      
        突出显示“Next (下一步)”的“Select your source and target (选择您的源和目标)”页面。
  7. 利用主题筛选您的数据页面上,对于主题筛选条件,输入 invoke/LRAFunction,然后选择下一步

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

第 6 步:部署Amazon IoT Greengrass组

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

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

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

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

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

      注意

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

    2. 启动守护程序:

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

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

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

  3. 如果出现提示,请在配置设备搜索您的核心的方式页面上,选择自动检测.

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

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

    如果出现提示,请授予创建Greengrass 服务角色,并将该函数与您的 Amazon Web Services 账户 在最新的 Amazon Web Services 区域 . 此角色允许Amazon IoT Greengrass访问您的资源Amazon服务。

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

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

测试本地资源访问

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

  1. 在存储库的Amazon IoT控制台主页的左侧窗格中,选择测试.

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

  3. 选择订阅主题。Lambda 函数将发布到 LRA/test 主题。

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

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

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

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