最全!即学即会 Serverless Devs 基础入门(下)
作者 | 刘宇(阿里云 Serverless 产品经理)
在上篇《最全!即学即会 Serverless Devs 基础入门》中,我们阐述了工具链的重要性,并对安装方式 & 密钥配置进行了讲解。但是在 Serverless Devs 的规定中,一个 Yaml 可以被认为是一个 Serverless 应用,因此本文将继续带领各位了解下 Yaml 的使用规范。
Yaml 的使用规范
Serverless Devs 可以通过指定格式的 Yaml 对 Serverless 应用进行描述,在 Serverless Devs 的规定中,一个 Yaml 可以被认为是一个 Serverless 应用。
Yaml 的格式需要按照 Serverless Devs 的规范,提供相对应的资源/行为描述文件,且该文件还需要符合以下条件:
拓展名可以是.yaml 或.yml
格式必须符合Yaml规范 (https://yaml.org/spec/1.2.2/)
对于需要通过描述文件进行环境隔离的项目,建议将文件命名为 s-{ENV}.yml 格式。例如:s-prod.yaml。
在默认情况下,Serverless Devs 开发者工具会默认该描述文件的名称为 s.yaml 或 s.yml,且 s.yaml 的优先级大于 s.yml,即在一个 Serverless 应用下,同时出现 s.yaml 与 s.yml 时,系统会优先识别和使用 s.yaml。
当然,开发者也可以通过-t,--template [templatePath]进行指定,例如,在某应用在生产环境下的描述文件名为 s-prod.yml,则可以在执行相关命令时,增加参数-ts-prod.yml 或者--templates-prod.yml。
描述文件格式/规范
关于 ServerlessDevs 所支持的资源/行为描述文件基本格式为:
例如,一个相对完整的 Yaml 案例可以是:
元数据相关描述
在该格式中:
关于 Service 参数:
变量赋值
Serverless Devs 的 Yaml 文件支持多种变量格式:
获取当前机器中的环境变量:{env(secretId)}
获取外部文档的变量:{file(./path)}
获取全局变量:${vars.*}
获取其他项目的变量:${projectName.props.*}
获取 Yaml 中其他项目的结果变量:${projectName.output.*}
服务顺序
如果一个 ServerlessApplication 模型对应的 Yaml 文件中有过多的服务,系统会默认分析部署顺序,该部署顺序分为两个步骤:
分析项目中的依赖关系
有依赖关系的按照依赖关系从前到后部署,无依赖关系的按 Yaml 配置的从上到下部署
行为描述
在 ServerlessApplication 模型对应的 Yaml 文件中,可以针对服务,提供对应的行为操作,其基本格式是:
例如:
当 ServerlessDevs 开发者工具执行到该服务时,会在进行相关的命令之行之前,优先按照顺序执行 pre-命令的操作,所有内容完成执行之后,再执行 post-命令的操作。
以下面的 Yaml 为例:
当开发者在当前应用下执行了 deploy 命令,系统将会按照以下顺序进行操作:
在./backend_src 目录下执行 s exec -- publish
在./backend_src 目录下执行 s build
调用组件 vue-component 的 deploy 方法,并将 props 和项目的基本信息传入到组件 vue-component 的 deploy 方法中
在./frontend_src 目录下执行 s clean
以上顺序仅适用于整个流程没有出错的前提下,如果流程出现错误,系统将会进行报错,并终止后续流程的执行。
通过命令操作应用
所谓的自定义命令指的是由组件决定的命令。由于 ServerlessDevs 开发者工具,本身并不具备任何业务相关的能力(值得包括不限于函数的部署、应用的构建、项目的测试等),所以,这些能力都将会由组件提供,通过 ServerlessDevs 开发者工具进行透出。
例如,某应用的资源/行为描述文件如下:
通过该 Yaml 文件可以看出以下信息:
该应用的名字是 FullStack,将会使用密钥 xxx-account1;
该应用拥有三个服务:
backend 服务:使用了 django-component 组件
user—frontend 服务:使用了 vue-component 组件
admin-frontend 服务:使用了 vue-component 组件
如果此时 django-component 组件和 vue-component 组件支持的自定义命令为:
|
则可以通过自定义命令实现应用级操作和服务级操作。
1)应用级操作
在当前项目下,可以执行 s [自定义命令]实现应用纬度的操作。
执行 s deploy 或者 s remove 时,由于 backend、user—frontend、admin-frontend 三个服务对应的组件,均支持 deploy 和 remove 方法,所以此时系统会按照服务的部署顺序,进行三个服务分别对应的组件的 deploy 或 remove 操作;此时,系统的 exit code 为 0;
执行 s test 时,由于 user—frontend、admin-frontend 两个服务对应的组件并不支持 test 方法,所以此时系统会执行 backend 对应组件(django-component)的 test 操作;此时,系统会对 user—frontend、admin-frontend 两个服务进行警告,但是并不会报错,最终的 exit code 为 0;
如果在执行相关的命令时,backend、user—frontend、admin-frontend 三个服务任何一个服务在执行过程中出现了错误,系统则会报错,并终止下一步的操作,此时,系统的 exit code 为 101;
2)服务级操作
在当前项目下,可以执行 s [服务名] [自定义命令]实现服务级操作。
执行 s backend deploy 等,可以针对服务 backend 进行 deploy 相关的操作,如果顺利完成与其操作,系统的 exit code 为 0;否则,出现错误,系统的 exit code 为 101;
执行 s admin-frontend test 是,由于服务 admin-frontend 对应的 test 方法是不存在的,此时系统将会认为是未找到组件方法,系统的 exit code 为 100;
多种操作模式下的工具体系
众所周之,目前大部分的 Serverless 开发者工具均是通过 Yaml 等进行资源描述,少部分的 Serverless 开发者工具是通过命令行直接操作,无论是通过 Yaml 进行资源描述,还是通过纯命令行的操作,可以说两者各有各的好处。而在 ServerlessDevs 开发者工具中,这两者均得以有效的支持。
Serverless Devs 开发者工具从根本上提供了两种使用方法。
Yaml 模式:需要依赖资源描述文档进行操作的模式
Cli 模式:可以在任何目录下直接执行,而不需要依赖资源描述文档;
这两者的核心区别是:
如果想要使用 Yaml 模式,在当前目录下,必须要有 s.yaml/s.yml 文件,或通过-t/--template 指定的资源部描述文件;
如果想要试用 Cli 模式,则必须是 s cli 组件名方法参数的格式进行,此时不需要 Yaml 文件;
举一个非常简单的例子,如果有一个应用的资源描述文件 s.yaml 如下:
此时,可以执行 s deploy 进行 myApp 应用部署,如果执行 s backend-starter deploy 则可以进行 myApp 应用下的 backend-starter 项目/服务部署。
此时,部署过程中,所需要的相关参数,可以通过该 Yaml 文件进行读取。
但是,在某些情况下,并不方便直接使用 ServerlessDevs 规范的 Yaml 文件(例如,将线上资源同步到本地,或者要将 Funcraft 的 Yaml 转换成为 Serverless Devs 的 Yaml),此时可以选择纯命令行形式,即 s cli 模式。
在 s cli 模式下,由于不会读取 Yaml 等资源描述文件,所以很多参数都需要自行填写,这时的填写方法有两种:
通过 s cli 天然支持的 -p/--prop 参数,进行相关 Yaml 参数的赋值,例如上述案例的 s backend-starter deploy,此时可以改写成:
通过 demo 组件本身所支持的一些参数,例如通过 s clidevsapp/demo -h,可以得到帮助信息,部分内容如下:
特点对比
设计思路
为什么要同时存在 Yaml 模式和 Cli 模式?
因为在长期的实践过程中,发现通过 Yaml 进行资源描述会相对来说更简单和方便,例如 K8S 等也都是通过 Yaml 进行资源描述的;但是,在某些情况下,Yaml 文件也可能成为一种负担,例如想要查看某个服务下的函数列表,查看某个地区下的服务列表,因为这样一个简单的事情要额外的去完成一个 Yaml 文件,就显得过于臃肿,所以,在 Serverless Devs 项目中,同时保留了两种使用方法。
附录
[1]Serverless Devs 社区 GitHub:https://github.com/serverless-devs/serverless-devs
评论