全部产品
云市场
云游戏

使用 fun deploy 进行应用部署

更新时间:2020-02-20 15:41:20

fun deploy 介绍

fun deploy 功能支持两种部署方式,直接使用 fun deploy 命令部署和使用 ROS 方式部署。

ROS 通过 Transform 宏实现了将函数计算的模板语法转换为 ROS 支持的语法。这意味着对于 Fun 规范文档 里描述的语法规则,ROS 是同样支持的。同时,ROS 支持的资源 也能在 Fun 模板文件中进行声明了,比如 RAM 、函数工作流 等等。

ROS 方式部署解决了以下问题:

  1. 没有完善的资源状态管理机制:原有的 Fun 部署的资源,只支持创建、更新两种操作。我们希望,在部署时,Fun 能够准确的感知到,哪些资源是新增的、哪些资源是更新的、哪些资源是被删除了的以及哪些资源是不变的。通过感知到这些资源的状态变化,Fun 才能作出正确的决策,达到预期的行为。
  2. 回滚机制缺失:一次部署往往涉及非常多的资源,而这些资源可能存在着错中复杂的依赖关系,其中的某服务部署失败,都可能会导致整个部署操作的失败,一旦部署失败,能否自动回滚到上一正确状态,是保证用户服务可用性的关键。
  3. 严格遵循模型定义:通常一个 template.yml 用来描述一个完整的应用,我们想为用户提供保证,你看到的 template.yml 的内容,就是你部署到线上的应用的最终形态。
  4. 难以明确部署差异。如果是一个许久没有更新的应用,用户可能很难作出直接将本地模板部署到生产的决定。难于作出这种决定的原因在于,用户也无法知晓当前的模板文件与线上是否为同步的状态。
  5. 支持有限的云资源。我们已经为用户提供了比较多的云资源的支持,但即使这样,也很难覆盖全用户的场景,我们需要纳入更多的云资源的管理。
  6. 无法快速创建多套开发环境。由于没有资源集合的概念,所以,使用不同的模板进行部署时,操作的单位永远是单个资源,所以,单个模板文件进行多次部署时,操作的永远都是同一批资源。当需要创建多套开发环境时,需要手动修改资源的唯一名称等标识。

fun deploy 命令部署

下面我们用一个简单的 http 触发器示例演示 fun deploy 命令部署函数。首先在项目根目录下创建一个 index.js 文件。

  1. var getRawBody = require('raw-body')
  2. module.exports.handler = function (request, response, context) {
  3. // get request body
  4. getRawBody(request, function (err, body) {
  5. var respBody = {
  6. headers: request.headers,
  7. url: request.url,
  8. path: request.path,
  9. queries: request.queries,
  10. method: request.method,
  11. clientIP: request.clientIP,
  12. body: body.toString()
  13. };
  14. response.setStatusCode(200);
  15. response.setHeader('content-type', 'application/json');
  16. response.send(JSON.stringify(respBody, null, 4));
  17. });
  18. };

接下来配置相关服务。在项目根目录创建一个 template.yml 文件:

  1. ROSTemplateFormatVersion: '2015-09-01'
  2. Transform: 'Aliyun::Serverless-2018-04-03'
  3. Resources:
  4. local-http-test:
  5. Type: 'Aliyun::Serverless::Service'
  6. Properties:
  7. Description: 'local invoke demo'
  8. nodejs8:
  9. Type: 'Aliyun::Serverless::Function'
  10. Properties:
  11. Handler: index.handler
  12. CodeUri: './'
  13. Description: 'http trigger demo with nodejs8!'
  14. Runtime: nodejs8
  15. Events:
  16. http-test:
  17. Type: HTTP
  18. Properties:
  19. AuthType: ANONYMOUS
  20. Methods: ['GET', 'POST', 'PUT']

代码以及模板文件编写完成后,就可以使用 fun deploy 命令一键将服务部署到线上环境了:

  1. $ fun deploy
  2. using region: cn-shanghai
  3. using accountId: ***********8320
  4. using accessKeyId: ***********1EXB
  5. using timeout: 10
  6. Waiting for service local-http-test to be deployed...
  7. Waiting for function nodejs8 to be deployed...
  8. Waiting for packaging function nodejs8 code...
  9. package function nodejs8 code done
  10. Waiting for HTTP trigger http-test to be deployed...
  11. methods: GET
  12. url: https://1984152879328320.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/local-http-test/nodejs8/
  13. function http-test deploy success
  14. function nodejs8 deploy success
  15. service local-http-test deploy success

ROS 部署方式的命令格式

可以使用 -h,查看 fun deploy 的帮助文档:

  1. $ fun deploy -h
  2. Usage: fun deploy [options] [resource]
  3. Deploy a serverless application.
  4. use 'fun deploy' to deploy all resources
  5. use 'fun deploy serviceName' to deploy all functions under a service
  6. use 'fun deploy functionName' to deploy only a function resource
  7. with '--only-config' parameter, will only update resource config without updating the function code
  8. Options:
  9. -t, --template [template] The path of fun template file.
  10. -c, --only-config Update only configuration flags
  11. --use-ros Deploy resources using ROS
  12. --stack-name <stackName> The name of the ROS stack
  13. -h, --help output usage information

当部署 ROS 相关资源时,需要在 fun deploy 后面追加 --use-ros 以及 --stack-name 两个参数,—use-ros 表示使用 ROS 的方式进行部署,—stack-name 表示使用 ROS 部署时使用的资源栈的名称。

如何理解资源栈呢?简单理解起来就是使用模板文件部署的一整套应用(云端资源集合)的 ID。即使同一个模板文件,也可以通过指定不同的资源栈的名称,实现部署多套应用。当通过模板文件进行部署时,会将模板文件的资源属性与所指定的资源栈进行对比并计算差异,进而完成线上资源的创建、删除、更新等操作。

ROS 部署示例

1. 初始化示例项目

直接执行下面的命令即可初始化一个简单的函数示例:

  1. fun init -n RosDemo event-nodejs8

2. 项目打包

在体验上,由于 ROS 部署,要求资源必须“云化”。也就是没办法直接使用本地的代码资源。必须先通过 fun package 命令将资源上传到 oss:

  1. fun package --oss-bucket bucket-name

3. 项目部署

最后将资源通过 ROS 的方式进行部署:

  1. fun deploy --use-ros --stack-name bucket-name

ROS 更多使用场景举例

1. 快速创建多套应用部署环境

通过在部署时,指定不同的 stackName ,可以部署应用到不同的环境:

  1. fun deploy --use-ros --stack-name test
  2. fun deploy --use-ros --stack-name staging
  3. fun deploy --use-ros --stack-name prod
  4. ... ...

2. 测试 demo 效果,并快速清理

使用相关示例进行一些测试后,想要将这些资源全部清理干净。可以 打开 ROS 控制台,找到想要删除的资源栈,点击删除后。我们测试时创建的所有云资源,就都会被正确的清理掉了。

3. 部署过程失败,自动回滚上一正确状态

在部署过程中,任何资源的操作失败,都会导致整个资源栈的回滚,通过这种机制,可以成功解决部署过程中的服务不可用的问题。

4. 在模板文件里描述更多资源

除了原有的 Fun 定义的 资源 外,现在 ROS 支持资源 也可以在 Fun 的模板文件里声明了,比如我们可以通过下面的方式声明一个 oss 的 bucket 实例:

  1. Bucket:
  2. Type: 'ALIYUN::OSS::Bucket'
  3. Properties:
  4. BucketName: 'oss-unzip-demo-bucket'