介绍
如果没有接触过函数计算可以先去官网了解一下,简单来说函数计算本身只包含函数执行功能,数据存储、文件存储、日志记录等需要使用阿里云的服务,通过 VPC 相关配置也可以实现访问 VPC 里的资源,比如自建的数据库。
为什么选择函数计算
我主要看中两点,稳定跟免费额度。
- 稳定是相比于在自己 VPS 上部署服务,而且有的服务比较简单,单独写应用没有必要。
- 免费额度,一般自己的 VPS 配置不高,部署不了太多服务。
目前(2021 年 9 月)函数计算的免费额度包含:每月 100 万次函数调用次数
+ 每月 40万(GB-秒)资源使用量
(执行时间、CPU 消耗、内存占用的量化),具体查看产品计费
使用场景
- 爬虫
- 反向代理
- 静态网站
- 简单 HTTP 服务
代码开发
官方支持多种语言开发,比如 node 是导出函数、Java 是实现 StreamRequestHandler 接口。
此外还支持自定义运行环境,自定义运行环境本质是用可执行文件 bootstrap
作为入口,运行后监听 0.0.0.0:CAPort
或 *:CAPort
, CAPort 从环境变量中获取。我的使用场景都是 HTTP 服务,使用的自定义运行环境方便使用任意语言开发,也方便迁移。
访问方式
函数计算可以绑定自己的域名(CNAME 方式),域名绑定后添加路由配置即可。
比如绑定的域名为 fun.dongfg.com
,有两个函数 fc1
,fc2
,可以添加路由 fun.dongfg.com/fc1 -> fc1
, example.com/fc2 -> fc2
。
为了后续自动部署方便,我是用的是泛域名绑定,*.fun.dongfg.com
,每个函数使用单独的三级域名绑定,fc1.fun.dongfg.com -> fc1
, fc2.fun.dongfg.com -> fc2
。
https 支持选择云盾里已有的证书,但是阿里云免费证书只支持单域名,我使用的自定义证书,证书通过 acme.sh
申请 Let's Encrypt
免费泛域名证书。
自动化部署流程
acme.sh 证书自动申请更新
通过 CI 自动执行,证书申请后上传到制品仓库,acme.sh 通过 docker 运行,证书通过 dns 方式申请,申请脚本 issue.sh
参考:
1 |
|
Jenkinsfile 参考(Coding.Net 的持续集成服务)
1 | pipeline { |
函数部署流程
- 代码包构建:构建出
bootstrap
执行文件及其他依赖 - ssl 证书下载:下载之前申请的证书文件,泛域名证书多个函数共用一个证书
- 函数部署:使用 Funcraft 或者新工具 Serverless Devs 部署
一些踩过的坑
为什么服务运行一会就停止了
函数不会一直运行,最长运行时间为限制为 10 分钟,如果函数长时间没有访问,实例会停止,下次访问会冷启动,所以无法实现定时任务,异步任务这类功能。
目录不可写导致服务无法启动
运行环境只有 /tmp
目录有可读写权限,需要把临时文件、日志这些写入目录配置到该处。
函数执行超时
函数默认执行最大时间为 3 秒,可适当加大配置。
运行环境中执行时报错 “permission denied” 导致服务无法启动
原因一般是打包出的 bootstrap
没有可执行权限。