本文介绍如何通过fun deploy命令或ROS方式将应用部署到云上。

前提条件

您已成功完成以下操作:
注意 本文介绍的内容后期将不再维护。如果您的函数计算资源是使用Funcraft管理的,建议您将资源迁移至Serverless Devs管理。

关于如何将函数计算的相关资源从Funcraft迁移到Serverless Devs进行管理的详细操作,请参见从Funcraft迁移到Serverless Devs

关于Serverless Devs的详细信息,请参见什么是Serverless Devs

关于如何使用Serverless Devs部署资源,请参见使用s deploy的相关命令部署资源

由此带来的不便,敬请谅解!

背景信息

Funcraft引入了一种全新的部署方式即ROS部署,使用ROS的部署方式使部署具备更完善的资源状态管理机制、回滚机制等优点。
优势 描述
具备更完善的资源状态管理机制 通过ROS部署应用时,使Funcraft能够准确地感知资源的新增、更新、删除以及不变,通过感知这些资源的状态变化,Funcraft可以做出正确的决策,达到预期的行为。
具备回滚机制 在部署应用的过程中,任何资源的操作失败,都会导致整个资源栈的回滚。通过ROS部署应用,当部署失败时可以回滚到上一个正确的状态,解决部署过程中服务不可用的问题。
灵活定义模型 通常一个template.yml用来描述一个完整的应用,您看到的template.yml内容,就是您部署到线上应用的最终形态,通过ROS部署可以更加灵活地部署应用。
明确部署差异 通过ROS部署应用,您可以了解到当前的模板文件是否与线上的文件同步,因此可以快速决策是否直接将本地模板部署到云上。
支持更多的云资源 ROS纳入了更多的云资源的管理,覆盖了使用者的全部使用场景。
支持快速创建多套开发环境 当需要创建多套开发环境时,无需手动修改资源的唯一名称等标识。
ROS支持在模板文件里描述更多资源。除了原有Funcraft定义的资源外,ROS支持的资源也可以在Funcraft的模板文件里声明。更多信息,请参见资源编排服务ROS。例如通过以下方式声明一个对象存储的Bucket实例。
Bucket:
  Type: 'ALIYUN::OSS::Bucket'
  Properties:
    BucketName: 'oss-unzip-demo-bucket'  //需替换成您真实的Bucket名称。

功能介绍

执行以下命令获取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

  use '--parameter-override', A parameter structures that specify input parameters for your stack template.
                              If you're updating a stack and you don't specify a parameter, the command uses the stack's existing value.
                              For new stacks, you must specify parameters that don't have a default value. Syntax: parameterkey=parametervalue.


Options:
  -t, --template [template]             The path of fun template file.
  -c, --only-config                     Update only configuration flags
  -p, --parameter-override <parameter>  A parameter structures that specify input parameters for your stack template.
  -y, --assume-yes                      Automatic yes to prompts. Assume "yes" as answer to all prompts and run non-interactively.
  --use-ros                             Deploy resources using ROS
  --use-nas                             Automatically upload local resources to NAS.
  --stack-name <stackName>              The name of the ROS stack
  --push-registry <pushRegistry>        Modify the image upload path
  -h, --help                            display help for command

fun deploy命令部署

  1. 在项目目录中创建一个Index.js文件,并将以下内容复制到Index.js文件中保存。
    var getRawBody = require('raw-body')
    
    module.exports.handler = function (request, response, context) {    
        // 获取请求体
        getRawBody(request, function (err, body) {
            var respBody = {
                headers: request.headers,
                url: request.url,
                path: request.path,
                queries: request.queries,
                method: request.method,
                clientIP: request.clientIP,
                body: body.toString()
            };
    
            response.setStatusCode(200);
            response.setHeader('content-type', 'application/json');
            response.send(JSON.stringify(respBody, null, 4));
        });
    };       
  2. 在项目目录下创建一个template.yml文件,将以下内容复制到template.yml文件中保存。
    ROSTemplateFormatVersion: '2015-09-01'
    Transform: 'Aliyun::Serverless-2018-04-03'
    Resources:
      local-http-test:
        Type: 'Aliyun::Serverless::Service'
        Properties:
          Description: 'local invoke demo'
        nodejs8:
          Type: 'Aliyun::Serverless::Function'
          Properties:
            Handler: index.handler
            CodeUri: './'
            Description: 'http trigger demo with nodejs8!'
            Runtime: nodejs8
          Events:
            http-test:
              Type: HTTP
              Properties:
                AuthType: ANONYMOUS
                Methods: ['GET', 'POST', 'PUT']       
    说明 如果您有需要忽略的文件或文件夹,例如不需要打包上传的函数代码ZIP包的文件,您可以在项目中创建.funignore文件,然后将不需要使用或需要忽略的文件名写入到.funignore文件中即可。
  3. 代码以及模板文件编写完成后,执行以下命令将服务部署到线上环境。
    fun deploy
    预期输出:
    using region: cn-shanghai
    using accountId: 188077086902****
    using accessKeyId: LTAI4G4cwJkK4Rza6xd9****
    using timeout: 10
    
    Waiting for service local-http-test to be deployed...
            Waiting for function nodejs8 to be deployed...
                    Waiting for packaging function nodejs8 code...
                    package function nodejs8 code done
                    Waiting for HTTP trigger http-test to be deployed...
                    methods: GET
                    url: https://188077086902****.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/local-http-test/nodejs8/
                    function http-test deploy success
            function nodejs8 deploy success
    service local-http-test deploy success

ROS方式部署

操作步骤

  1. 执行以下命令初始化示例项目。
    fun init event-nodejs8 -n RosDemo  
    • event-nodejs8:指定应用模板。
    • RosDemo:自定义部署项目的文件名称。
  2. 在项目目录中,执行以下命令将资源上传到对象存储中,实现项目打包。
    fun package --oss-bucket <bucketname>      

    <bucketname>需替换为Bucket的名称。

    说明
    • Bucket的地域需和创建的函数在同一个地域内。
    • 由于ROS部署无法直接使用本地的代码资源,要求资源必须“云化”,需先执行fun package命令将资源上传到对象存储中。
  3. 执行以下命令部署项目。
    fun deploy --use-ros --stack-name <stackName>        
    参数说明:
    • --use-ros:表示使用ROS的方式进行部署。
    • --stack-name:表示使用ROS部署时使用的资源栈名称。资源栈指使用模板文件部署的一整套应用即云端资源集合的ID。即使同一个模板文件,也可以通过指定不同的资源栈名称,实现部署多套应用。当通过模板文件进行部署时,会将模板文件的资源属性与所指定的资源栈进行对比并计算差异,进而完成线上资源的创建、删除及更新等操作。
      说明 --stack-name <stackName>即可以自定义,也可以省略,还可以使用已成功创建的资源栈名称,当省略或自定义时系统会自动创建资源栈。
    当执行成功后,您可以登录函数计算控制台查看到成功创建的服务及函数。