Using AWS Lambda in IoT devices firmware upgrade scenario

xiaozhu12371237 2016-06-05 06:56:51


AWS Lambda是一个“可简单创建Lambda函数、无需管理的计算平台”。也可以这么理解:Lambda是一个针对AWS计算资源的IFTTT脚本创建器和管理器。

举个例子:你有一个照片类应用。照片上传到S3之后,需要在DynamoDB上记录新照片的元数据。Lambda的作用就是可以有一个地方放一个触发脚本来执行这个任务,而不用关心这个脚本运行在什么机器或者虚拟机上。也可以将Lambda理解为将functions(函数)从计算资源层抽象出来的服务。

云计算只是一个执行环境,应用的根本在于三者函数(functions,即业务逻辑的载体)+数据(data,即跟业务相关的输入与输出),以及这两者之间的交互——即事件(events。常见的事件如增加、变更、删除等)。比如当发生一个事件(event)时,执行某个函数(function),输出新的数据(data)。

Lambda服务的核心概念是Lambda function(简称function,函数),目前仅支持Node.js.

围绕function可以定义情景,包括执行环境(语言、内存、超时、IAM角色)以及这个function要触发的另一个function。function的代码和有关情景的元数据均存储在AWS中,以 ARN(Amazon Resource Name)的方式被外部识别。如需包含第三方库,可以放在ZIP文件中上传。

function上传之后,开发者可以将其指定到指定的AWS资源(如某个S3 bucket,某个DynamoDB表,某个Kinesis流),然后Lambda就会建立该资源跟你的function之间的关联。当资源方面发生变动,Lambda就会去自动张罗资源去执行你的function。用于运行function的资源的创建分配和释放都有Lambda自动来做,开发者完全不需要去干预。

每一个function具有双重的IAM角色:一个是触发角色(invocation role),决定Lambda执行某个function的权限;另一个是执行角色(execution role),决定该function操作AWS资源的权限。

基于Lambda服务,我们可以做IOT生态环境下devices的动态部署和升级

AWS的lambda函数将文件上传到S3 bucket。我们期望的文件是一个包含topic,value,retain域的JSON格式配置文件,这些域映射到使用NodeJS发送MQTT消息的基本例子。JSON文件如下:

{

"topic":"873bfdf00b00775c8c6fb16aa1554401/lambda",

"value": "hello wallace",

"retain": false

}

上传脚本upload.sh,置于目录“kmr-send-mqtt”下,该脚本被用来打包一个nodejs zip 应用作为Lambda函数

#! /bin/bash
ROLE="[your role arn]"

HANDLER="index.handler"

MEMORY=128

TIMEOUT=10

rm -rf node_modules/

npm install

FUNCTION=`basename \`pwd\``

PACKAGE="$FUNCTION.zip"

rm -rf ${PACKAGE}

zip -r ${PACKAGE} *.js node_modules @ --exclude=*aws-sdk*

aws lambda upload-function \

--function-name "$FUNCTION" \

--function-zip "${PACKAGE}" \

--role "$ROLE" \

--mode event \

--handler "${HANDLER}" \

--memory-size ${MEMORY} \

--timeout ${TIMEOUT} \

--runtime nodejs

脚本执行后生成Lambda
函数index.handler

对于的NodeJS
runtime 文件 "package.json",which
along side the upload.sh script

{
"name": "lambda-mqtt",

"version": "0.0.1",

"description": "MQTT from lambda",

"main": "index.js",

"dependencies": {

"mqtt": "^0.3.13"

}

}
lambda函数将读取事件源的输入事件并解析了S3对象的bucket和key。我们将使用AWS JavaScript SDK来获取对象,读到内存里并解析了MQTT上下文。然后,将启动MQTT客户端根据我们上传配置文件中的要求发送消息,。


NodeJS包中mian函数对应index.JS脚本,这是Lambda的执行角色

var mqtt=require('mqtt');

var AWS=require('aws-sdk');

var s3=newAWS.S3();

exports.handler=function(event,context){

console.log(JSON.stringify(event,null,''));

console.log(JSON.stringify(event.Records[0],null,''));

response=s3.getObject({Bucket:event.Records[0].s3.bucket.name,Key:event.Records[0].s3.object.key},function(err,data)
{

var message
= JSON.parse(data.Body.toString());

client=
mqtt.connect("mqtt://[thingfabric
username]:[thingfabric MD5 secret hash]@q.m2m.io:1883");

client.publish(message.topic, message.value,
{retain:
(message.retain !=null)&&message.retain});

client.end();

client.on("close",
(function() {return
context.done(null,"DONE");}));

client.on("error",
(function () {return
context.done(null,"ERROR");}));

});

};

Lambda作为触发角色,需要跟某个AWS资源关联,比如某个Kinesis流


这样在该Kinesis流发生变化时会触发Lambda。



...全文
1763 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

2,851

社区成员

发帖
与我相关
我的任务
社区描述
本论坛以AI、WoS 、XR、IoT、Auto、生成式AI等核心板块组成,为开发者提供便捷及高效的学习和交流平台。 高通开发者专区主页:https://qualcomm.csdn.net/
人工智能物联网机器学习 技术论坛(原bbs) 北京·东城区
社区管理员
  • csdnsqst0050
  • chipseeker
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧