AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数 AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

本模块演示了如何配置 Lambda 函数并将其部署到您的 AWS IoT Greengrass Core 设备。其中包含 MQTT 消息收发、订阅、AWS IoT Greengrass 上的部署以及 Lambda 函数配置的信息。

本模块的第(1)部分说明如何在 AWS IoT Greengrass Core上部署 Lambda 函数,该函数向 AWS IoT Greengrass 云发送“Hello World”消息。[第 2 部分]讲述了在 AWS IoT Greengrass Core 上运行的按需和长时间生存的 Lambda 函数之间的差异。

创建并打包 Lambda 函数

  1. AWS IoT Greengrass Core 开发工具包 下载 页面下载 适用于 Python 的 AWS IoT Greengrass Core 开发工具包。

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

  2. 解压缩下载的程序包以获取 Lambda 函数代码和软件开发工具包。

    本模块中的 Lambda 函数使用:

    • examplesHelloWorld 中的 greengrassHelloWorld.py 文件。这是您的 Lambda 函数代码。
    • greengrasssdk 文件夹。这是开发工具包。

    以下代码来自 greengrassHelloWorld.py。 该函数每 5 秒将两条可能的消息之一发布到 hello/world 主题一次。

    #
    # Copyright 2010-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
    #
    
    # greengrassHelloWorld.py
    # Demonstrates a simple publish to a topic using Greengrass core sdk
    # This lambda function will retrieve underlying platform information and send
    # a hello world message along with the platform information to the topic
    # 'hello/world'. The function will sleep for five seconds, then repeat.
    # Since the function is long-lived it will run forever when deployed to a
    # Greengrass core.  The handler will NOT be invoked in our example since
    # the we are executing an infinite loop.
    
    import greengrasssdk
    import platform
    from threading import Timer
    
    
    # Creating a greengrass core sdk client
    client = greengrasssdk.client('iot-data')
    
    # Retrieving platform information to send from Greengrass Core
    my_platform = platform.platform()
    
    
    # When deployed to a Greengrass core, this code will be executed immediately
    # as a long-lived lambda function.  The code will enter the infinite while
    # loop below.
    # If you execute a 'test' on the Lambda Console, this test will fail by
    # hitting the execution timeout of three seconds.  This is expected as
    # this function never returns a result.
    
    def greengrass_hello_world_run():
        if not my_platform:
            client.publish(
                topic='hello/world',
                payload='Hello world! Sent from Greengrass Core.')
        else:
            client.publish(
                topic='hello/world',
                payload='Hello world! Sent from '
                        'Greengrass Core running on platform: {}'
                        .format(my_platform))
    
        # Asynchronously schedule this function to be run again in 5 seconds
        Timer(5, greengrass_hello_world_run).start()
    
    
    # Start executing the function above
    greengrass_hello_world_run()
    
    
    # This is a dummy handler and will not be invoked
    # Instead the code above will be executed in an infinite loop for our example
    def function_handler(event, context):
        return
    
    
  3. greengrasssdk 复制到包含 greengrassHelloWorld.pyHelloWorld 文件夹。

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

  4. 要创建 Lambda 函数部署程序包,请将 greengrassHelloWorld.py 文件和 greengrasssdk 文件夹保存到名为 hello_world_python_lambda.zip 的压缩 (.zip) 文件。(.py) 文件和开发工具包文件夹必须位于该目录的根目录中。

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

    现在已准备好创建 Lambda 函数和上传部署程序包。

  5. 打开 Lambda 控制台,选择 (添加第一个Lambda)

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

  6. 选择(新建Lambda)

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

  7. 将您的函数命名为 Greengrass_HelloWorld 并设置其余字段,如下所示:

    • 对于 Runtime (运行时),选择 Python 2.7
    • 对于权限,请保留默认设置。这将创建一个授予基本 Lambda 权限的执行角色。(此角色未由 AWS IoT Greengrass 使用。)

    选择创建函数

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

  8. 上传 Lambda 函数部署软件包:

    (a). 在(配置)选项卡上的(函数代码)下,设置以下字段:

    • 对于 (代码输入种类),选择上传 .zip 文件
    • 对于 (运行时),选择 Python 2.7
    • 对于 (处理程序),输入 greengrassHelloWorld.function_handler

    (b). 选择(上传),然后选择hello_world_python_lambda.zipAWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

    (c). 选择 (保存)

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

  9. 发布 Lambda 函数:

    (a.)(操作)中,选择(发布新版本)

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

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

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

  10. 为 Lambda 函数版本创建别名

    注意

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

    (a.)(操作)中,选择(创建别名)

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

    (b.) 将别名命名为 GG_HelloWorld,将版本设置为 1(对应于您刚刚发布的版本),然后选择 (创建)

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

    注意

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

为 AWS IoT Greengrass 配置 Lambda 函数

现在,已准备好为 AWS IoT Greengrass 配置 Lambda 函数。在此步骤中,还可以配置订阅,以允许 Lambda 函数与 AWS IoT 通信并为 Greengrass 组配置本地日志记录。

  1. 在 AWS IoT 控制台中的 Greengrass 下,选择 (组),然后选择在模块 (2) 中创建的组。

  2. 在组配置页面上,选择 Lambdas,然后选择右上角(添加 Lambda)

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

  3. 选择(使用现有Lambda)

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

  4. 搜索您在上一步中创建的 Lambda 的名称 (Greengrass_HelloWorld,而不是别名名称),选择它,然后选择 (下一步)

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

  5. 对于版本,选择(别名:GG_HelloWorld),然后选择 (完成)。您应该在您的组中看到 Greengrass_HelloWorld Lambda 函数,使用 GG_HelloWorld 别名。

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

  6. 选择省略号 ((…)),然后选择编辑配置

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

  7. 组特定的 Lambda 配置页面上,进行以下更改:

    • 超时设置为(25)秒。此 Lambda 函数在每次调用前会休眠 (20) 秒。
    • 对于 Lambda 生命周期,选择 Make this function long-lived and keep it running indefinitely (使此函数长时间生存,保持其无限期运行)

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

    注意

    长时间生存的 Lambda 函数在 AWS IoT Greengrass 启动后自动启动并在自己的容器(或沙盒)中保持运行。这与按需 Lambda 函数相反,后者在调用时启动,并在没有要执行的任务时停止。

  8. 为所有其他字段保留默认值,然后选择 (更新) 以保存您的更改。

    接下来,创建一个允许 Lambda 向 AWS IoT 发送MQTT 消息的订阅。

    Greengrass Lambda 函数可以与以下对象交换 MQTT 消息:

    • Greengrass 组中的设备
    • 组中的连接器
    • 组中的其他 Lambda 函数。
    • AWS IoT。
    • 本地影子服务。

    该组使用订阅来控制这些实体可以如何互相通信。订阅提供可预测的交互和一层安全性。

    订阅由源、目标和主题组成。源是消息的发起方,目标是消息的目的地。主题允许您筛选从源发送到目标的数据。源或目标可以是 Greengrass 设备、Lambda 函数、连接器、设备影子或 AWS IoT。

    注意

    订阅是定向的,也就是消息流为特定方向:从源流到目标。要允许双向通信,您必须设置两个订阅。

    Greengrass_HelloWorld Lambda 函数只将消息发送到 AWS IoT 中的 hello/world 主题,如以下 greengrassHelloWorld.py 代码段中所示:

    def greengrass_hello_world_run():
        if not my_platform:
            client.publish(topic='hello/world', payload='Hello world! Sent from Greengrass Core.')
        else:
            client.publish(topic='hello/world', payload='Hello world! Sent from Greengrass Core running on platform: {}'.format(my_platform))
        Timer(5, greengrass_hello_world_run).start()
    

    由于 Greengrass_HelloWorld Lambda 函数只将消息发送到 AWS IoT 中的 hello/world 主题,因此您只需要创建一个从 Lambda 函数到 AWS IoT 的订阅,如下文所示。

  9. 在组配置页面中,选择(订阅),然后选择(添加第一个订阅)

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

  10. (选择源)中,选择(选择)。然后,在 (Lambdas) 选项卡上,选择 Greengrass_HelloWorld 作为源。

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

  11. 对于(选择目标),选择(选择)。然后,在(服务)选项卡上,选择 IoT Cloud,然后选择(下一步)

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

  12. 对于(主题筛选条件),输入 hello/world,然后选择 Next (下一步)

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

  13. 选择 (完成)

  14. 配置组的日志记录设置。下面将配置 AWS IoT Greengrass 系统组件和用户定义的 Lambda 函数,以将日志写入核心设备的文件系统。

    (a.) 在组配置页面上,选择 (设置)

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

    (b.) 对于 (本地日志配置),选择 (编辑)

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

    (c.)(配置组日志记录)页面上,选择 (添加其他日志类型)

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

    (d.) 对于事件源,选择 (用户 Lambdas)(Greengrass 系统),然后选择 (更新)

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

    (e.) 保留日志记录级别和磁盘空间限制的默认值,然后选择 (保存)

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

将云配置部署到 AWS IoT Greengrass 核心设备

  1. 确保 AWS IoT Greengrass Core设备已连接到 Internet。

  2. 确保 AWS IoT Greengrass 守护程序正在您的核心设备上运行。在核心设备终端中运行以下命令。

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

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

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

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

      cd /greengrass/ggc/core/
      sudo ./greengrassd start
      

    现在已准备好将 Lambda 函数和订阅配置部署到您的 AWS IoT Greengrass Core 设备。

  3. 在 AWS IoT 控制台中的组配置页面上,从(操作)中选择(部署)

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

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

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

    第一次部署可能需要几分钟。当部署完成后,您应该在部署页面上的状态列中看到已成功完成

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

验证 Lambda 函数是否在设备上运行

  1. 从 AWS IoT 控制台的导航窗格中,选择(测试)

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

  2. 选择 (订阅主题),并配置以下字段:

    • 对于订阅主题,输入 hello/world。(先不要选择订阅主题。)
    • 对于服务质量,选择 0
    • 对于 MQTT payload display (MQTT 负载显示),选择 Display payloads as strings (以字符串形式显示负载)

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

  3. 选择(订阅主题)

    假定 Lambda 函数正在设备上运行,它将向 hello/world 主题发布消息,如下所示:

    AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数
AWS IoT Greengrass 入门-模块3(第 1 部分):AWS IoT Greengrass 上的 Lambda 函数

虽然 Lambda 函数继续向 hello/world 主题发送 MQTT 消息,但不要停止 AWS IoT Greengrass 守护程序。其余模块是在假定它正在运行的情况下编写的。

您可以从组中删除函数和订阅:

  • Lambdas 页面上,选择省略号 ((…)),然后选择 Remove function (删除函数)
  • Subscriptions (订阅) 页面上,选择省略号 ((…)),然后选择 Delete (删除)

在下一个组部署期间,将会从核心中删除函数和订阅。