亚马逊AWS官方博客
AWS Greengrass – 在互连设备上运行 AWS Lambda 函数
在 re:Invent 大会期间发布的文章 (AWS Greengrass – 无处不在的现实世界计算) 中,我首次介绍了 AWS Greengrass。当时我们推出了 AWS Greengrass 的有限预览版,并邀请您注册。
正如我当时指出的那样,许多 AWS 客户希望在现场收集和处理数据,而现场的网络连接通常很慢,有时还时断时续,并不可靠。利用 Greengrass,他们可以在基于现场的小型简单设备上应用 AWS 编程模型。它建立在 AWS IoT 和 AWS Lambda 的基础上,支持访问 AWS Cloud 中不断增加的各种服务。
利用 Greengrass,您可以访问在现场运行的计算、消息收发、数据缓存和同步服务,这些服务并不依赖与 AWS 区域的稳定高带宽连接。您可以在 Python 2.7 中编写 Lambda 函数,并将其从云部署到 Greengrass 设备,同时使用 Device Shadows 来维护状态。您的设备和外设可以使用本地消息收发互相通信,后者并不通过云进行传递。
现已公开发布
今天我们将在US East (Northern Virginia) 和 US West (Oregon) 区域公开发布 Greengrass。在预览版本中,AWS 客户已成功获得 Greengrass 的实践操作体验,并开始围绕它构建应用程序和业务。在后文中,我将分享一些早期的成功案例。
Greengrass 核心代码可在每台设备上运行。它允许您在设备上部署和运行 Lambda 应用程序,支持通过安全网络传递本地 MQTT 消息,并可确保设备和云之间的对话通过安全连接完成。Greengrass 核心还支持安全的无线软件更新,包括 Lambda 函数。它包括消息代理、Lambda 运行时、Thing Shadows 实现和部署代理。Greengrass 核心和可选的其他设备共同组成 Greengrass 组。该组包括配置数据、Greengrass 核心的设备和身份列表、Lambda 函数列表以及一组定义消息应发往何处的订阅。在部署过程中,所有这些信息都将复制到 Greengrass 核心设备。
您的 Lambda 函数可以使用三个不同软件开发工具包中的 API:
适用于 Python 的 AWS 软件开发工具包 – 该软件开发工具包允许您的代码与 Amazon Simple Storage Service (S3)、Amazon DynamoDB、Amazon Simple Queue Service (SQS), 和其他 AWS 服务交互。
AWS IoT 设备软件开发工具包 – 该软件开发工具包 (适用于 Node.js、Python、Java 和 C++) 可帮助您将硬件设备连接到 AWS IoT。C++ 软件开发工具包具有几项额外功能,包括对 Greengrass Discovery Service 的访问权和支持根 CA 下载。
AWS Greengrass 核心软件开发工具包 – 该软件开发工具包提供的 API 允许本地调用其他 Lambda 函数,发布消息和使用 Thing Shadows。
您可以在启用了 OverlayFS 和用户命名空间功能的 x86 和 ARM 设备 (具有版本 4.4.11 或更高版本 Linux 内核) 上运行 Greengrass 核心。虽然大部分 Greengrass 部署将针对专业化的工业级硬件,但您也可以在 Raspberry Pi 或 EC2 实例上运行 Greengrass 核心进行开发和测试。
在本文中,我使用了附加到 BrickPi 的 Raspberry Pi,它通过 WiFi 连接到我的家庭网络:
Raspberry Pi、BrickPi、盒子和所有其他部件均在 BrickPi 3 初学者工具包中提供。您需要一些 Linux 命令行专业知识和一定的动手能力将所有这一切组装起来,不过如果我都能做到,您肯定也可以。
Greengrass 的实际使用
我可以从控制台、API 或 CLI 访问 Greengrass。我将使用控制台。Greengrass 控制台的简介页面允许我定义组,添加 Greengrass 核心,并向组中添加设备:
单击 Get Started,然后单击 Use easy creation:
然后为组命名:
并为第一个 Greengrass 核心命名:
准备好后,单击 Create Group and Core:
这将运行几秒钟,然后提供可供下载的安全资源 (两个密钥和一个证书) 以及 Greengrass 核心:
我下载这些安全资源并将它们放到一个安全的地方,然后选择并下载所需版本的 Greengrass 核心软件 (适用于我的 Raspberry Pi 的 ARMv7l),最后单击 Finish。
现在我打开 Pi 的电源,并将安全资源和软件复制到其中 (我将它们放在一个 S3 存储桶中,并使用 wget
下载它们)。这是此时的外壳程序历史记录:
重要更新:正如我在 AWS 安全团队的一位细心的同事指出的那样,这不是向设备分发密钥的好方法。我本来可以使用 AWS CLI 从加密的存储桶中下载,通过剪切和粘贴复制它们,或者使用 USB 闪存盘。
我按照用户指南中的说明创建新用户和组,然后运行 rpi-update
脚本,并安装几个程序包,包括 sqlite3
和 openssl
。几次重启后,我就可以继续了!
接下来,仍然遵循指示,解压缩 Greengrass 核心软件,并将安全资源移动到其最终目的地 (/greengrass/configuration/certs
),在这个过程中为它们指定通用名称。目录看起来如下所示:
下一步是将核心与 AWS IoT 事物关联起来。返回到控制台,点击浏览组和 Greengrass 核心,找到 Thing ARN:
将证书名称和 Thing ARN 插入到 config.json
文件中,同时填充缺失的 iotHost
和 ggHost
部分:
启动 Greengrass 守护程序 (这是我的第二次尝试;第一次我把其中一个路径名称拼错了):
在命令行中度过愉快的时光后 (这让我回想起了使用 Unix v7 和 BSD 4.2 的日子),现在是时候再次转到视觉界面了!访问我的 AWS IoT 控制面板,看到我的 Greengrass 核心正在与 IoT 建立连接:
我转到 Lambda 控制台并使用 Python 2.7 运行时创建一个 Lambda 函数 (IAM 角色在这里无关紧要):
以常用方式发布函数,然后跳转到 Greengrass 控制台,单击我的组,并选择添加一个 Lambda 函数:
然后选择要部署的版本:
我还将此函数配置为长期存在而不是按需提供:
我的代码会将消息发布到 AWS IoT,所以我通过指定源和目标来创建一个订阅:
我还在订阅上设置一个主题筛选条件 (hello/world):
确认完成的设置并保存我的订阅,现在我已准备就绪,可以部署代码了。重新访问我的组,单击 Deployments,并从 Actions 菜单中选择 Deploy:
选择 Automatic detection 以便继续:
由于这是我的第一个部署,我需要创建一个服务级角色,以便为 Greengrass 授予访问其他 AWS 服务的权限。直接单击 Grant permission:
可以看到每个部署的状态:
代码现在已在我的 Pi 上运行!它向主题 hello/world 发布消息;我可以通过转到 IoT 控制台,单击“Test”并订阅该主题,来查看这些消息:
消息如下所示:
完成所有设置工作后,我可以通过上传、发布和部署代码的新版本来进行迭代开发。我计划使用 BrickPi 来控制一些 LEGO Technic 电动车,并发布从一些传感器收集的数据。敬请关注相关文章!
Greengrass 定价
作为 AWS 免费套餐的一部分,您可以在三台设备上免费运行一年 Greengrass 核心。在下一级别 (3 到 10,000 台设备),有两个选项可用:
- 即付即用 – 每台设备每个月 0.16 USD。
- 年度承诺 – 每台设备每年 1.49 USD,节省 17.5% 的成本。
如果您想在 10,000 台以上的设备上运行 Greengrass 核心,或者想做出更长期的承诺,请与我们联系;有关所有定价模型的详细信息,请参阅 Greengrass 定价页面。
-Jeff