如何使用AWS Lambda无服务器函数与InfluxDB

导航到

对于时序工作负载,无服务器函数的伸缩能力是一个主要优势,特别是对于可能存在间歇性连接的物联网设备,可能会突然发送数据。在这种情况下,当你可以使用无服务器函数并只为使用的计算资源付费时,为服务器支付24/7的费用是没有意义的。

在这篇文章中,你将学习如何使用InfluxDB的无服务器函数,同时也会了解InfluxDB平台提供的一些功能。

教程要求

要遵循这个教程,您需要一个运行中的InfluxDB实例和一个AWS账户。最快、最简单的方式是创建一个免费的InfluxDB Cloud账户。另一种选择是安装InfluxDB开源版本

对于本教程中的无服务器函数,我们使用AWS Lambda,这需要您有一个AWS账户。您也可以使用其他无服务器服务,如Google Cloud Functions或Azure Functions;一旦设置完成,代码将大致以相同的方式工作。

使用AWS Lambda将数据写入InfluxDB

您需要做的第一件事是将一些数据放入InfluxDB。您可以通过多种方式实现这一点

  • 使用InfluxDB UI – InfluxDB用户界面 允许您上传CSV或以行协议格式化的文本文件,或者直接在UI中输入行协议并提交。
  • Telegraf – Telegraf 是一个服务器代理,它拥有超过200个工具和服务的插件,可以用于收集数据并将其输出到50多个不同的目的地。其中一个输出是HTTP插件,它将数据作为HTTP POST请求发送,可以将其定义为AWS Lambda函数。
  • InfluxDB CLI – InfluxDB CLI 可以用于将数据写入InfluxDB并从命令行执行许多其他任务。
  • InfluxDB客户端库 – InfluxDB为14种不同的编程语言提供了客户端库

对于本教程,我们将使用JavaScript客户端库与AWS Lambda一起将数据写入InfluxDB。对于这个示例,我们将使用API Gateway通过HTTP请求来实现。

在AWS控制台中,您需要创建一个Lambda函数。完成此操作后,您需要创建一个Lambda层,这将允许您在Lambda函数中使用InfluxDB客户端库以及您想要在Lambda函数中使用的任何其他NPM包。为此,您需要在您的计算机上创建要利用的node modules和package.json文件,然后将其作为zip文件上传。以下是您想要的文件夹结构

Lambda functions - InfluxDB

这里的关键是要注意,外层目录必须命名为‘nodejs’。在该文件夹内,您只需像任何正常的nodeJS项目一样运行npm init并安装您的依赖项。本教程中需要的唯一包是InfluxDB JavaScript客户端库,可以使用以下命令安装

npm install --save @influxdata/influxdb-client

然后,您可以使用操作系统提供的任何zip压缩工具将nodejs目录压缩并作为层上传。为此,您只需转到AWS Lambda仪表板,查看侧边栏中“附加资源”部分,并单击“层”选项卡。一旦到达那里,您就可以单击橙色的“创建层”按钮。给它一个名称,上传zip文件,然后选择与您要为Lambda函数使用的版本匹配的NodeJS版本运行时。

Nodejs - lambda function

创建这个层的好处是可以重用它,这样您就可以在多个Lambda函数中访问InfluxDB客户端库,而无需再次执行此过程。您还可以为函数使用多个层,这样您可以为您的用例“分层”不同的功能和环境。

有了这个设置,您现在需要从主Lambda仪表板创建您的Lambda函数。给它任何您想要的名称,选择Node.js 14.x运行时,然后点击“创建函数”按钮。

在特定功能的仪表板中,您需要添加刚刚创建的层。这可以通过滚动到仪表板的底部并点击“添加层”来实现,然后在打开的页面上,您会点击“自定义层”选项卡并选择之前创建的层。

对于触发器,您需要使用亚马逊API网关触发器,以便可以通过HTTP请求调用函数。选择“创建API”,将其设置为HTTP API类型,并使用开放式安全。一旦创建了亚马逊API网关,点击它并复制API端点URL,这将在稍后用于我们的API请求。

在为Lambda函数编写代码之前,您需要使用InfluxDB账户令牌和凭证进行认证。要设置所有这些,您可以查看这个教程,它介绍了基础知识。您需要具体4样东西来运行代码

  • 账户组织名称 - 这是您创建账户时创建的,可以在设置中找到
  • 桶名称 - 您想要存储数据的InfluxDB桶的名称
  • 令牌 - 用于认证请求的API令牌
  • InfluxDB实例URL - 如果您使用的是云账户,此URL将取决于您在创建账户期间选择的云区域,此URL将是仪表板URL的子域名。您可以在此找到整个云URL列表。如果您使用开源版本,它将在localhost上,URL可以在此处找到。

在您的Lambda函数内部,您需要进入“配置”选项卡并为这些值中的每一个创建一些环境变量,以便可以将它们分配给变量。

InfluxDB ingest

设置完成后,让我们开始编写代码。以下是Lambda函数的所有代码。此模块将数据写入我们的InfluxDB实例,其中内联注释说明了每个阶段的操作

//import InfluxDB client, this is possible thanks to the layer we created
const {InfluxDB, Point, } = require('@influxdata/influxdb-client')

//grab environment variables
const org = process.env.org
const bucket = process.env.bucket
const token = process.env.token;
const url = process.env.url

//lambda event handler, this code is ran on every external request
exports.handler =  async (event) => {
    //parse the expected JSON from the body of the POST request
    var body = JSON.parse(event.body)

    //create InfluxDB api client with URL and token, then create Write API for the specific org and bucket
    const writeApi = await new InfluxDB({url, token}).getWriteApi(org, bucket);

    //create a data point with health as the measurement name, a field value for heart beat, and userID tag
    const dataPoint = new Point('health')
        .tag('userID', body['userID'])
        .floatField('heartRate', body['heartbeatRate'])

    //write data point
    await writeApi.writePoint(dataPoint)

    //close write API
    await writeApi.close().then(() => {
        console.log('WRITE FINISHED')
    })

    //send back response to the client
    const response = {
        statusCode: 200,
        body: JSON.stringify('Write successful'),
    };
    return response;
};

为了测试此函数并确保一切正常,您可以使用任何HTTP请求工具。我将使用Postman。如果您想了解更多关于如何使用Postman的信息,可以查看这个指南,它涵盖了Postman的基础知识和使用InfluxDB REST API。Postman中的请求将如下所示

Authenticate - Lambda function

如果一切正常,您应该会收到一条消息说“写入成功”。在向函数发送几个不同值和用户ID的请求后,您可以在InfluxDB UI中的数据探索选项卡中查看您的数据。点击您创建的桶名称,您应该会看到“健康”度量。这里有两个不同颜色的线条,因为我提交了带有两个不同用户ID标签的请求。尝试在仪表板中调整过滤选项和不同的图表样式,看看您能做什么。

InfluxDB UI - Lambda function

处理存储在InfluxDB中的数据

现在您在InfluxDB中有了一些数据,让我们来看看您可以使用这些数据做什么的例子。

使用AWS Lambda查询InfluxDB

就像您可以使用InfluxDB客户端库将数据写入InfluxDB一样,您也可以使用它们来查询数据。您可能想这样做的一个原因是向最终用户显示自定义UI。作为一个例子,您可以查看这个教程,它展示了如何使用Nivo ReactJS图表库。使用此方法,您可以通过JavaScript客户端库显示数据。

使用我们上面编写的示例“心跳数据”,您可以根据用户ID筛选数据,然后向他们展示他们的健康数据。为此,您可以使用AWS Lambda函数来为您的应用程序发起API请求。虽然您可以使用JavaScript从浏览器查询InfluxDB,但这会暴露您的API密钥,存在安全风险。通过使用无服务器函数,您可以保护您的API密钥安全,同时无需担心服务器管理。您只需编写请求数据的代码即可。

客户端库的另一个用途可能是数据分析。虽然Flux能够在数据分析方面做到几乎所有您想要的事情,但您可能更习惯于另一种编程语言,或者想要利用某些库和语言生态系统。您可以查看这个指南,了解如何使用Python从InfluxDB提取数据,然后使用Pandas数据帧转换该数据。基于此的更复杂示例是股票市场示例,它展示了如何使用Sci-kit learn和Keras进行价格预测

使用InfluxDB警报和任务与AWS Lambda

存储在InfluxDB中的数据的一些常见用途与高级数据处理相关。例如,您可以根据存储的数据进行某些数据转换和警报。对于数据转换,InfluxDB提供了任务,允许您在特定数据桶上运行计划中的Flux脚本,然后将数据输出到新的数据桶。一些常见的例子包括数据降采样,通过降低存储数据的精度来减少存储成本。在另一个示例中,您可以通过连接来自另一个来源的数据(如关系数据库)来丰富数据。其他常见用例包括数据清理、预测、创建报告、事件触发和数据生成。

许多这些数据转换任务也可以使用无服务器框架和函数来完成。您可能使用辅助服务来定期调度函数,但从成本和性能的角度来看,在InfluxDB任务中使用数据库内部完成此类工作,并且从可用性的角度来看,连接一切都是一项繁琐的任务。

您还可以监控数据,并在定义的阈值和参数不符合定义条件时创建警报。您可以设置这些阈值检查的频率,然后通过添加发送警报的端点来采取行动,如果数据超出范围。InfluxDB提供内置的与Slack和PagerDuty的集成,用于UI中的警报,Flux还提供了一些第三方集成,例如Discord、Telegram、ServiceNow和其他。如果您想有最大的灵活性,您还可以定义一个HTTP端点。您可以通过创建AWS Lambda函数来创建无服务器端点,然后使用该无服务器函数处理警报。一个示例可以是创建AWS Lambda函数,该函数接收警报并将短信发送给值班人员,使用Twilio或另一个短信服务。

总结

真正的收获是,通过使用InfluxDB,作为开发人员,您具有最大的灵活性。您可以在需要时熟悉Flux,并利用InfluxDB提供的所有内置功能,同时也有选择使用您喜欢的编程语言。

如果您想了解更多关于如何使用无服务器函数与InfluxDB以及其他有关如何使用InfluxData平台的优质资源,您可以查看以下链接

常见问题解答

“无服务器”与AWS Lambda无服务器函数的区别是什么?

区别在于Lambda是一种专门为提供无服务器功能能力而设计的AWS供应商服务。

相比之下,“无服务器计算”仅仅是指使用任何供应商系统将函数外包到远程服务器上。

一些专家解释说,“无服务器”是通用术语,而Lambda是AWS特定的术语。

为什么Lambda是无服务器的?

Lambda并不是无服务器,因为函数的运行根本不使用任何服务器。AWS Lambda是服务器无服务器,因为客户不需要使用自己的服务器,就可以在供应商的服务器上运行单个函数,因此从客户的角度来看,它是无服务器的。

如何使用无服务器部署Lambda函数?

简短的回答是,您将AWS Lambda服务集成到您的应用程序和API中,以便在给定的无服务器框架内利用该无服务器函数。

AWS无服务器函数的好处是什么?

无服务器函数是AWS提供的一种无服务器计算服务。它是一个事件驱动的计算平台,允许您上传代码来构建无服务器应用程序,而无需管理基础设施。在无服务器架构中,所有基础设施维护,如操作系统配置、补丁和安全更新,都由AWS云提供商处理。无服务器函数有几个好处

  • 成本节省:无服务器函数具有成本效益,因为您只需在事件发生并运行代码时才被收取数据处理费用。
  • 安全性:无服务器函数在容器中运行,它们将运行时环境与其它无服务器应用程序和外部来源隔离开来。
  • 速度:无服务器函数具有高性能,因为它们允许根据应用程序的流量自动扩展或缩减。
  • 简单性:无需担心基础设施管理、容量配置和硬件维护,团队可以使用AWS服务专注于应用程序设计、部署和交付。
  • 可靠性:无服务器函数不太可能发生故障。无服务器应用程序是云中一系列相互连接的服务,这使得它们自然具有冗余性。
  • 可伸缩性:无需增加整个无服务器应用程序的总资源分配,您可以使用按需扩展单个进程的Function-as-a-Service(FaaS)模型。这种灵活性降低了数据处理的不必要成本,并提高了整体应用程序效率。
AWS基础设施中哪些服务是无服务器的?
  • AWS Lambda函数:AWS Lambda函数是服务器无服务器框架的一部分。这些函数运行事件驱动的无服务器应用程序,其中计算资源由云提供商自动管理。
  • Amazon API Gateway:Amazon API Gateway是服务器无服务器框架中的AWS服务,允许开发者构建、测试、部署和监控API。
  • Amazon DynamoDB:Amazon DynamoDB是服务器无服务器堆栈的一部分,是一个完全管理的NoSQL数据库服务,允许您卸载设置、配置、扩展等管理任务。
  • Amazon S3:Amazon Simple Storage Service (S3)是Amazon Web Services (AWS)的对象存储平台,提供S3存储对象。
  • 亚马逊Kinesis: 亚马逊Kinesis是一个基于实时事件的流服务。
  • 亚马逊Aurora: 亚马逊Aurora是一个完全托管的亚马逊关系数据库服务(RDS),负责所有管理任务。它提供细粒度的点时间恢复。
  • AWS Fargate: AWS Fargate是一个无服务器计算引擎,采用按使用付费的模式,仅在您使用服务时才对计算实例收费。
  • 亚马逊SNS: 亚马逊简单通知服务(SNS)是一个简单、快速、可靠的、高度可扩展的消息服务。
AWS Lambda API是如何工作的,为什么它与AWS资源一起使用?

AWS Lambda是一个用于运行代码的无服务器事件服务。Lambda应用程序会自动为您管理计算资源。它在定价模式上与Fargate不同。Lambda按调用次数和每个事件的持续时间收费。另一方面,Fargate按CPU和内存的每秒使用量收费。

AWS Step Functions是无服务器吗?

是的。Step Functions是无服务器的。它是一个编排服务,允许您通过组合AWS Lambda和其他AWS服务来创建函数,从而构建用于Web应用程序的无服务器工作流。无服务器工作流可以帮助您监控工作流中的每个步骤,以验证其是否按预期顺序运行。