简介
每执行一次
scf deploy
,即部署一个 serverless 应用。一个 serverless 应用是由单个或者多个组件实例构成,每个组件对应一个实例。每个实例都会涉及一个 serverless.yml 文件,该文件定义了组件的一些参数,这些参数在部署时用于生成实例的信息。例如 region,定义了资源的所在区。
单实例应用与多实例应用在项目组织上会有一些差别,如下图所示:
![](https://qcloudimg.tencent-cloud.cn/image/document/c23569f76168f8f5afae44d1bcc2e93b.svg)
单实例应用
项目中只引入一个组件,部署时只生成一个组件实例,这样的应用为单实例应用。
单实例应用一般不需要关心应用名称配置,如果有需要自定义应用名称,可直接在组件的 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:- .envregion: ap-guangzhouruntime: Nodejs10.15functionName: ${name}-${stage}-${app} #云函数名称apigatewayConf:protocols:- http- httpsenvironment: release
yml 文件中配置信息:
应用信息
组件信息
参数 | 说明 |
component | 引用 component 的名称, scf registry 查询您可以引入的组件。 |
name | 创建的实例名称,每个组件在部署时将创建一个实例。 |
参数信息
inputs 下的参数为组件配置参数,不同的组件参数不同。为保证环境隔离,资源唯一,组件资源名称默认会采用
${name}-${stage}-${app}
格式。部署应用
单实例应用
serverless.yml 文件中不配置应用名称 app,部署时会默认生成与实例名称 name 相同的 app 应用名称。
例如创建一个 SCF 项目,项目目录如下:
scfDemo|- index.js└── serverless.yml
其中 serverless.yml 文件配置如下:
component: scfname: myscfinputs:src: ./runtime: CustomRuntimeregion: ap-guangzhoufunctionName: ${name}-${stage}-${app} #云函数名称events:- apigw:parameters:endpoints:- path: /method: GET
在 scfDemo 目录下执行
scf deploy
进行部署,默认将生成一个 app 为 myscf 的应用,该应用下包含一个叫 myscf 的 SCF 实例。对于单实例应用项目,一般使用默认应用名称即可。如果要自定义应用名称,可直接在 serverless.yml 中定义,如:
app: scfApp #自定义 app 为 scfAppcomponent: scfname: myscfinputs:src: ./runtime: CustomRuntimeregion: ap-guangzhouevents:- apigw:parameters:endpoints:- path: /method: GET
在 scfDemo 目录下执行
scf deploy
进行部署,将生成一个 app 为 scfApp 的应用,该应用下包含一个叫 myscf 的 SCF 实例。多实例应用
项目包含多个组件,必须给所有组件统一应用名称。一般我们会在项目根目录下定义一个 serverless.yml 文件进行应用名称配置。
例如部署 Vue + Express + PostgreSQL 全栈网站,项目目录如下:
fullstack|- api| |- scf.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: expressname: fullstack-apiinputs:src:src: ./exclude:- .envfunctionName: ${name}-${stage}-${app}region: ${env:REGION}runtime: Nodejs10.15functionConf:timeout: 30vpcConfig: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: trueprotocols:- http- https
说明:
旧版本的模板示例中,会把应用名称 app 写到每个组件里,前提必须保证项目下所有组件的应用名称一致,后续不建议此使用方式。