有奖调研

应用管理

最近更新时间:2021-11-24 11:24:17

概述

每次执行 sls deploy,都是部署一个 serverless 应用。一个 serverless 应用是由单个或者多个组件实例构成,每个组件对应一个实例。

每个实例都会涉及一个 serverless.yml 文件,该文件定义了组件的一些参数,这些参数在部署时用于生成实例的信息。例如 region,定义了资源的所在区。

单实例应用与多实例应用在项目组织上会有一些差别,如下图所示:

单实例应用

项目中只引入一个组件,部署时只生成一个组件实例,这样的应用为单实例应用。

单实例应用一般不需要关心应用名称配置,如果有需要自定义应用名称,可直接在组件的 serverless.yml 中配置。

多实例应用

项目中引入多个组件,部署时生成多个组件实例,这样的应用为多实例应用。

多实例应用需要自定义应用名称,以保证所有组件在统一的应用下进行管理。一般会把应用名称定义在项目目录的 serverless.yml 中,以便所有的组件继承同一个应用名。

Serverless.yml 文件

serverless.yml 文件中定义了应用组织参数及组件 inputs 参数,每次部署时会根据 serverless.yml 文件中的配置信息进行资源的创建、更新和编排。

一份简单的 serverless.yml 文件如下:

# serverless.yml

# 应用信息
app: expressDemoApp #  应用名称,默认为与组件实例名称
stage: ${env:STAGE} #  用于开发环境的隔离,非必填,默认为 dev
# 组件信息
component: express # (必填) 引用 component 的名称,当前用到的是 express-tencent 组件
name: expressDemo # (必填) 组件创建的实例名称

# 组件配置
inputs:
  src:
    src: ./ 
    exclude:
      - .env
  region: ap-guangzhou 
  runtime: Nodejs10.15
  functionName: ${name}-${stage}-${app} #云函数名称
  apigatewayConf:
    protocols:
      - http
      - https
    environment: release

yml 文件中配置信息:

应用信息

参数 说明
org 组织信息,默认腾讯云 APPID。保留字段,不建议使用。
app 应用名称,默认与组件信息中的实例名称一致。对于单实例应用和多实例应用 app 参数的定义方式会有不同,详情请参考 部署应用
stage 环境信息,默认为 dev。通过定义不同的 stage,为 serverless 应用开发、测试、发布提供独立的运行环境。详情请参考 环境隔离

组件信息

参数 说明
component 引用 component 的名称,sls registry 查询您可以引入的组件。
name 创建的实例名称,每个组件在部署时将创建一个实例。

参数信息

inputs 下的参数为组件配置参数,不同的组件参数不同。为保证环境隔离,资源唯一,组件资源名称默认会采用 ${name}-${stage}-${app} 格式。

部署应用

单实例应用

serverless.yml 文件中不配置应用名称 app,部署时会默认生成与实例名称 name 相同的 app 应用名称。

例如创建一个 SCF 项目,项目目录如下:

scfDemo
 |- index.js
 └── serverless.yml

其中 serverless.yml 文件配置如下:

component: scf
name: myscf

inputs:
  src: ./
  runtime: CustomRuntime
  region: ap-guangzhou
  functionName: ${name}-${stage}-${app} #云函数名称

  events:
    - apigw:
        parameters:
          endpoints:
            - path: /
              method: GET

在 scfDemo 目录下执行 sls deploy 进行部署,默认将生成一个 app 为 myscf 的应用,该应用下包含一个叫 myscf 的 SCF 实例。

对于单实例应用项目,一般使用默认应用名称即可。如果要自定义应用名称,可直接在 serverless.yml 中定义,如:

app: scfApp #自定义 app 为 scfApp

component: scf
name: myscf

inputs:
  src: ./
  runtime: CustomRuntime
  region: ap-guangzhou

  events:
    - apigw:
        parameters:
          endpoints:
            - path: /
              method: GET

在 scfDemo 目录下执行 sls deploy 进行部署,将生成一个 app 为 scfApp 的应用,该应用下包含一个叫 myscf 的 SCF 实例。

多实例应用

项目包含多个组件,必须给所有组件统一应用名称。一般我们会在项目根目录下定义一个 serverless.yml 文件进行应用名称配置。

例如部署 Vue + Express + PostgreSQL 全栈网站,项目目录如下:

fullstack
 |- api
 |   |- sls.js
 |   |- ...
 |      └── serverless.yml
 |- db
 |      └── serverless.yml
 |- frontend
 |   |- ...
 |      └── serverless.yml
 |- vpc
 |      └── serverless.yml
 |- scripts
 └── serverless.yml

项目目录 fullstack 下的 severless.yml 文件配置了 app:

# 项目应用信息

app: fullstack

每个组件目录下的 severless.yml 文件配置了组件信息和参数信息,如 api 目录下的 serverless.yml:

#api 配置信息

component: express
name: fullstack-api

inputs:
  src:
    src: ./
    exclude:
      - .env
  functionName: ${name}-${stage}-${app}
  region: ${env:REGION}
  runtime: Nodejs10.15
  functionConf:
    timeout: 30
    vpcConfig:
      vpcId: ${output:${stage}:${app}:fullstack-vpc.vpcId}
      subnetId: ${output:${stage}:${app}:fullstack-vpc.subnetId}
    environment:
      variables:
        PG_CONNECT_STRING: ${output:${stage}:${app}:fullstack-db.private.connectionString}
  apigatewayConf:
    enableCORS: true
    protocols:
      - http
      - https

说明:

旧版本的模板示例中,会把应用名称 app 写到每个组件里,前提必须保证项目下所有组件的应用名称一致,后续不建议此使用方式。

目录