前言
欢迎大家来到无服务器(Serverless)编程的阿里云clouder lab实验课参与学习。
现在市场竞争激烈,在对业务创新周期要求越来越短,业务爆发越来越快的情况下,Severless编程模式很好的满足了业务的快速搭建、快速发展以及快速迭代的要求,对于中小企业以及创业公司,成本也是一个重要的考量。用户开发server端服务,常常面临开发效率,运维成本高,机器资源弹性伸缩等痛点,而使用Serverless架构可以很好的解决上述问题。下面是传统架构和Serverless架构的对比:
Item | Serverless | 传统方式搭建服务 |
---|---|---|
维护成本 | 维护成本低,无需管理服务器等基础设施,只需编写代码并上传,程序员从底层设备维护中解放出来,只考虑实际业务逻辑即可。 | 维护成本高,自行维护服务器,需要处理服务器宕机、服务器扩容等一系列底层琐碎的事情 |
可用性 | 可用性高,函数计算为用户准备弹性、可靠的计算资源,具有根据流量自动scale特性,对有明显波峰波谷的运用效果奇佳 | 服务器故障会对应用服务产生严重影响 |
费用 | 按需付费,只为实际使用的计算资源付费,代码未运行则不产生费用 | 需要支付服务器的费用,代码运行与否都要收费 |
为了让大家深刻体验serverless的优势,本教程通过对几款云产品的实际上手操作,来与大家分享如何通过函数计算粘合其他云产品技术来快速搭建门店智能监控视频分析运用
效果
30分钟快速搭建门店智能监控视频分析运用架构图
- 日志中有图片的数据信息,通过触发器推送到函数计算
- 函数计算解析出日志中的图片数据,将图片上传到oss
- 函数计算调用IMM服务,获取上一步解析出来的图片的人脸以及分组信息
- 函数计算将上一步的人脸以及分组信息存储到OTS
- 用户通过api网关调用函数计算,函数计算从OTS读取信息,并将处理后的信息返回给用户
后续操作及相关资源概览图
具体步骤
1. 获取云账号
- 1.1 每位观众入场都会得到一个云账户
-
1.2 获得账号ID和Accesskeys
- 1.2.1 进入账号管理复制并记录对应的
账号ID
- 1.2.2 进入Access Key管理界面,记录您的
AccessKey ID
及Secret
- 1.2.1 进入账号管理复制并记录对应的
- 1.3 下载文章最后的
package
附件
注意: 本教程所有的服务均在华东2(上海)region进行,下面每一步创建的阿里云资源的名字(阿里云AccessKeyId、AccessKeySecret,OTS的instance名字和表格名字,OSS的bucket名字,IMM的project名字和FaceSetId)都需要记录下来,后面代码会用到
2. 开通表格存储并创建对应的project和table
2.1. 登录阿里云官网-表格存储 ,并点击服务开通
2.2. 创建表格存储实例
- 2.2.1 登陆表格存储控制台
- 2.2.2 在控制台上创建实例,在
华东2
创建实例(比如名字叫szworkshop), 注意:在这里我们已经预先为您创建好了对应的实例是table,请在华东2
查找sz-instance
开头的实例,点击进去查看有没有face_detail
和face_cache
这两张表,如果没有,请按照下面的截图操作自己创建,最后把自己表格存储的实例名字记录下来。 - 2.2.3 进入实例,创建两个table,比如名字叫
face_detail
和face_cache
主键情况如下:
face_detail: [
('faceSetId', 'STRING'),
('timestamp', 'INTEGER'),
('faceId', 'STRING')
]
face_cache: [
('faceId', 'STRING')
]
截图如下图所示:
也可以利用package 附件的脚本create_tbl.py,修改代码中的ak,
python create_tbl.py
实现创建tableface_detail
和face_cache
3. 开通对象存储oss服务
3.1. 登录阿里云官网-对象存储 ,并点击立即开通
3.2. 进入对象存储-控制台 ,在华东2
创建一个公共读的bucket,并把自己bucket名字记录下来, 如下图:
4. 开通日志服务
4.1. 进入日志服务,点击立即购买
按钮
4.2. 在华东2
创建log project和logstore,在这里我们已经给您创建好了logproject和logstore(fc_log
, fc_trigger_log
), logstore video1
, video2
需要用户自己创建
其中
video1
和video2
: 两个摄像头采集的图像数据会分别写到这个两个logstorefc_log
用于记录后面的函数计算中函数的输出日志fc_trigger-log
用于记录日志触发器触发情况
比如创建 一个名叫video2
logstore操作如下:
最后效果如下:
5. 开通智能媒体管理
5.1 进入智能媒体管理,点击立即开通
按钮
5.2 进入智能媒体管理控制台,创建一个project szworkshop
注意:我们会给您创建好智能媒体管理的project和FaceSetId,在线查看
5.3 在project szworkshop
下面创建FaceSet
利用package
附件的脚本imm_op.py,修改对应的ak和imm project值 python imm_op.py CFS
就会成功创建一个FaceSet, 记住返回值中的FaceSetId, 如下面的FACE-0b1fe58b-58b5-44a5-9492-ea6d72918b83
python imm_op.py CFS
{u'Status': u'Running', u'Photos': 0, u'RequestId': u'7BF48069-07D5-4675-8BF6-3EB8EE23F4C5', u'ModifyTime': u'2018-03-20 20:29:43.021911969 +0800 CST', u'SetId': u'FACE-0b1fe58b-58b5-44a5-9492-ea6d72918b83', u'CreateTime': u'2018-03-20 20:29:43.021911969 +0800 CST'}
6. 开通API网关
6.1 进入API网关产品页,点击立即开通
7. 开通函数计算
7.1. 新建函数计算service服务
- 7.1.1 进入函数服务管理控制台
- 7.1.2 创建service, 选择
华东2
,步骤如下图中的1,2,3,4; 比如创建名叫ls-workshop
的service(名字自定义)
在上图中点开高级配置,配置日志项目和日志仓库(这个之前已经创建好了,也可以现在创建),其中第3步的同意授权(授权函数具有访问OTS,OSS,LOG,IMM 的权利)会跳转到如下页面:
点击同意授权
:
点击确定:
7.2. 在上一步创建的service服务下创建函数
-
7.2.1 创建函数
log_etl
, 具体操作如下面截图所示:
选择空白模板,runtime为python3
点击本地上传,上传附件中的log_etl.zip,上传成功后,修改函数入口为log_etl.handler
,然后点击下一步
创建成功后如图所示:
进入代码编辑界面,修改对应的配置,然后点击保存
按钮:
-
7.2.2 给函数
log_etl
创建LOG trigger, 点击触发器按钮进行编辑,其中时间间隔设置为10s,我们这里创建两个触发器,分别为trigger-1
和trigger-2
, 具体如下图所示:
在这里一个函数可以对应两个触发器
创建完两个触发器后:
日志触发器具体详情
触发器名称:触发器的名称只能包含字母,数字、下划线和中划线,不能以数字、中划线开头,且长度范围为1~256字节。
Project名称:日志服务Project名称。
Logstore名称:日志服务Logstore名称(数据源)。本触发器会定时从该Logstore订阅数据到函数服务进行自定义加工,该参数在ETL Job创建后不允许修改。
触发器日志:日志服务会定时触发函数服务的的函数执行,在触发过程中发生的异常、函数执行统计信息会记录到该 Logstore, 您可以为这个Logstore创建索引以备查看。
触发间隔:日志服务触发函数运行的间隔,定义日志服务触发函数执行的间隔,例如每60秒将logstore的每个shard最近60秒数据位置读出作为函数event调用函数执行,在函数内有用户逻辑读取shard数据做计算。如果logstore的shard流量较大(超过1MB/s或者更高),建议缩短函数的触发间隔,使得每次函数运行所处理的数据量是合理大小。
重试次数:日志服务根据触发间隔每次触发函数执行时,如果遇到错误(例如权限不足、网络失败、函数执行异常返回等),该参数定义本次触发所允许的最大重试次数。对于本次触发,如果超过最大重试次数仍无法成功的,需要等到下一次触发间隔到来时,由日志服务再次触发函数执行。重试对业务造成的影响,因具体的函数代码实现逻辑而异。
函数配置:日志服务将该配置内容作为函数event一部分传入函数,如何使用该函数由函数自定义逻辑决定。每一种函数实现所要求的函数配置可能是不同的,绝大部分默认提供的函数模板也需要参考说明填写您的参数。默认不传入任何参数时请填写:{}。
-
7.2.3 设置函数的event和调试
函数
log_etl
是日志触发调用的,日志传递给函数的event的格式具体详情, 一个例子如下(把下面的projectName改成自己的):
{
"parameter": {
},
"source": {
"endpoint": "http://cn-shanghai-intranet.log.aliyuncs.com",
"projectName": "1907026218698990",
"logstoreName": "video1",
"shardId": 1,
"beginCursor": "MTUyMTQ0NDc0OTI3NTM3MTE5NA==",
"endCursor": "MTUyMTQ0NDc0OTI3NTM3MTE5NA=="
},
"jobName": "ec0ebbf8f549e8a7e77888797d69084003830c63",
"taskId": "06bf8cc1-3d0c-4625-9205-2c191e32ee72",
"cursorTime": 1521643153
}
-
7.2.4 创建函数
get_show_info
, 具体操作如6.2.1所示上传代码
get_show_info.zip
,创建函数get_show_info
,函数入口为get_show_info.handler
, 截图如下:
创建成功后,也需要修改下代码中对应的配置的值:
7.3 给函数get_show_info
配置api网关
按照下面的截图操作进行,如果想了解更多api网关结合函数计算具体详情可以参考以函数计算作为 API 网关后端服务
-
7.3.1 创建api分组
-
7.3.2 在api分组内创建api
填写api网关的请求path,后面对二级域名/请求路径
的http请求就是对函数的访问
填写api对应的函数信息
填写api网关的返回值示例
{
"isBase64Encoded":true|false,
"statusCode":httpStatusCode,
"headers":{response headers},
"body":"..."
}
7.3.3 对api进行调试和发布
-
7.3.3.1 对api进行调试
-
7.3.3.2 对api进行发布
验证发布是否成功可以用如下命令(修改成自己的二级域名/请求路径):
curl -v "http://972ea82cf5334ee8adc7e318efa45455-cn-shanghai.alicloudapi.com/get_show_info"
7.3.4 将6.3.3获得的api网关的url
本教程中是http://972ea82cf5334ee8adc7e318efa45455-cn-shanghai.alicloudapi.com/get_show_info
)替换掉前端展示页面中的url(package
附件下client/js 目录里面的index.js), 之后打开本地页面,就可以愉快地看监控详情了。
总结
利用函数计算可以快速搭建serverless运用,结合oss,ots,imm和api网关可以丰富server的功能,免服务器,免运维,成本低,不用担心流量,只需要函数就可以实现,你值的拥有!
下来