Serverless Devs是一个开源开放的Serverless开发者工具,通过该工具您可以快速地开发、创建、测试和部署项目,实现项目的全生命周期管理。本文以部署运行环境为Node.js 14的函数为例,介绍如何使用Serverless Devs下载对应的函数计算应用模板,然后快速开发部署函数应用。

背景信息

本文介绍两种方式初始化项目。当您初次使用Serverless Devs时,建议您使用方式一体验Serverless Devs。如果您想了解关于Serverless Devs的更多信息,例如本地调试、远程调用、删除资源等操作,建议您使用方式二体验。

前提条件

  1. 开通函数计算服务
  2. 安装Serverless Devs和Docker
  3. 配置Serverless Devs

方式一:使用s命令管理资源

执行以下命令,初始化项目。
sudo s
请根据输出的交互提示,初始化项目。输出示例:
 No Serverless-Devs project is currently detected. Do you want to create a new project? Yes//在项目文件内未检测到Serverless-Devs项目。选择是否创建一个项目。

 Serverless Awesome: https://github.com/Serverless-Devs/Serverless-Devs/blob/master/docs/zh/awesome.md

 Hello Serverless for Cloud Vendors Alibaba Cloud Serverless//选择目标云厂商,本示例以阿里云为例。
 Hello, serverlesser. Which template do you like? Quick start [Deploy a Hello World function to FaaS]//选择您需要创建的模板。本示例以快速部署运行环境为Node.js 14的事件函数为例。
 Which template do you like? [Event] Node.js 14

 Create application command: [s init devsapp/start-fc-event-nodejs14]

 Please input your project name (init dir) start-fc-event-nodejs14//Serverless Devs默认为您生成一个项目名称,您也可以自定义该名称。
 file decompression completed

     ____  _     _ ___  _ _     _        _____ ____
    /  _ \/ \   / \\  \/// \ /\/ \  /|  /    //   _\
    | / \|| |   | | \  / | | ||| |\ ||  |  __\|  /
    | |-||| |_/\| | / /  | \_/|| | \||  | |   |  \__
    \_/ \|\____/\_//_/   \____/\_/  \|  \_/   \____/
 please select credential alias default//选择您在配置Serverless Devs时设置的别名。

    Welcome to the Aliyun FC start application
     This application requires to open these services:
         FC : https://fc.console.aliyun.com/

     * 项目初始化完成,您可以直接进入项目目录下,并使用s deploy进行项目部署。

 Thanks for using Serverless-Devs
 You could [cd /test/start-fc-event-nodejs14] and enjoy your serverless journey!
 If you need help for this example, you can use [s -h] after you enter folder.
 Document Star:https://github.com/Serverless-Devs/Serverless-Devs

 Do you want to deploy the project immediately? Yes//选择是否部署项目,本示例以选择部署项目为例。
 ......
helloworld:
  region:   cn-hangzhou
  service:
    name: hello-world-service
  function:
    name:       event-nodejs14
    runtime:    nodejs14
    handler:    index.handler
    memorySize: 128
    timeout:    60

方式二:使用s init命令管理资源

  1. 初始化项目。
    在目标文件内执行以下命令,初始化项目:
    sudo s init devsapp/start-fc-http-nodejs14
    说明 本示例以部署一个运行环境为Node.js 14的HTTP函数为例,介绍如何快速初始化一个项目。当需要部署其他运行环境的示例时,您可以将上述模板start-fc-http-nodejs14名称中http替换为其他类型的触发方式例如event,也可以将nodejs14替换为其他类型的运行环境。
    执行输出:
     Serverless Awesome: https://github.com/Serverless-Devs/Serverless-Devs/blob/master/docs/zh/awesome.md
     Please input your project name (init dir) start-fc-http-nodejs14//Serverless Devs会默认生成一个项目名称,您也可以自定义该名称。
     file decompression completed
    
         ____  _     _ ___  _ _     _        _____ ____
        /  _ \/ \   / \\  \/// \ /\/ \  /|  /    //   _\
        | / \|| |   | | \  / | | ||| |\ ||  |  __\|  /
        | |-||| |_/\| | / /  | \_/|| | \||  | |   |  \__
        \_/ \|\____/\_//_/   \____/\_/  \|  \_/   \____/
     please select credential alias default//选择您在配置Serverless Devs时设置的别名。
    
        Welcome to the Aliyun FC start application
         This application requires to open these services:
             FC : https://fc.console.aliyun.com/
    
         * 项目初始化完成,您可以直接进入项目目录下,并使用s deploy进行项目部署。
    
     Thanks for using Serverless-Devs
     You could [cd /test/start-fc-http-nodejs14] and enjoy your serverless journey!
     If you need help for this example, you can use [s -h] after you enter folder.
     Document Star:https://github.com/Serverless-Devs/Serverless-Devs
    
     Do you want to deploy the project immediately? No//选择部署项目。
    当成功初始化项目后,会在当前目录中生成一个start-fc-http-nodejs14文件夹,该文件夹内包含以下文件:
    • s.yaml:函数计算资源,该资源是以YAML规范定义的。关于YAML规范的详细信息,请参见YAML规范
    • s_en.yaml:同s.yaml。系统默认使用s.yaml文件,如需使用s_en.yaml文件,请在命令中显式指定。例如,部署应用时,命令中增加参数-t,即s deploy -t s_en.yaml -y
    • codecode文件夹内包含index.js文件,可在该文件内编辑函数代码逻辑。
    • readme.md:依赖清单文件,该文件内定义了项目所需的各个模块和项目的配置信息。
  2. 执行以下命令,进入项目目录内:
    cd start-fc-http-nodejs14
  3. 可选:构建应用。
    在项目目录内执行以下命令,构建应用:
    sudo s build
    执行成功该步骤后,会在当前目录中生成一个.s文件,存放输出的构建产物,该文件可用于本地调试和部署。
  4. 可选:本地调试应用。
    当您在本地完成应用的开发构建后,可能需要在本地调试验证功能是否正常。您可以按需选择命令调试函数:
    • HTTP函数
      sudo s local start
      执行输出:
      [2021-12-16 07:17:05] [INFO] [FC-LOCAL-INVOKE] - Using trigger for start: name: httpTrigger
      type: http
      config:
        authType: anonymous
        methods:
          - GET
      
      [2021-12-16 07:17:05] [INFO] [FC-LOCAL-INVOKE] - HttpTrigger httpTrigger of hello-world-service/http-trigger-nodejs14 was registered
              url: http://localhost:7013/2016-08-15/proxy/hello-world-service/http-trigger-nodejs14/
              methods: GET
              authType: anonymous
      
      Tips:you can also use these commands to run/debug custom domain resources:
      
      Start with customDomain:
      * s local start auto
      
      Debug with customDomain:
      * s local start -d 3000 auto
      
      
      Tips for next step
      ======================
      * Deploy Resources: s deploy
      helloworld:
        status: succeed
      function compute app listening on port 7013!
    • 事件函数
      sudo s local invoke
    当您执行调试命令后,由于函数类型不同返回结果也会不同:
    • HTTP函数
      当您的函数是HTTP函数时,执行完调试命令后,将在执行输出中返回一个URL地址,此时调试流程阻塞在这里,您可以使用以下方式触发函数执行:
      • 使用cURL工具触发函数执行
        curl http://localhost:7013/2016-08-15/proxy/hello-world-service/http-trigger-nodejs14/
      • 使用浏览器访问HTTP函数
        http://localhost:7013/2016-08-15/proxy/hello-world-service/http-trigger-nodejs14/
    • 事件函数

      如果您的函数是事件函数,执行完调试命令后,将立即返回调试结果。

  5. 部署应用。
    执行以下命令,将应用部署至函数计算:
    sudo s deploy -y
    执行输出:
     Checking Service, Function, Triggers (0.82s)
     Creating Service, Function, Triggers (0.6s)
     Creating custom domain (0.31s)
    
    Tips for next step
    ======================
    * Display information of the deployed resource: s info
    * Display metrics: s metrics
    * Display logs: s logs
    * Invoke remote function: s invoke
    * Remove Service: s remove service
    * Remove Function: s remove function
    * Remove Trigger: s remove trigger
    * Remove CustomDomain: s remove domain
    
    helloworld:
      region:   cn-hangzhou
      service:
        name: hello-world-service
      function:
        name:       http-trigger-nodejs14
        runtime:    nodejs14
        handler:    index.handler
        memorySize: 128
        timeout:    60
      url:
        custom_domain:
          -
            domain: http://http-trigger-nodejs14.hello-world-service.188077086902****.cn-hangzhou.fc.devsapp.net
      triggers:
        -
          type: http
          name: httpTrigger
    执行成功后,该命令会将应用部署至函数计算。
  6. 可选:远程调试应用。
    执行以下命令,远程调试应用:
    sudo s invoke -e '{"body": "","method":"GET","headers":{"header_1":"v1"},"queries":{"key":"value"},"path":"/"}'
    执行输出:
    Request url: https://188077086902****.cn-hangzhou.fc.aliyuncs.com/2016-08-15/proxy/hello-world-service/http-trigger-nodejs14/
    ========= FC invoke Logs begin =========
    FC Invoke Start RequestId: 6a3adedb-5d5d-4ac5-aa0b-2d43f4ace65c
    load code for handler:index.handler
    2022-03-04T08:39:14.770Z 6a3adedb-5d5d-4ac5-aa0b-2d43f4ace65c [verbose] hello world
    FC Invoke End RequestId: 6a3adedb-5d5d-4ac5-aa0b-2d43f4ace65c
    
    Duration: 66.23 ms, Billed Duration: 67 ms, Memory Size: 128 MB, Max Memory Used: 42.48 MB
    ========= FC invoke Logs end =========
    
    FC Invoke Result[Code: 200]:
    {
      path: '//',
      queries: { key: 'value' },
      headers: {
        accept: 'application/json',
        authorization: 'FC LTAI4G4cwJkK4Rza6xd9****:KZsoanKle4SoRO8EjyOjY3duLlVlR1mp78hjV9WG****',
        date: 'Fri, 04 Mar 2022 08:39:14 GMT',
        header_1: 'v1',
        host: '188077086902****.cn-hangzhou.fc.aliyuncs.com',
        'user-agent': 'Node.js(v14.17.4) OS(linux/x64) SDK(@alicloud/fc2@v2.5.0)',
        'x-forwarded-proto': 'http'
      },
      method: 'GET',
      requestURI: '/2016-08-15/proxy/hello-world-service/http-trigger-nodejs14//?key=value',
      clientIP: '47.97.XX.XX',
      body: ''
    }
    
    End of method: invoke
    由于本示例部署的函数是HTTP函数,所以在成功执行远程调试命令后,执行输出会返回一个URL,您可以使用cURL工具触发执行线上的函数:
    curl https://188077086902****.cn-hangzhou.fc.aliyuncs.com/2016-08-15/proxy/hello-world-service/http-trigger-nodejs14/
  7. 可选:删除应用。
    执行以下命令删除应用:
    sudo s remove service
    执行输出:
    Need to delete the resource in the cn-hangzhou area, the operation service is hello-world-service:
     ......
     Delete trigger hello-world-service/http-trigger-nodejs14/httpTrigger success.
     Delete function hello-world-service/http-trigger-nodejs14 success.
     Delete service hello-world-service success.
    [2022-03-04 08:40:26] [INFO] [FC] - Getting list on-demand: _FC_NAS_hello-world-service-ensure-nas-dir-exist-service
    [2022-03-04 08:40:26] [INFO] [FC] - Getting list provision: _FC_NAS_hello-world-service-ensure-nas-dir-exist-service
    [2022-03-04 08:40:26] [INFO] [FC] - Getting listAliases: _FC_NAS_hello-world-service-ensure-nas-dir-exist-service
    [2022-03-04 08:40:26] [INFO] [FC] - Getting list on-demand: _FC_NAS_hello-world-service
    [2022-03-04 08:40:26] [INFO] [FC] - Getting list provision: _FC_NAS_hello-world-service
    [2022-03-04 08:40:26] [INFO] [FC] - Getting listAliases: _FC_NAS_hello-world-service
    End of method: remove
    当成功执行该命令时,表示应用已被删除。