前提条件
在开始项目开发之前,请确保您已经了解以下内容:
快速部署
账号和权限配置
开发流程
一个项目的开发上线流程大致如下:
初始化项目:将项目进行初始化。例如选择一些开发框架和模板完成基本的搭建工作。
开发阶段:对产品功能进行研发。可能涉及到多个开发者协作,开发者拉取不同的 feature 分支,开发并测试自己负责的功能模块;最后合并到 dev 分支,联调各个功能模块。
测试阶段:测试人员对产品功能进行测试。
发布上线:对于已完成测试的产品功能发布上线。由于新上线的版本可能有不稳定的风险,所以一般会进行灰度发布,通过配置一些规则监控新版本的稳定性,等到版本稳定后,流量全部切换到新版本。
环境隔离
在开发项目的每个阶段,我们都需要一个独立运行的环境来对开发的操作进行隔离。
在 serverless.yml 文件中定义 stage,并把 stage 作为参数写入到组件的资源名称中,部署时以
实例名 -{stage}- 应用名
的方式生成资源。这样我们在不同阶段只要定义不同的 stage 就可以生成不同的资源,达到环境隔离的目的。以 SCF 组件的 serverless.yml 为例:
# 应用信息app: myAppstage: dev # app环境名称,默认为dev# 组件信息component: scfname: scfdemo# 组件参数inputs:name: ${name}-${stage}-${app} #函数名称,以变量 ${stage} 作为资源名称的一部分src: ./handler: index.main_handlerruntime: Nodejs10.15region: ap-guangzhouevents:- http:parameters:netConfig:enableIntranet: trueenableExtranet: truequalifier: $DEFAULTauthType: NONE
云函数 name 定义为
${name}-${stage}-${app}
。开发测试阶段定义 stage 为
dev
,部署后云函数为 scfdemo-dev-myApp。上线发布阶段定义 stage 为
pro
,部署后云函数为 scfdemo-pro-myApp。不同阶段操作不同的云函数资源,从而达到开发与发布隔离的目的。
说明:
stage 可以直接在 serverless.yml 文件中定义,也可以通过
scf deploy --stage dev
直接传参。如您仍在使用 API 网关,请将
events
修改为:events:- apigw:parameters:endpoints:- path: /method: GET
权限管理
在开发项目中,需要对不同的人员进行权限分配和管理。例如对于开发人员,只允许其访问某个项目某个环境下的权限,可以参考 账号和权限配置,授予子账号 Serverless Cloud Framework 特定资源的操作权限。
以 myApp 项目 dev 环境为例,配置如下:
{"version": "2.0","statement": [{"action": ["scf:*"],"resource": "qcs::scf:ap-guangzhou::appname/myApp/stagename/dev", #app 为 myApp,stage 为 dev"effect": "allow"}]}
灰度发布
灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式 。为保证线上业务的稳定性,开发上线项目推荐使用灰度发布。
对比项 | 配置 | 流量规则设置 | 适用组件 |
默认别名 | 配置简单 | 只能在最后一次发布的函数版本和 $latest 版本间进行。 | 云函数组件 涉及云函数的相关组件 |
自定义别名 | 配置灵活 | 可以在两个任意函数版本间进行。 | 云函数组件 |
Serverless Cloud Framework 命令
说明:
serverless-cloud-framework
命令的简写为 scf
。初始化项目:
scf
下载模板项目 scf-starter,模板支持可通过 scf registry 查询:
scf init scf-starter
下载模板项目 scf-starter,并初始化该项目为 myapp:
scf init scf-starter --name my-app
部署应用:
scf deploy
部署应用,指定 stage 为 dev:
scf deploy --stage dev
部署应用,并打印部署信息:
scf deploy --debug
部署并发布函数版本:
scf deploy --inputs publish=trues
部署并切换20%流量到 $latest 版本:
scf deploy --inputs traffic=0.2