通过 AWS IoT 与开源 InfluxDB 和 Grafana 的集成来实现时间序列数据的可视化

本文详细介绍了如何基于 AWS IoT 基础组件和经过时间序列优化的 InfluxDB 实例来开发时变 IoT 解决方案以存储遥测数据,还介绍了如何设置时间序列可视化工具 Grafana。其中,InfluxDB 和 Grafana 均为开源工具。

AWS CLI
AWS IoT Core
AWS Lambda
物联网
教程
亚马逊云科技
Olawale Olaleye
难度
100 - 初级
时间
30 分钟
前提条件

海外区域: 注册 / 登录 亚马逊云科技

上次更新时间
2020 年 2 月 26 日

AWS IoT device simulator 可用于生成高频时间序列数据,利用 AWS IoT Core 进行数据摄取,接着由规则引擎触发的 Lambda 函数将负责将数据插入专门的时间序列数据库中。在一个用例中,我们使用了已预装 AWS CLI 和 InfluxDB 的 EC2 实例。我们还在这个实例上安装了 Grafana ,并开发了时间序列可视化功能和控制面板;在另一个用例中,我们使用 InfluxDB 中的数据创建了时间序列数据集(比如 CSV)并存储到了 Amazon S3 中,以便后续通过 Amazon SageMaker 来训练和部署用于异常检测的机器学习模型。

如上述架构图所示,模拟的边缘 IoT 设备会将 JSON 数据发布到 AWS IoT Core,接着由被触发的 Lambda 函数将 IoT 数据插入 InfluxDB 数据库实例,以便后续通过 Grafana 来开发控制面板。但这里规则引擎也可选择触发 Lambda Step Functions 来以特定的时间间隔(例如平均每隔五分钟)聚合数据并将其插入 InfluxDB中。InfluxDB 中的数据还可以导出为 CSV 文件并存储在 Amazon S3 存储桶中,以作为利用 Amazon SegeMaker 构建的异常检测等机器学习模型的数据源。

本文详细介绍了将 IoT 数据发布到时间序列数据库并开发实时控制面板,具体可分为四个步骤:

  1. 设置 AWS IoT Device Simulator;
  2. 在您的 Amazon EC2 实例中设置 InfluxDB 和 Grafana;
  3. 设置填充时间序列数据库所需的 AWS IoT Core 资源和 AWS Lambda 函数;
  4. 开发具有实时可视化功能的 Grafana 控制面板来跟踪 IoT 数据

第 1 步:设置 AWS IoT Device Simulator

首先,我们需要在目标亚马逊云科技账户中部署 AWS IoT Device Simulator。点击此链接可查看 AWS CloudFormation 模板的部署指南。不超过15分钟即可完成所有资源的配置。完成 AWS IoT Device Simulator 的部署后,创建一个名为 PressureDevice 的新设备类型,压力设备就会作为设备类型出现在 AWS IoT Device Simulator 中。

再为该设备类型添加几项信息属性:压力、粘度、传感器日期时间、设备 ID、该设备类型的客户端 ID以及数据频率。

所有属性的配置设置如下。请注意,每个设备和属性所分配的内部 ID 不会与此前创建的 ID 重复。

{
  "name": "pressure",
  "_id_": "wzCHpAvdm",
  "min": 500,
  "type": "int",
  "max": 1500
}

{
  "name": "viscosity",
  "_id_": "NJJXwHTdW",
  "min": 25,
  "type": "int",
  "max": 100
}

{
  "name": "sensordatetime",
  "_id_": "QyKD1oCtd",
  "tsformat": "default",
  "type": "timestamp"
}

{
  "name": "deviceid",
  "_id_": "W4uk2jVHX",
  "static": "false",
  "type": "shortid"
}

{
  "name": "clientid",
  "_id_": "nXHjO4oTL",
  "static": true,
  "type": "uuid"
}

接着,在模拟器页面的小部件界面,为 pressuresensor 设备创建20个新实例。实例启动之后,就会将数据发布到 AWS IoT Core(指定的 MQTT 主题,压力/数据)。

导航到 AWS 控制台,转到 AWS IoT Core 进行测试,检查能否收到来自模拟设备的数据。只需转到“测试”菜单并订阅此前指定的主题(压力/数据)即可。

现在就可以看到数据是如何从设备模拟器传输至 AWS IoT Core 的了。

第 2 步:在 EC2 中设置 InfluxDB 和 Grafana

接下来,您需要在 VPC 的私有子网中设置 Amazon EC2 实例。有关分步教程,请点击此链接。当然,还可以在独立的 Amazon EC2 实例(独立于 VPC)上安装 InfluxDB 和 Grafana。无论使用哪种方法,请务必将3000端口添加到安全组中以允许入站访问。在本文中,我们选择了 t2.micro 实例类型和 Ubuntu 发行版,通过 SSH 连接到了此前创建的 Amazon EC2 实例,并安装 InfluxDB 和 Grafana。

运行以下命令安装 InfluxDB。

wget https://dl.influxdata.com/influxdb/releases/influxdb_1.7.7_amd64.deb
 
sudo dpkg -i influxdb_1.7.7_amd64.deb

安装完成后,启动 InfluxDB 引擎。

sudo service influxdb start

现在就可以与 InfluxDB CLI 进行交互,以确认 InfluxDB 引擎能否正常运行。

influx

如需退出 InfluxDB CLI,输入“quit”命令即可。

quit

接下来,在同一个 EC2 实例上安装 Grafana。在生产环境下,需要将 Grafana 安装载在同个子网下单独的 EC2 实例上。

wget https://dl.grafana.com/oss/release/grafana_6.2.5_amd64.deb 
sudo apt-get update
sudo apt-get install libfontconfig1
sudo apt --fix-broken install

sudo dpkg -i grafana_6.2.5_amd64.deb

完成 InfluxDB 和 Grafana 的设置后,就可以创建数据库和表了。使用以下语法创建新的数据库和用户;如需退出数据库实例,输入“quit”命令即可。

influx

create database awsblog
 
create user awsblog with password 'YourPassword'

quit 

完成自定义安装时,需要添加 Telegraf(一种插件驱动型服务器代理,可用于收集和报告指标)。

注:在这一步中,可能还需要将 influxData 存储库添加到存储库中,有关进一步说明,请点击此链接

sudo apt install telegraf -y

接下来就可以启动并启用 Telegraf 了。

sudo systemctl start telegraf
 
sudo systemctl enable telegraf

输入以下命令,确认 Telegraf 是否正在运行中。

sudo systemctl status telegraf

接下来,将编辑后的基本配置保存到 /etc/telegraf/telegraf.conf 文件中。请在文件中找到以下内容,并将配置添加到 [[outputs.influxdb]] 之后。

:您可能需要执行 sudo 命令来保存文件,具体取决于您的操作系统和用户设置。在 nano 编辑器中,输入 CTRL-O 将文件保存到磁盘,或输入 CTRL+X 退出 nano 编辑器。

sudo nano /etc/telegraf/telegraf.conf

###############################################################################
# OUTPUT PLUGINS #
###############################################################################
# Configuration for sending metrics to InfluxDB
[[outputs.influxdb]]

database = "awsblog"
username = "awsblog"
password = "YourPassword"

最后,在 Amazon EC2 实例中完成 Grafana(图形引擎)的设置,并将 InfluxDB 作为数据源进行使用。为此,您可点击以下 URI 访问 Grafana UI。

http://<EC2-PublicDNS>:3000/

修改默认的用户名和密码 (admin/admin) 并设置数据源,确保指向 InfluxDB 实例的 URL 使用的是数据库实例的端口号(即 URL末尾加上 :8086)。

至此已经准备就绪。接下来就可以使用少量记录,确认 EC2 控制台能否将其插入到 InfluxDB 中。

influx

use awsblog
 
INSERT pressure,sensor=client001sensor01 value=1001,viscosity=34
INSERT pressure,sensor=client002sensor01 value=2101,viscosity=37
INSERT pressure,sensor=client003sensor01 value=0901,viscosity=38
INSERT pressure,sensor=client004sensor01 value=1201,viscosity=39
INSERT pressure,sensor=client005sensor01 value=1101,viscosity=60

quit

在接下来的步骤中,我们将启用该解决方案,使用 Lambda 函数将从 AWS IoT 规则中获取的传感数据插入到 InfluxDB 中。

第 3 步:设置 Lambda 函数和 AWS IoT Core资源

设置 Lambda 函数

在这一步中,在 Node.js 10.x 中创建新的 Lambda 函数,在其中粘贴以下代码,我们将其命名为 blogLambda2InfluxDB 。

index.js的代码如下:

const Influx = require('influx');

//This code writes data from IoT core rule via Lambda into InfluxDB 

exports.handler = async (event,context,callback) => {

    var pressureInputValue = JSON.parse(event.pressure);
    var viscosityInputValue = JSON.parse(event.viscosity);
    //Create clientID
    var clientid = JSON.stringify(event.clientid);
    var deviceid = JSON.stringify(event.deviceid);
    var sensorInputName = deviceid+clientid; 

    //var sensordatetime = JSON.stringify(event.sensordatetime);
    
    var result = writeToInfluxDB (pressureInputValue, viscosityInputValue,sensorInputName);
    
    callback(null, result);

  };

function writeToInfluxDB(pressureVar, viscosityVar,sensorVar)
{
    console.log("Executing Iflux insert");

    const client = new Influx.InfluxDB({
        database: process.env.INFLUXDB,
        username: process.env.INFLUXDBUSRNAME,
        password: process.env.INFLUXDBPWD,
        port: process.env.INFLUXDBPORT,
        hosts: [{ host: process.env.INFLUXDBHOST }],
        schema: [{
            measurement: 'pressure',
    
            fields: {
                pressureValue: Influx.FieldType.FLOAT, 
                viscosity: Influx.FieldType.FLOAT,
            },
    
            tags: ['sensorID']
        }]
    });
    
    client.writePoints([{
        measurement: 'pressure', fields: { pressureValue: pressureVar, viscosity: viscosityVar, },
        tags: { sensorID: sensorVar}
    }]) 
    console.log("Finished executing");
}    

Lambda 控制台界面应如下图所示。

接着,添加以下环境变量(将相关值替换为您自己的值)。

请注意 Lambda 函数是如何使用已设置的环境变量在 InfluxDB 中执行数据插入的。选择与 Amazon EC2 实例(InfluxDB 服务器)相同的执行角色、VPC、子网和安全组。

接着,遵循此链接中的分步指南,为 Lambda创建并执行角色(请参阅“执行角色和用户权限”标题下的内容)。

若是用于测试,请通过设置本地环境来访问 influx 实用程序。

执行以下命令在笔记本(安装 AWS CLI 的位置)或 EC2 上创建 lambda。

npm init
npm install —save influx
  • 请遵循此链接中的说明,将 AWS Lambda 函数的代码(详见步骤三中“index.js 的代码”)粘贴到 index.js 文件中,压缩后上传到您的 AWS Lambda 控制台中。

设置 AWS IoT Core 资源

导航至 AWS IoT 控制台,再转到“操作”菜单。创建一个名为 awsblog 的 IoT 规则,添加调用 AWS Lambda 函数的操作,以匹配以下语句。

SELECT pressure AS pressure, viscosity as viscosity, sensordatetime as sensordatetime, deviceid as deviceid, clientid as clientid FROM 'pressure/data'

接着,选择上一步创建的 AWS Lambda 函数 blogLambda2InfluxDB

第 4 步:开发 Grafana 实时控制面板

等到来自模拟设备的时间序列数据流入 InfluxDB 实例后,就可以使用 Grafana 开发可视化功能了。在此之前,需要访问 Grafana Web 界面,登陆托管 Grafana 的 Amazon EC2 实例,导航到 http://ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com:3000/login(请将 xxx -xxx-xxx-xxx替换为您的 Amazon EC2 实例的弹性 IP 地址),使用在第2步中创建的 Grafana 用户名和密码登陆。

再点击“加号”创建控制面板,将其命名为“压力和粘性”。

接着,使用以下设置添加一个新面板,将其重命名为“时间序列”和“移动平均线”(选择适当的指标空间和聚合方式),完成后的界面应如下图所示。

此外,还可添加更多的可视化面板来创建类似下图的控制面板。当然,控制面板的外观取决于您添加的面板和可视化类型。

总结

通过使用 AWS IoT Core、InfluxDB 和 Grafana 来可视化时间序列数据的有效架构,我们可以生成、收集和持久存储 IoT 生成的数据,并开发内容丰富的实时控制面板。在本文中,尽管我们只使用了模拟设备生成的数据,但根据以上步骤,您应该也能够举一反三,对振动、压力、温度传感器等实体 IoT 设备快速复现这些操作。

在本文中,我们演示了如何使用 AWS IoT Core 来实时摄取数据,以及如何使用开源数据库引擎 (InfluxDB) 和开源可视化平台 (Grafana) 来可视化所摄取的数据。在实际 IoT 应用中,时间序列数据无处不在,而想要实现 IoT 的价值、深入研究 IoT 传感器的数据,就必须实现时间序列数据的可视化。

此外,本文还演示了如何通过基本组件和亚马逊云科技的原生功能,来简化 IoT 应用的开发和时间序列数据的交付,以实现高度自定义的可视化。无论是从 AWS IoT Core 到规则引擎,还是从 AWS Lambda 到 InfluxDB 和 Grafana,您只需极少量的代码即可完成解决方案的设置和部署。此外,在数据流入 AWS IoT Core 后,还可轻松开发和自定义自己专属的控制面板,从而帮助团队通过快速迭代,获取理想的数据驱动型洞见。