此页面需要javascript支持,请在浏览器中启用javascript

Serverless Components 使用迁移到 Web 函数快速指南

Serverless Components
Web 函数
快速指南
共1392个字,阅读时间 7 分钟
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://icebreaker.top/articles/2021/8/5-how-to-migrate-web-func

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

Image

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 函数自定义镜像实战:构建图象处理函数

旧框架的迁移

之前 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

当然配置项参数还是一致的。

SCF 组件所有的配置项可以在这里被找到

总的来说,我们部署 web 应用的成本更低了。