#! https://zhuanlan.zhihu.com/p/397000004

Serverless Components 使用迁移到 Web 函数快速指南
前言
很多人对 Serverless 感兴趣,但是却不知道怎么入门
本篇文章,不提任何概念,简单粗暴的告诉大家使用和迁移的方法,
以期快速享受到 Web 函数 带来的诸多好处。
快速使用
一句话,无论我们使用什么框架,只要它提供 http 监听服务,我们就可以快速部署到 Web 函数 上。
安装环境
首先安装 nodejs,然后安装 @serverless/components
yarn global add @serverless/components
# or
npm i -g @serverless/components
在命令行中,执行 components -v 出现版本号,即安装成功。
全局配置
接着我们要配置腾讯云的 secretId , secretKey
登录腾讯云控制台 -> 访问管理 -> 访问秘钥 -> API密钥管理 创建并复制这 2 个之后
直接在命令行执行 components credentials -i ${secretId} -k ${secretKey},把${}占位符的换成你自己的 id 和 key
这个命令是在你的机器上创建部署的全局凭证,省的每个项目都要放个包含secretId,secretKey 环境变量的 .env 文件。
可以在你的用户根目录下的
.serverless/tencent/credentials里面看到全局配置
直接部署
这里以 nodejs 为例,我们不需要关心,到底使用的是哪个框架 express / koa / nestjs / nextjs / nuxtjs / fastify ... 还是原生 http 。
找到 nodejs 项目的入口文件,让这个应用去监听 9000 端口,代码部分就 ok 了。
然后在项目中创建 scf_bootstrap (没有后缀,换行用LF),写入
#!/bin/bash
export PORT=9000 # 告诉它你的应用提供http服务的端口
/var/lang/node12/bin/node path/to/your/listener.js # 告诉它你的应用的启动方法 `listener.js` 是一个路径
这个文件是 Web函数 的入口文件,用来告诉 Web函数,请求透传到哪个端口,以及怎么启动。
然后再在 scf_bootstrap 同级目录创建一个 serverless.yml 写入:
app: hello-web-function
stage: dev
component: scf # 注意这一行
name: hello-web-function-node12-app
inputs:
name: ${name}
region: ap-shanghai
runtime: Nodejs12.16
src:
src: ./
type: web # 注意这一行
handler: scf_bootstrap # 注意这一行
events:
- apigw:
parameters:
protocols:
- http
- https
environment: release
endpoints:
- path: /
method: ANY
function:
type: web # 注意这一行
然后,执行 components deploy 就部署成功了
可以在命令行中看到分配的网关地址,直接访问,就进入我们刚刚部署的项目里。
Web 函数 不限框架和语言,只要你告诉它一个监听端口,就可以直接上 serverless 去运行。
默认提供的环境
| 语言版本 | 绝对路径 |
|---|---|
Nodejs 10 | /var/lang/node10/bin/node |
Nodejs 12 | /var/lang/node12/bin/node |
Python 2 | /var/lang/python2/bin/python |
Python 3 | /var/lang/python3/bin/python3 |
PHP 5.6 | /var/lang/php5/bin/php |
PHP 7.2 | /var/lang/php7/bin/php |
Go 1 | /var/lang/go1/bin/go |
JAVA 8 | /var/lang/java8/bin/java |
这是目前 scf 默认提供的标准语言环境
不同语言编写的应用,我们只需要在 scf_bootstrap, 找到对应的语言版本后,把绝对路径替换一下就行。
比如:
#!/bin/bash
export PORT=9000
/var/lang/node12/bin/node path/to/your/listener.js # nodejs12
#!/bin/bash
export PORT=9000
/var/lang/python3/bin/python3 path/to/your/entry.py # python3
#!/bin/bash
/var/lang/php7/bin/php -c /var/runtime/php7 -S 0.0.0.0:9000 hello.php # php7
当然,假如你没有找到,你想使用的语言 (.Net Core,Rust), 或者是对标准环境下的版本感到不是很满意 (Nodejs14,16)
我们也可以自定义我们的一个运行时环境。
自定义运行时环境
出于篇幅限制,想了解一些更加进阶的知识,可以看之前写的一篇文章
旧框架的迁移
之前 Web 函数 没有出现的时候,我们往往使用 Event函数 + Http proxy 来实现相同的效果,现在就有了更优的解决方案。
对比
之前我们会在yml文件里显式声明我们的组件,如:
component: django
component: egg
component: nextjs
component: express
component: flask
component: koa
component: laravel
component: nestjs
component: thinkphp
component: nuxtjs
...
# instead
component: scf
在 Web 函数的时代,所有提供 Web 服务的组件都被统一了!
迁移第一步就是把组件更换成 component: scf
它使用 tencent-scf 这个组件,这意味着所有的 配置项 也被统一了!
原先 nodejs 组件,我们需要暴露一个 sls.js 并在里面导出一个app实例,Web函数 也不需要了,变为告诉它 我们的启动监听的入口文件。
同时配置文件也做了一些更改:
例如:
之前部署一个 koa scf函数 + api网关
app: appDemo
stage: dev
component: koa # 注意这一行
name: koaDemo
inputs:
region: ap-shanghai
runtime: Nodejs12.16
src:
src: ./
exclude:
- .env
functionConf:
name: ${name}
apigatewayConf:
protocols:
- http
- https
现在,同样的效果:
app: appDemo
stage: dev
component: scf # 注意这一行
name: koaDemo
inputs:
name: ${name}
region: ap-shanghai
runtime: Nodejs12.16
src:
src: ./
exclude:
- .env
type: web # 注意这一行
handler: scf_bootstrap # 注意这一行
events:
- apigw:
parameters:
protocols:
- http
- https
environment: release
endpoints:
- path: /
method: ANY
function:
type: web
可见 tencent-scf 组件和之前的组件的配置项,略有不同
它取消了 functionConf 的配置项,把它放入了 inputs 的第一级里。
原先我们的 apigatewayConf 配置项,现在也被转化成了 events 下的一个触发器。
# before:
apigatewayConf:
protocols:
- http
- https
# after:
events:
- apigw:
parameters:
protocols:
- http
- https
environment: release
endpoints:
- path: /
method: ANY
function:
type: web
当然配置项参数还是一致的。
总的来说,我们部署 web 应用的成本更低了。