前言node
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute):
函数计算是一个事件驱动的服务,经过函数计算,用户无需管理服务器等运行状况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。函数计算更多信息
参考。
Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API 网关、日志服务等资源。它经过一个资源配置文件(template.yml),协助您进行开发、构建、部署操做。Fun 的更多文档 参考。
ROS: 阿里云资源编排服务(ROS)助您简化云计算资源的管理。您能够遵循ROS定义的模板规范,在模板中定义所需云计算资源的集合及资源间依赖关系。ROS自动完成全部资源的建立和配置,实现自动化部署和运维。更多文档参考。
备注: 本文介绍的技巧须要 Fun 版本大于等于 3.0.0+。
背景介绍
在 Fun 3.0 版本以前,Fun Deploy 功能只有一种部署方式,即直接使用 fun deploy 命令进行部署。
随着用户的不断反馈,虽然咱们一直在加强 deploy 的功能,但咱们 Fun 依旧在某些场景下作的依旧不够好:
没有完善的资源状态管理机制:原有的 Fun 部署的资源,只支持建立、更新两种操做。咱们但愿,在部署时,Fun 可以准确的感知到,哪些资源是新增的、哪些资源是更新的、哪些资源是被删除了的以及哪些资源是不变的。经过感知到这些资源的状态变化,Fun 才能做出正确的决策,达到预期的行为。
回滚机制缺失:一次部署每每涉及很是多的资源,而这些资源可能存在着错中复杂的依赖关系,其中的某服务部署失败,均可能会致使整个部署操做的失败,一旦部署失败,可否自动回滚到上一正确状态,是保证用户服务可用性的关键。
严格遵循模型定义:一般一个 template.yml 用来描述一个完整的应用,咱们想为用户提供保证,你看到的 template.yml 的内容,就是你部署到线上的应用的最终形态。
难以明确部署差别。若是是一个许久没有更新的应用,用户可能很难做出直接将本地模板部署到生产的决定。难于做出这种决定的缘由在于,用户也没法知晓当前的模板文件与线上是否为同步的状态。
支持有限的云资源。咱们已经为用户提供了比较多的云资源的支持,但即便这样,也很难覆盖全用户的场景,咱们须要归入更多的云资源的管理。
没法快速建立多套开发环境。因为没有资源集合的概念,因此,使用不一样的模板进行部署时,操做的单位永远是单个资源,因此,单个模板文件进行屡次部署时,操做的永远都是同一批资源。当须要建立多套开发环境时,须要手动修改资源的惟一名称等标识。
为了解决这些问题,咱们在 Fun 3.0 引入了一种全新的部署方式:ROS。
ROS 经过 Transform 宏实现了将函数计算的模板语法转换为 ROS 支持的语法。这意味着对于 Fun 规范文档 里描述的语法规则,ROS 是一样支持的。同时,ROS 支持的资源 也能在 Fun 模板文件中进行声明了,好比 RAM、函数工做流 等等。
ROS 部署方式的命令格式
可使用 -h,查看 fun deploy 的帮助文档:服务器
$ fun deploy -h Usage: fun deploy [options] [resource] Deploy a serverless application. use 'fun deploy' to deploy all resources use 'fun deploy serviceName' to deploy all functions under a service use 'fun deploy functionName' to deploy only a function resource with '--only-config' parameter, will only update resource config without updating the function code Options: -t, --template [template] The path of fun template file. -c, --only-config Update only configuration flags --use-ros Deploy resources using ROS --stack-name <stackName> The name of the ROS stack -h, --help output usage information
当部署 ROS 相关资源时,须要在 fun deploy 后面追加 --use-ros 以及 --stack-name 两个参数,--use-ros 表示使用 ROS 的方式进行部署,--stack-name 表示使用 ROS 部署时使用的资源栈的名称。
如何理解资源栈呢?简单理解起来就是使用模板文件部署的一整套应用(云端资源集合)的 ID。即便同一个模板文件,也能够经过指定不一样的资源栈的名称,实现部署多套应用。当经过模板文件进行部署时,会将模板文件的资源属性与所指定的资源栈进行对比并计算差别,进而完成线上资源的建立、删除、更新等操做。
ROS 部署示例app
直接执行下面的命令便可初始化一个简单的函数示例:less
fun init -n RosDemo event-nodejs8
在体验上,因为 ROS 部署,要求资源必须“云化”。也就是没办法直接使用本地的代码资源。必须先经过 fun package 命令将资源上传到 oss:运维
fun package --oss-bucket bucket-name
最后将资源经过 ROS 的方式进行部署:函数
fun deploy --use-ros --stack-name bucket-name
ROS 更多使用场景举例工具
经过在部署时,指定不一样的 stackName,能够部署应用到不一样环境:测试
fun deploy --use-ros --stack-name test fun deploy --use-ros --stack-name staging fun deploy --use-ros --stack-name prod ... ...
从网上、模板或者官方文档看到相关示例,进行一些测试后,想要将这些资源所有清理干净。能够打开 ROS 控制台,找到想要删除的资源栈,点击删除后。咱们测试时建立的全部云资源,就都会被正确的清理掉了。阿里云
在部署过程当中,任何资源的操做失败,都会致使整个资源栈的回滚,经过这种机制,能够成功解决部署过程当中的服务不可用的问题。云计算
除了原有的 Fun 定义的资源外,如今 ROS 支持资源也能够在 Fun 的模板文件里声明了,好比咱们能够经过下面的方式声明一个 oss 的 bucket 实例:
Bucket: Type: 'ALIYUN::OSS::Bucket' Properties: BucketName: 'oss-unzip-demo-bucket'
总结经过引入 ROS 的部署方式,解决了咱们在开篇提到的几个问题(除“部署差别查看”功能还在开发外,其余功能都可以在 Fun 3.0.0 版本中使用了)。本文做者:tanhe123原文连接本文为云栖社区原创内容,未经容许不得转载。