设计实现SAM--无服务器应用模型
Author:心谭
From:【Serverless】设计实现SAM--无服务器应用模型
Des: 专注算法与 web 开发的技术博客
什么是SAM?
sam全称是:Serverless Application Model,也就是无服务器应用模型。
它使用yaml语法来描述一个应用程序,服务商会对.yml后缀的sam文件进行解析,并按照文件描述部署相关服务。
应用场景
SAM的概念最初由AWS提出,用来描述程序所需要的Lambda function、Cloud DB等云端资源。

腾讯云云开发的扩展能力中,也使用SAM来描述扩展能力所需要的云开发资源,包括云函数、存储、数据库,甚至其他的云能力,例如短信发送。短信验证码登录 本身就是扩展,用到了腾讯云的短信能力。
再发挥一下,sam可以用来描述简单的UI视图,尤其适合表单的应用场景,如下所示:

实现简易的SAM
定义SAM
因为sam是yaml语法文件,所以需要解析yaml语法,使用yaml.js
举个例子,某个程序需要使用到云函数,并且需要创建两个数据表,SAM文件如下:
ApplicationName: 测试程序
# 云函数资源
Function:
# 运行环境
Container: nodejs 8.9
# 超时时间(秒)
Timeout: 60
Corn:
# 云数据库资源
Database:
# 需要创建的数据集合
Collections:
-
CollectionName: 'ext-collection-a'
-
CollectionName: 'ext-collection-b'
数据校验
由于前端输入的数据不可信,后端需要对传入的SAM进行校验。
随着依赖的资源字段增加,单纯使用 if-else 的逻辑判断,会让代码变得难以维护,可读性非常差。
通常有2种数据校验的思路:
- 借助
joi.js,在代码中增加校验逻辑 - 使用
ajv.js,分离Schema和代码逻辑
第2种思路耦合度更低,并且规则的改动和维护,不涉及代码改动,产品和运营同学也可以来维护规则。
按照schema的ajv语法,以前面的SAM文件为例,schema 的内容如下:
{
"type": "object",
"properties": {
"ApplicationName": {
"type": "string"
},
"Function": {
"type": "object",
"required": ["Container", "Timeout"],
"properties": {
"Container": {
"type": "string"
},
"Timeout": {
"type": "number"
},
"Corn": {
"type": ["string", "null"]
}
}
},
"Database": {
"type": "object",
"Collections": {
"type": "array",
"items": {
"properties": {
"CollectionName": {
"type": "string"
}
}
}
}
}
}
}
封装ajv的验证逻辑:
const Ajv = require('ajv')
/**
* 验证obj是否符合 Schema 定义
* @param {object} obj
* @param {string} schemaJson
* @return {boolean}
*/
function validateSchema(obj, schemaFilePath) {
const schemaJson = require(schemaFilePath)
const ajv = new Ajv()
const validate = ajv.compile(schemaJson)
const valid = validate(obj)
if (!valid) {
console.log('>>> 错误字段信息:', validate.errors)
}
return valid
}
变量注入
有些时候,某些变量是动态的。例如,用户信息可能在运行过程中被注入到上下文,数据集合名称需要前端用户表单传入。
举个例子,前面创建的两个数据集合的名称由前端表单传入,对应字段是:collectionNameA和collectionNameB。
# 云数据库资源
Database:
# 需要创建的数据集合
Collections:
-
CollectionName: '${env.collectionNameA}'
-
CollectionName: '${env.collectionNameB}'
整个流程总结:
- 服务端解析预设的SAM配置
- 识别
${}特殊字符串,替换变量 - 验证是否符合Schema定义的规则
参考链接
- AWS Serverless Application Repository
- AWS 无服务器应用程序模型 (SAM) 命令行界面介绍
- JSON Schema validation keywords
- AJV schema validation for nested object
设计实现SAM--无服务器应用模型的更多相关文章
- 由浅入深SCF无服务器云函数实践
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:陈杰,腾讯云架构平台部技术专家 近年来,互联网服务从一开始的物理服务器托管,虚拟机,容器,发展到现在的云函数,逐步无服务器化,如下表所示. ...
- 无服务器架构(Faas/Serverless)
摘要无服务器架构(Faas/Serverless),是软件架构领域的热门话题. AWS,Google Cloud和Azure - 在无服务器上投入了大量资金,已经在看到了大量专门针对Faas/Serv ...
- 使用腾讯云无服务器云函数(SCF)分析天气数据
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:李想 无服务器云函数(SCF)是腾讯云提供的Serverless执行环境,也是国内首款FaaS(Function as a Service ...
- 什么是Docker—无服务器计算服务
什么是Docker https://mp.weixin.qq.com/s?__biz=MzU0Mzk1OTU2Mg==&mid=2247483881&idx=1&sn=aa27 ...
- 下一代无服务器的发展形态: Serverless2.0
6 月 25 日,在上海召开的 KubeCon 2019 大会上,腾讯云重磅发布了下一代无服务器的发展形态:Serverless2.0.本文将以 Serverless 的概念.发展.形态.应用以及技术 ...
- Chromium的无锁线程模型C++代码示例
引言 作者:程序员bingo,主要关注客户端架构设计.性能优化.崩溃处理,有多年的Chromium浏览器开发经验. 多线程一直是软件开发中最容易出问题的环节,很多的崩溃.卡死问题都与多线程有关.在常用 ...
- Serverless无服务器架构详解
本文对Serverless架构的基础概念.具体产品.应用场景.工作原理进行详细解析. 基础概念 Serverless: 无服务器架构,即在无需管理服务器等底层资源的情况下完成应用的开发和运行,是云原生 ...
- 用花生壳实现内网映射,决解无域名、无公网IP、无服务器空间问题
无域名.无公网IP.无服务器空间用花生壳提供的免费内网映射吧.你的PC就是服务器,花生壳提供的自定义二级域名轻松访问你的个人网站. 1.首先你得注册哦,然后申请免费的域名(2个) 2.设置路由器,下面 ...
- Linux 下 简单客户端服务器通讯模型(TCP)
原文:Linux 下 简单客户端服务器通讯模型(TCP) 服务器端:server.c #include<stdio.h> #include<stdlib.h> #include ...
随机推荐
- 接口测试基础——session认证和token认证
总算是把这个过程理清楚了,现在我们的思路是:what?why?How?,实际上这些个机制产生的内部逻辑是从下至上的的:遇到问题了,想办法解决,总结归纳并取名.从解决一些小问题开始生长,不断打补丁直至完 ...
- 数据可视化之powerBI基础(五)深入了解Power BI的跨页钻取交互
https://zhuanlan.zhihu.com/p/79036123 在 PowerBI 中还有一种有趣的交互方式:跨页钻取.它可以通过点击某个数据点,钻取到另一个页面,进一步展示该数据点的详细 ...
- JS中this指向的更改
JS中this指向的更改 JavaScript 中 this 的指向问题 前面已经总结过,但在实际开中, 很多场景都需要改变 this 的指向. 现在我们讨论更改 this 指向的问题. call更改 ...
- nginx反向代理导致session失效的问题处理
一同事求援:后台系统的登录成功了,但不能成功登进系统,仍然跳转到登录页,但同一套代码另一个环境却没有问题. 背景 经了解,他对同一个项目使用tomcat部署了两个环境,一个在开发服务器上,一个在他本机 ...
- Serverless的概念&定义-无服务计算详解
过去几年间,Serverless 发展迅猛,与其相伴的还有从小程序.移动端等到前后端一体化的演进与实践,也正因如此,从云计算到前端,众多开发者都极为关注 Serverless到底是什么? 在国内,Se ...
- 肝了两天IntelliJ IDEA 2020,解锁11种新姿势, 真香!!!
IDEA2020版本正式发布已经有3个月了,当时由于各方面原因(太懒)也没有去尝试新功能.于是这个周末特意去在另一个电脑上下载了最新版的IDEA,并尝试了一下.总的来说呢,体验上明显的提升. 作为一个 ...
- tineMCE 踩坑:images_upload_handler
tineMCE 的官方示例提供了前端上传图片方法 images_upload_handler 的写法. 但官方写的有点问题,上传会报错. 不过修改也很简单: images_upload_handler ...
- p72_电子邮件
一.电子邮件格式 信封 abcd@xx.com 内容 2.1 首部(To, Subject)-> (From,To,Subject,Date) 2.2 主体 二.电子邮件组成结构 三.SMTP ...
- ”initialization failure:0x0000000C“错误,何解?
今天开机后打开软件,报出这样的警告”initialization failure:0x0000000C“. 我问了度娘,看了很多回答,答案参差不齐.其中,有个回答还是很不错的(刚好我的是win10系统 ...
- JSON.stringify和JSON.parse的用法
用法概述 所有的现代浏览器都支持 JSON 对象,有两个非常有用的方法来处理 JSON 格式的内容: JSON.parse(string) 接受一个 JSON 字符串并将其转换成一个 JavaScri ...